在Windows Phone's IE Touchstart事件在几秒钟后自动结束

On Windows Phone's IE Touchstart Event Ends Automatically After Few Seconds

本文关键字:几秒 结束 事件 Phone Windows Touchstart IE      更新时间:2023-09-26

我有一个非常具体的问题。我正在为手机写一个网页,上面有一个按钮。我在包括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;

我怀疑你遇到了多点触控问题…

请记住,触摸事件与鼠标事件不同。你可以用不止一个手指触摸。如果你用一根手指触摸,而不是用另一根手指?你得到两个连续的touchstart事件。touchend可能也是如此。我怀疑用户light是对的,它可能错误地触发了手指释放…

请看看你在监听器中获得的TouchEvent的touches, changedTouchestargetTouches属性发生了什么。我强烈怀疑你会看到还有一根"手指"在触摸……所以它从2个触摸变成了1个。

确保(不再)触摸的手指实际上是按在按钮上的手指等等,比以前的mouseupmousedown事件要简单得多。

编辑:我意识到你的问题是IE和它的指针事件…然而,它们的工作原理基本相同,因为它们也支持多点触控(因此可能会遇到同样的问题)。我没有看到类似于touches的属性,但我确实看到了pointerId,它可以为您提供相同的信息(以您端的一些记账为代价)。

这个MSDN页面有一些很好的信息。我认为这段代码很有启发性:

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

这似乎证实了,当一个手指碰到表面时,接触点得到一个ID,当您收到pointerup事件时,它用于通知您哪个手指离开了表面。

我会添加一些日志,只是在pointerdownpointerup上打印pointerId,我敢打赌你会很快找到你的解决方案。