我正在重构其他人写的代码。有使用的功能:
!!('ontouchstart' in window)
我在其他项目中看到过这种情况:https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touchevents.js#L40 并在Stackoverflow中回答:https://stackoverflow.com/a/4819886/1127635
但似乎它可能比其他选择更慢:http://jsperf.com/hasownproperty-vs-in-vs-undefined/12
那么为什么要使用这种可能更慢的替代品?哪些浏览器不支持其他解决方案?
答案 0 :(得分:4)
您的两种替代测试都存在某些缺陷:
window.ontouchstart !== null
测试非null
侦听器。测试ontouchstart
的值是一种冒险的方法,因为库或其他代码可能会更改ontouchstart
的值。测试价值是一种糟糕的方法;测试物业本身的存在会更好,这会将我们带到你的下一个测试中......
window.hasOwnProperty('ontouchstart')
测试window
对象是否有自己的ontouchstart
属性。在某些浏览器中(我刚刚在Chrome 37和IE9上确认了这一点),window
没有拥有自己的on
- 事件属性;相反,它们是window.__proto__
的属性。
我们不应该测试一个值(因为之前的代码可能在我们运行代码之前更改了值)并且我们无法测试window
自己的属性,因为浏览器的实现不同其中事件监听器属性存在于window
的原型链中。因此,我们最一致的选择是在window
的原型链中的任何地方测试属性是否存在(无论值是什么)。这正是我们对in
运算符所做的。
当然,如果其他人的代码在我们的测试之前运行,他们可以添加一个ontouchstart
属性,而最初没有。简单地测试对事件的支持是不可能的,这是一个非常糟糕的事情。