Подтвердить что ты не робот

В Windows Phone IE Touchstart Event заканчивается автоматически через несколько секунд

У меня очень специфическая проблема. Я пишу веб-страницу для мобильных телефонов, на которой есть кнопка. Я обнаруживаю touchevent в каждом браузере, включая IE, но в IE это довольно специфично. Через несколько секунд он автоматически завершается. Можете ли вы как-то помочь мне? Вот мой код (измененный, но все еще не работает должным образом):

if (window.navigator.pointerEnabled) {
    tapButton.addEventListener("pointerup", function(e) {
        e.preventDefault();
        addClass(this, 'clicked');
        buttonTouched = true;
    }, false);
    tapButton.addEventListener("pointerdown", function(e) {
        e.preventDefault();
        removeClass(this, 'clicked');
        buttonTouched = false;
    }, false);
    alert("pointerEnabled");
}
else if (window.navigator.msPointerEnabled) {
    tapButton.addEventListener("MSPointerDown", function(e) {
        e.preventDefault();
        addClass(this, 'clicked');
        buttonTouched = true;
    }, false);
    tapButton.addEventListener("MSPointerUp", function(e) {
        e.preventDefault();
        removeClass(this, 'clicked');
        buttonTouched = false;
    }, false);
    alert("mspointerEnabled");
}
else {
    alert("ordinary touch");
    tapButton.addEventListener('touchstart', function(e) {
        e.preventDefault();
        addClass(this, 'clicked');
        buttonTouched = true;
    }, false);
    tapButton.addEventListener('touchend', function(e) {
        e.preventDefault();
        removeClass(this, 'clicked');
        buttonTouched = false;
    }, false);
}

И в нем есть тег html:

-ms-touch-action: none !important;
touch-action: none !important;

но это тоже не помогает.

4b9b3361

Ответ 1

Я подозреваю, что вы сталкиваетесь с проблемой multi-touch...

Помните, что события касания не совпадают с событиями мыши. Вы можете касаться пальцами. Что произойдет, если вы коснетесь одним пальцем, чем добавьте второй палец? Вы получаете два последовательных события touchstart. То же самое, вероятно, верно для touchend. Я подозреваю, что пользователь light прав, что он, вероятно, неправильно запускает отпечаток пальца...

Пожалуйста, посмотрите, что происходит с touches, changedTouches и targetTouches свойствами TouchEvent. входите в своего слушателя. Я сильно подозреваю, что вы увидите, что все еще есть "палец", касающийся касания... Так что это было от 2 касаний до 1...

Удостоверившись, что трогательный палец (более не) - это тот, который на кнопке и т.д. намного проще, чем старые старые события mouseup и mousedown.

EDIT: Я понимаю, что ваша проблема связана с IE и событиями указателя... Однако они работают в основном тем же, что и они поддерживают мультитач (и могут, таким образом, вызывать те же проблемы). Я не вижу свойство, похожее на touches, но я вижу pointerId, который может дать вам ту же информацию (за счет некоторой бухгалтерии на вашем конце).

Эта страница MSDN содержит некоторую полезную информацию. Особенно этот фрагмент кода является просветляющим, я думаю:

function pointerdownHandler(evt) {
      evt.target.setPointerCapture(evt.pointerId);
}

Это, по-видимому, подтверждает, что, когда палец попадает на поверхность, точка контакта получает идентификатор, который используется для информирования вас о том, какой палец покинул поверхность, когда вы получаете событие pointerup.

Я бы добавил несколько журналов, которые просто печатают pointerId на pointerdown и pointerup, и я готов поспорить, что вы быстро найдете свое решение.