javascript – 在使用触摸和鼠标(例如Surface)的设备上聆听mousedown和touchstart

前端之家收集整理的这篇文章主要介绍了javascript – 在使用触摸和鼠标(例如Surface)的设备上聆听mousedown和touchstart前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > How to bind ‘touchstart’ and ‘click’ events but not respond to both?33
所以,在Microsoft Surface的Web应用程序工作时遇到一个有趣的问题.

我想为用户与DOM元素交互时添加事件侦听器.现在我可以做:

if ('ontouchstart' in document.documentElement) {
  //Attach code for touch event listeners
  document.addEventListener("touchstart" myFunc,false);
} else {
  //Attach code for mouse event listeners
  document.addEventListener("mousedown" myFunc,false);
}

如果设备没有鼠标输入,这个问题会很简单,上面的代码可以正常工作.但是Surface(和许多新的Windows 8电脑)都有一个触摸和鼠标输入.所以上述代码只能在用户触摸设备时起作用.鼠标事件侦听器永远不会被附加.

那么我以为我可以这样做:

if ('ontouchstart' in document.documentElement) {
  //Attach code for touch event listeners
  document.addEventListener("touchstart" myFunc,false);
}
//Always attach code for mouse event listeners
document.addEventListener("mousedown" myFunc,false);

不支持触摸的设备不会附加事件,但使用触摸的设备将注册其处理程序.这个问题是,myFunc()将在触摸设备上被调用两次:

>“touchstart”引发时,myFunc()将触发
>因为触摸浏览器通常会经历周期touchstart – > touchmove – > touchend – > mousedown – > mousemove – > mouseup – >点击,myFunc()将再次被调用在“mousedown”

我考虑过添加代码tomyFunc(),以便它调用e.preventDefault(),但这似乎也阻止touchend以及mousedown / mousemove / mouseup在某些浏览器(link).

我讨厌做用户嗅探器,但似乎触摸浏览器在触摸事件的实现方面有变化.

我必须缺少一些东西,因为这似乎确实这些JavaScript实现是由浏览器支持鼠标和触摸的可能性决定的!

解决方法

对于Windows 8,您可以使用“MSPointerDown”事件.
if (window.navigator.msPointerEnabled) {
     document.addEventListener("MSPointerDown" myFunc,false);
 }

添加以下您的风格:

html { 
    -ms-touch-action: none; /* Direct all pointer events to JavaScript code. */
  }

有关更多信息,请参阅http://msdn.microsoft.com/en-us/library/ie/hh673557(v=vs.85).aspx.

原文链接:https://www.f2er.com/js/153859.html

猜你在找的JavaScript相关文章