2015-06-04 40 views
38

我有一个非常具体的问题。我正在编写一个手机网页,上面有一个按钮。我在包括IE在内的每个浏览器上都检测到touchevent,但在IE上它非常具体。几秒钟后,它会自动结束。你能以某种方式帮助我吗?这里是我的代码(修改之一,但仍无法正常工作):在Windows Phone的IE 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是正确的,它可能触发手指释放错误......

请看看发生了什么,你在你的听众得到TouchEventtoucheschangedTouchestargetTouches性能。我强烈怀疑你会发现仍然有“手指”左触摸......因此,从2个触摸去1 ...

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

编辑:我明白你的问题是与IE浏览器,它的指针事件......然而他们的工作大多是相同的,他们也支持多点触摸(因此可能遭受同样的问题)。我没有看到类似于touches的财产,但我确实看到一个pointerId,它可以给你相同的信息(以一些簿记为代价)。

This MSDN page有一些好的信息。特别是该代码段有启发,我认为:

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

这似乎证实,当手指碰到面,接触点获取的ID,它是用来告诉你,当你收到这手指留在表面pointerup事件。

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