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

标签 javascript windows-8 touch

<分区>

因此,我在为 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()将在触摸设备上调用两次:

  1. myFunc()触发“touchstart”时触发
  2. 因为触摸浏览器通常会经历 touchstart -> touchmove -> touchend -> mousedown -> mousemove -> mouseup -> click, myFunc()将在“mousedown”中再次调用

我考虑过将代码添加到 myFunc()这样它就调用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了解更多信息。

关于javascript - 在使用触摸和鼠标的设备(例如 Surface)上收听 mousedown 和 touchstart,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14406161/

相关文章:

javascript - 标记字段选择 e 取消选择 : how to add and remove dinammicaly fieldcontainers to form

c# - 当一个人更喜欢使用 JavaScript 而不是 C# 来编写 Windows8 应用程序时,它是否会带来性能或可访问性优势?

java - libgdx - 检查 body 是否被触摸

javascript - 有没有办法使用 javascript 预加载视频?

javascript - 错误 : A React component suspended while rendering, 但未指定后备 UI

c++ - 如何使用 C++ 以编程方式检测 Windows 8 中是否启用了 UAC?

.net - WinRT、Javascript 和随机 "Access denied"异常

android - 如何通过触摸聆听绘制多个圆圈?

c++ - 如何为 Qt 应用程序重新校准触摸事件?

javascript - TinyMCE编辑器。按钮不显示