2015-06-04 4 views
38

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

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; 

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

+4

Вы не сказали, какую версию IE вы видите, но я вижу, что вы обнаруживаете префиксные события поставщика перед событиями, отличными от префикса. На https://msdn.microsoft.com/en-us/library/windows/apps/dn263112.aspx#document_object_model__dom__improvements префиксные версии устарели и должны использоваться только тогда, когда версии с префиксом недоступны. Возможно, переупорядочивание вещей поможет. Префиксные версии в какой-то момент перестанут работать. –

+0

Я пытался исправить проблему с префиксами поставщика, но это не помогло :(У меня был только один без префиксов, и он действовал одинаково :(любые другие предложения? – gogachinchaladze

+0

Добавить фрагмент рабочего кода, пожалуйста, не можете понять ваши проблема –

ответ

1

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

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

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

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

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

This MSDN page имеет хорошую информацию. Особенно этот фрагмент кода поучительный Я думаю:

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

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

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