如何使用JS / jQuery检查浏览器是否支持touchstart?

How to check browser for touchstart support using JS/jQuery?

提问人:Alex 提问时间:5/27/2010 更新时间:2/19/2018 访问量:75024

问:

为了遵循最佳实践,我们尝试根据您使用的设备使用正确的 JavaScript/jQuery 事件。例如,我们正在构建一个移动网站,该网站的代码将具有 onclick 或 touch 事件。对于 iPhone,我们希望使用“touchstart”事件。我们想在将该处理程序绑定到对象之前测试他们的设备是否支持“touchstart”。如果没有,那么我们将绑定“onclick”。

最好的方法是什么?

javascript jquery iphone mobile unobtrusive-javascript

评论


答:

100赞 Christian C. Salvadó 5/27/2010 #1

您可以检测该事件是否受以下支持:

if ('ontouchstart' in document.documentElement) {
  //...
}

看看这篇文章:

那里发布的函数非常擅长检测各种事件,而且它是跨浏览器的。isEventSupported

评论

1赞 Andy E 5/27/2010
我有点想+1这个,但我知道Firefox会因为错误的原因回到这里。Firefox 以这种方式检查的所有事件都返回 false(我知道,这是 Fx 糟糕的罕见情况之一)。不过,这篇文章确实谈到了这一点,所以你得到了你的 +1 ;-)false
18赞 RobG 8/14/2012
这仅检测浏览器是否支持触摸事件,而不会确定设备是否支持触摸事件。在非触摸设备上的 Chrome 中尝试此操作。
1赞 Jondlm 9/21/2013
这和吗?document.documentElement.hasOwnProperty('ontouchstart')
0赞 abelito 11/19/2013
@Andy E:现在看起来可以工作了。Firefox 版本 18.0.0.4752 在我的桌面上使用 ontouchstart (false) 和 onclick (true) 进行测试后似乎支持此功能。
3赞 Nick 7/1/2014
@RobG我在非触摸笔记本电脑上的Chrome 35.0.1916.153 m中运行了它,并得到了,正如预期的那样。我错过了什么吗?false
3赞 antimatter15 5/27/2010 #2

您可以检查是否回退到正常的 dom 事件typeof document.body.ontouchstart == "undefined"

1赞 Manuel Ignacio López Quintero 5/12/2011 #3

我做了一个完整的演示,可以在每个浏览器中使用解决此问题的完整源代码:在 Javascript 中检测触摸屏设备

评论

0赞 Nilpo 2/18/2018
您的示例会产生大量误报。默认情况下,有许多浏览器实现了触摸 API,无论触摸设备是否实际连接到系统。
0赞 Manuel Ignacio López Quintero 3/3/2018
@Nilpo 也许你是对的。这篇文章写于七年多前。
12赞 George Filippakos 1/14/2013 #4

使用此代码检测设备是否支持触摸。

也适用于使用“MSPointerDown”事件而不是“touchmove”的 Windows 8 IE10

var supportsTouch = false;
if ('ontouchstart' in window) {
    //iOS & android
    supportsTouch = true;

} else if(window.navigator.msPointerEnabled) {

    // Windows
    // To test for touch capable hardware 
    if(navigator.msMaxTouchPoints) {
        supportsTouch = true;
    }

}

评论

3赞 Michael Lumbroso 1/10/2017
为什么不把它简化为一句话呢?var supportsTouch = ('ontouchstart' in window || window.navigator.msPointerEnabled)
0赞 Swiss Mister 2/9/2017
不幸的是,这对我来说不适用于 HP 笔记本电脑(无触摸屏)上 Windows 10 上的 ie 11。它错误地说 supportsTouch = true。但是当我将某些内容绑定到“touchstart”时,它永远不会被执行。有什么办法解决这个问题吗?
0赞 Nilpo 2/18/2018
这是错误的。指针 API 不仅适用于触摸设备。它适用于几乎所有的输入设备。
0赞 George Filippakos 2/19/2018
修改了用于检查 msMaxTouchPoints 的答案(触摸支持测试)