使用 JavaScript 检测“触摸屏”设备的最佳方法是什么?

IT技术 javascript jquery touch
2021-01-30 08:36:20

我编写了一个可在桌面和移动设备上使用的 jQuery 插件。我想知道是否有一种方法可以使用 JavaScript 来检测设备是否具有触摸屏功能。我正在使用 jquery-mobile.js 来检测触摸屏事件,它适用于 iOS、Android 等,但我还想根据用户的设备是否有触摸屏来编写条件语句。

那可能吗?

6个回答

2021 年更新

要查看旧答案:检查历史记录。我决定从头开始,因为在帖子中保存历史时它已经失控了。

我最初的回答说,使用与 Modernizr 相同的功能可能是个好主意,但这不再有效,因为他们删除了此 PR 上的“touchevents”测试:https : //github.com/Modernizr/Modernizr /pull/2432因为它是一个令人困惑的主题。

话虽如此,这应该是一种检测浏览器是否具有“触摸功能”的相当不错的方法:

function isTouchDevice() {
  return (('ontouchstart' in window) ||
     (navigator.maxTouchPoints > 0) ||
     (navigator.msMaxTouchPoints > 0));
}

但是对于更高级的用例,比我写过的关于这个主题的人更聪明,我建议阅读这些文章:

这不适用于 Opera Mobile 10 或 Internet Explorer Mobile 6 (Windows Mobile 6.5)。
2021-03-12 08:36:20
'onmsgesturechange'即使在非触摸设备 (PC) 中,评估结果也为 true。 window.navigator.msMaxTouchPoints似乎更准确。 在这里找到了
2021-03-15 08:36:20
双 NOT (!!) 是多余的,因为in运算符已经计算为布尔值。
2021-03-31 08:36:20
双 bang 将一个值转换为布尔值,强制函数返回truefalse您可以在此处阅读更多相关信息:stackoverflow.com/questions/4686583/...
2021-04-05 08:36:20
尽管我的屏幕没有触摸传感器,但它在 Windows 8 上的 IE10 上评​​估为 true。我将旧笔记本电脑从 Windows 7 升级到 Windows 8。
2021-04-06 08:36:20

更新:在将整个特征检测库拉入您的项目之前,请阅读下面的blmstr 答案检测实际触摸支持更为复杂,Modernizr 仅涵盖基本用例。

Modernizr是一种很棒的轻量级方法,可以在任何站点上进行各种功能检测。

它只是为每个功能的 html 元素添加类。

然后,您可以在 CSS 和 JS 中轻松定位这些功能。例如:

html.touch div {
    width: 480px;
}

html.no-touch div {
    width: auto;
}

和 Javascript(jQuery 示例):

$('html.touch #popup').hide();
Modernizr 不测试触摸屏。它测试浏览器中是否存在触摸事件。请参阅文档中的“其他测试”部分:modernizr.com/docs/#features-misc
2021-04-06 08:36:20

由于 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改用。

有关更多信息,请查看此处:检测浏览器没有鼠标并且仅触摸

这是目前最好的解决方案,谢谢!虽然我建议使用,(pointer: coarse)因为您很可能只针对主要输入。可以在生产中使用,因为少数不支持的浏览器仅适用于桌面。在 css-tricks 上有一篇很棒的文章
2021-03-23 08:36:20

使用上面的所有评论,我已经组装了以下代码,以满足我的需要:

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 上失败,我还没有找到适用于该浏览器的解决方案。

希望有人觉得这很有用。

>>> 窗口中的“ontouchstart” >>> ubuntu 上的真 FF 51.0.1
2021-03-13 08:36:20
true在我的 Firefox 32 上返回Windows 7 :(
2021-03-17 08:36:20
Windows 8 上的 Firefox 33 和 33.1 在我的系统上都正确显示 false。如果您将 Firefox 升级到最新版本,它仍然返回 true 吗?您的机器上是否安装了可能使 Firefox 错误地认为您的机器具有触摸功能的设备?
2021-03-21 08:36:20
有什么理由不能使用:function is_touch_device() { return !!('ontouchstart' in window) || !!(导航器中的'msmaxtouchpoints'); };
2021-03-28 08:36:20
使用该函数会起作用,但我通常喜欢使用上面的变量方法,因此它只被测试一次,并且在我稍后检查我的代码时会更快。此外,我发现我需要测试 msMaxTouchPoints 是否大于 0,因为没有触摸屏的 Windows 8 上的 IE 10 作为 msMaxTouchPoints 返回 0。
2021-04-08 08:36:20