代码之家  ›  专栏  ›  技术社区  ›  conradkleinespel

为什么“大多数浏览器都支持”窗口中的“ontouchstart”?

  •  2
  • conradkleinespel  · 技术社区  · 11 年前

    我正在重构其他人编写的一些代码。有一个函数使用:

    !!('ontouchstart' in window)
    

    我在其他项目中也看到过: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touchevents.js#L40 在Stacksoverflow回答中: https://stackoverflow.com/a/4819886/1127635

    但它似乎比其他选择要慢: http://jsperf.com/hasownproperty-vs-in-vs-undefined/12

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

    1 回复  |  直到 11 年前
        1
  •  5
  •   apsillers    11 年前

    您的两个备选测试都存在某些缺陷:

    • window.ontouchstart !== null 非- null 听众。测试的值 ontouchstart 是一种危险的方法,因为库或其他代码可能会更改 无接触起动 。测试值是一种糟糕的方法;测试财产本身的存在会更好,这将使我们进行下一次提议的测试。。。

    • window.hasOwnProperty('ontouchstart') 如果 window 对象有自己的 无接触起动 所有物在一些浏览器中(我刚刚在Chrome 37和IE9上确认了这一点), 有自己的 on -事件财产;相反,它们是的财产 window.__proto__ .

    我们不应该测试值(因为在我们运行代码之前,以前的代码可能已经更改了值),我们无法测试 的属性,因为浏览器在事件侦听器财产所在位置的实现上有所不同 的原型链。因此,我们最一致的选择是测试属性是否在 的原型链。这正是我们使用 in 操作人员

    当然,如果其他人的代码在我们的测试之前运行,他们可以添加 无接触起动 最初没有的房产。绝对严格地测试对事件的支持是不可能的,这是一项糟糕的业务。