为什么' ontouchstart'在窗口"大多数浏览器支持"?

时间:2014-09-02 11:54:41

标签: javascript dom

我正在重构其他人写的代码。有使用的功能:

!!('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

那么为什么要使用这种可能更慢的替代品?哪些浏览器不支持其他解决方案?

1 个答案:

答案 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属性,而最初没有。简单地测试对事件的支持是不可能的,这是一个非常糟糕的事情。