简短回答:您的测试现在可以在任何当前的 Chrome 中再次运行。但可能不会永远。
长答案:
Chrome 团队希望将触摸事件添加到桌面浏览器中,因为具有触摸功能的屏幕的桌面越来越多。所以他们做到了——可能是在 Canary 24.0 左右的时候。然后他们发现很多人都在做你正在做的事情来“检测触摸设备”。这样做的问题是您只测试浏览器是否支持触摸事件,而不是设备(同样适用Modernizr.touch
)。更具体地说,只是W3C/Apple TouchEvents API。
他们不想为触摸/非触摸提供不同版本的 Chrome,所以他们做到了,因此只有在启动时检测到触摸设备时才启用触摸 API(在此处讨论:http ://code.google.com /p/chromium/issues/detail?id=152149)。
因此,现在您的测试将再次起作用......但是- 如果您想为自己提供未来证明,您可能需要改变您的方法。原因如下:
并非所有浏览器都会像 Chrome 那样执行此切换。
触控功能正在成为一项动态功能:使用 Microsoft Surface 等,您可以从键盘和鼠标上拔下并只进行触控,用户可能通过 KVM 开关连接了触控显示器,在启动时不会被检测到,等等。浏览器供应商不会想要让 API 出现和消失——那将是一场噩梦——所以在某些时候,Chrome 家伙可能会在所有设备上永久启用 TouchEvents API。该测试将再次开始抛出“误报”。
相反,请查看PointerEvents API,它为鼠标、触摸和触控笔输入提供了一个通用事件接口。如果您正在考虑为触摸界面等制作更大的按钮,那么还有一个指针媒体查询规范(和一个悬停规范),它将很快出现在浏览器中 - 这区分了输入设备的不同精度none
- / coarse
/ fine
- 并且是动态的将允许您根据连接的指针设备调整样式,因为它们已连接/断开连接。很酷。
Modernizr v3.0(在接下来的几周内发布)将在此处进行一些相关更改:
- 正在添加对 PointerEvents API 的检测
Modernizr.touch
正在重命名Modernizr.touchevents
以更好地代表它的含义
所以我会考虑在可用的情况下使用 PointerEvents(它已经在 IE10 中),Modernizr.touchevents
如果没有,则回退到开关。