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

时间:2015-06-04 15:27:49

标签: javascript internet-explorer windows-phone touchstart

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

但这也无济于事。

1 个答案:

答案 0 :(得分:1)

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

请记住,触摸事件与鼠标事件不同。您可以使用多个手指触摸。如果用一根手指触摸而不是添加第二根手指会发生什么?您连续两次touchstart次活动。 touchend可能也是如此。我怀疑用户light是正确的,它可能会错误地触发手指释放......

请查看您在听众中获得的TouchEvent toucheschangedTouchestargetTouches属性的内容。我强烈怀疑你会发现仍然有一个手指'离开了......所以它从2次接触到1次......

确保(不再)触摸手指实际上是按钮等上的那个手指比简单的旧mouseupmousedown事件简单得多。

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

This MSDN page有一些很好的信息。特别是这段代码片段我觉得很有启发性:

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

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

我添加了一些仅在pointerIdpointerdown上打印pointerup的日志记录,我打赌您很快就会找到解决方案。