【问题标题】:('ontouchstart' in window) returns true but no touch events('ontouchstart' in window) 返回 true 但没有触摸事件
【发布时间】:2012-07-16 13:55:04
【问题描述】:

我正在尝试编写可以在浏览器中运行或作为 phonegap 应用程序运行的代码。 我需要做的一件事是确定我是否处于支持触摸事件的环境中。

我当前的问题是我的 Chrome (20.0.01132.47 m) 为 ('ontouchstart' in window) 返回 true 但它不会触发触摸事件。

当我打开开发者工具设置对话框(开发者工具右下角的齿轮图标)时。我可以选择“模拟触摸事件”。当我选中此选项时,浏览器会触发触摸事件。但是当它未被选中时,它不会触发事件,但我使用的检测仍然表明触摸事件可用。

我可以通过脚本判断是否启用了“模拟触摸事件”吗?

基于 JQuery 的答案很好。

【问题讨论】:

标签: javascript html jquery cordova dom-events


【解决方案1】:

我可以通过脚本判断是否启用了“模拟触摸事件”吗?

尝试检查不止一根手指 ;-)

也许这有帮助?

window.addEventListener('touchstart', function(event) {
    var emulate = event.targetTouches.length == 2;
    alert(emulate ? true : false);
}, false);

顺便说一句: 'ontouchstart' in window 会产生 false (chrome v21.0.1180.60),除非您关闭开发者工具栏。

Fiddle

【讨论】:

  • 我不确定这应该如何提供帮助。如果touchstart 没有被触发,则无论如何都不会调用此代码。也许我的 Q 不够清楚 - 我并不是想区分模拟的触摸事件和“真实”的触摸事件。我想知道是否支持 touchEvents。
  • 为什么不创建一个最初设置为 false 的全局标志。在 ontouch 事件处理程序中将标志设置为 true。因此,如果事件触发,标志将设置为 true,并且您知道设备支持触摸
  • @VimilSaju 但是您无法检测到在 emulated 事件期间是否调用了 event-handler-function,在这种情况下是 chromes Emulate touch events-特征。因此全局标志将在所有设备上更改,即使在桌面版 chrome 上也是如此。
  • @yckart 但如果打开了模拟触摸事件,则用户出于特定原因故意将其打开。这与模拟不同用户代理的浏览器(或试图确定它是在 VM 还是真机上运行的应用程序 - 很少有应用程序想知道这一点)不同吗?为什么任何网站都想知道触摸事件是否被模拟?如果浏览器说支持触摸事件就足够了,如何提供支持(通过仿真或实际硬件支持)应该与站点无关。
  • 是的,你完全正确。但是,这不会回答他的问题;)
【解决方案2】:

js的最佳方式:

function is_touch_device() {
    return 'ontouchstart' in window || navigator.maxTouchPoints;
}
console.log(is_touch_device())

【讨论】:

    猜你喜欢
    • 2016-03-02
    • 1970-01-01
    • 2019-05-19
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 2012-06-30
    相关资源
    最近更新 更多