我编写了一个可在桌面和移动设备上使用的 jQuery 插件。我想知道是否有一种方法可以使用 JavaScript 来检测设备是否具有触摸屏功能。我正在使用 jquery-mobile.js 来检测触摸屏事件,它适用于 iOS、Android 等,但我还想根据用户的设备是否有触摸屏来编写条件语句。
那可能吗?
我编写了一个可在桌面和移动设备上使用的 jQuery 插件。我想知道是否有一种方法可以使用 JavaScript 来检测设备是否具有触摸屏功能。我正在使用 jquery-mobile.js 来检测触摸屏事件,它适用于 iOS、Android 等,但我还想根据用户的设备是否有触摸屏来编写条件语句。
那可能吗?
2021 年更新
要查看旧答案:检查历史记录。我决定从头开始,因为在帖子中保存历史时它已经失控了。
我最初的回答说,使用与 Modernizr 相同的功能可能是个好主意,但这不再有效,因为他们删除了此 PR 上的“touchevents”测试:https : //github.com/Modernizr/Modernizr /pull/2432因为它是一个令人困惑的主题。
话虽如此,这应该是一种检测浏览器是否具有“触摸功能”的相当不错的方法:
function isTouchDevice() {
return (('ontouchstart' in window) ||
(navigator.maxTouchPoints > 0) ||
(navigator.msMaxTouchPoints > 0));
}
但是对于更高级的用例,比我写过的关于这个主题的人更聪明,我建议阅读这些文章:
由于 Modernizr 在 Windows Phone 8/WinRT 上没有检测到 IE10,一个简单的跨浏览器解决方案是:
var supportsTouch = 'ontouchstart' in window || navigator.msMaxTouchPoints;
您只需要检查一次,因为设备不会突然支持或不支持触摸,所以只需将其存储在一个变量中,这样您就可以更有效地多次使用它。
由于引入了交互媒体功能,您可以简单地执行以下操作:
if(window.matchMedia("(pointer: coarse)").matches) {
// touchscreen
}
https://www.w3.org/TR/mediaqueries-4/#descdef-media-any-pointer
更新(由于评论):上述解决方案是检测“粗指针”(通常是触摸屏)是否是主要输入设备。如果您想检测带有鼠标的设备是否也有触摸屏,您可以any-pointer: coarse
改用。
有关更多信息,请查看此处:检测浏览器没有鼠标并且仅触摸
使用上面的所有评论,我已经组装了以下代码,以满足我的需要:
var isTouch = (('ontouchstart' in window) || (navigator.msMaxTouchPoints > 0));
我已经在 iPad、Android(浏览器和 Chrome)、Blackberry Playbook、iPhone 4s、Windows Phone 8、IE 10、IE 8、IE 10(带触摸屏的 Windows 8)、Opera、Chrome 和 Firefox 上对此进行了测试。
它目前在 Windows Phone 7 上失败,我还没有找到适用于该浏览器的解决方案。
希望有人觉得这很有用。