我有一个非常具体的问题。我正在为手机写一个网页,上面有一个按钮。我在包括IE在内的每个浏览器上都检测到touchevent
,但在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;
但这也无济于事。
答案 0 :(得分:1)
我怀疑你遇到了多点触控问题......
请记住,触摸事件与鼠标事件不同。您可以使用多个手指触摸。如果用一根手指触摸而不是添加第二根手指会发生什么?您连续两次touchstart
次活动。 touchend
可能也是如此。我怀疑用户light
是正确的,它可能会错误地触发手指释放......
请查看您在听众中获得的TouchEvent touches
,changedTouches
和targetTouches
属性的内容。我强烈怀疑你会发现仍然有一个手指'离开了......所以它从2次接触到1次......
确保(不再)触摸手指实际上是按钮等上的那个手指比简单的旧mouseup
和mousedown
事件简单得多。
touches
的属性,但我确实看到了pointerId
,它可以为您提供相同的信息(以您的结尾记账为代价)。
This MSDN page有一些很好的信息。特别是这段代码片段我觉得很有启发性:
function pointerdownHandler(evt) {
evt.target.setPointerCapture(evt.pointerId);
}
这似乎证实,当手指触及表面时,接触点会获得一个ID,用于在收到pointerup
事件时通知您哪个手指离开了表面。
我添加了一些仅在pointerId
和pointerdown
上打印pointerup
的日志记录,我打赌您很快就会找到解决方案。