我正在使用下面的代码来绑定“click”或“touchstart”事件(使用 jQuery 的on(eventType, function() { ... })
)。
var what = (navigator.userAgent.match(/iPad/i)) ? 'touchstart' : 'click';
稍后的:
$foo.on(what, function() { ... });
...这适用于 iPad 和“其他一切”,但我担心上面的代码有“iPad 隧道视野”...
我的问题:
所有其他设备(例如,Android 平板电脑)是否具有类似命名的“touchstart”事件?如果是这样,我该如何改进上面的代码,以便我可以解释这些事件类型?
换句话说,我怎样才能在上面的代码中解释更广泛的触摸设备(不仅仅是 iPad)?
编辑#1
大家对此怎么看:
var foo = ('ontouchstart' in window) ? 'touchstart' : ((window.DocumentTouch && document instanceof DocumentTouch) ? 'tap' : 'click');
注意:以上大部分逻辑来自 Modernizr here。
以上似乎适用于 Firefox/iPad ......目前我没有太多要测试的东西。
我喜欢上面的内容是我不是 UA 嗅探。:)
对所有其他触摸设备来说都是tap
一个好的默认值吗?
编辑#2
这里有一些有趣的信息,链接到这个:
确实不是一个直接的答案,但提供了开发人员在面对多个平台和设备的点击相关事件时所面临的情况的很多细节。
编辑#3
这里也有一些很好的信息:
Android 和 iPhone 触摸事件
Android 和 iPhone 版本的 WebKit 有一些共同的触摸事件:
touchstart - triggered when a touch is initiated. Mouse equivalent - mouseDown touchmove - triggered when a touch moves. Mouse equivalent - mouseMove touchend - triggered when a touch ends. Mouse equivalent - mouseUp. This one is a bit special on the iPhone - see below touchcancel - bit of a mystery
看完之后,我想我会把上面的代码改成这样:
var foo = (('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)) ? 'touchstart' : 'click';
当我第一次问我的问题时——除了 iPad/iPhone 之外无法访问任何东西——我认为touchstart
这是一个 iOS 特定的事件;它现在看起来touchstart
并且click
将涵盖大部分(如果不是全部)触摸设备的基础。
2014 年 8 月更新:
如果有任何帮助,我在这里发布了一些实用程序类:
-
[no-js] [no-touch] JavaScript 实用程序,用于放入将添加的 HTML 模板
js
或touch
用于 CSS 和/或 JS 的类。