我怎样才能检查浏览器上的真正的触摸支持

今天(或最近)Chrome Beta版本已经更新到了17版本,并且在我的网页应用程序中我注意到了一些funkiness。 我注意到这是因为一个类被添加到body元素,通常只有在有触摸事件支持的情况下才会被放到那里,我这样检查:

try { document.createEvent("TouchEvent"); _device.touch = true; } catch (e) { _device.touch = false; } 

当然,我可以在Chrome 17上创build和触发触摸事件。首先,我的想法是,我可以检查触摸,看看鼠标单击失败,因此,有一个鼠标,但MouseEvents也触发。

如果没有用户代理嗅探,我还能如何检查它是一个真实的,可触摸的设备,而不仅仅是支持触摸事件的浏览器。

尝试:

 'ontouchstart' in document.documentElement 

不是因为浏览器“支持触摸”,你可能不想改变行为。 例如。 Windows上的Chrome现在支持触摸,尽pipe不一定会附加触摸屏。 即使安装了触摸屏,用户也不一定使用它,所以您需要小心改变。

所以这真的归结为什么你想知道:

  1. 你想知道你是否会得到touchstart / touchmove / touchend事件:确实没有办法事先知道这一点。 例如。 用户可以在加载页面后插入触摸屏。 如果你可能对这些事件感兴趣,你应该听取他们的意见。

  2. 你想知道你是否应该显示你的网站的“移动”版本用户是否有触摸支持不是正确的信号 – 例如。 有触摸屏的Windows用户可能不想要你的移动网站。 您可以使用UserAgent heurstics,但请给用户一个粘性的方式来切换您的网站的版本。

  3. 你想知道你是否应该调整你的用户界面,使其对触摸input更友好。例如,如果用户可能使用触摸,那么可能有些button应该更大。 总的来说,最好总是devise多个指针types – 毕竟,当他们同时拥有触摸和鼠标时,你无法知道用户的指针偏好。 但是,如果你真的想要使用可用的指针硬件知识作为最好的UI折衷,那么你可以使用新的CSS媒体查询:

我在Chrome 21(crbug.com/123062)中为Chrome添加了部分支持。 据我所知,没有其他浏览器支持他们呢。

 ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch 

容易,不要。 如果您正确地devise网站,testing它的唯一有效的理由是非触摸式浏览器,特别是旧版浏览器,不会丢失错误,并且根据您如何实现触摸事件,这可能不是一个问题(他们只是不会触发),但是当使用像hammer.js这样的库时,你需要创build一个锤子对象的实例,在像IE 8这样的老式浏览器中会抛出一个错误,简单的解决方法是简单地try和catch语句中的代码:

 try { var Hammer = new HAMMER(); } catch (err) { 'do what ever or do nothing, does not support touch or won't work at least anyway' } 

在这将允许所有其他JavaScript代码继续。