Javascript 为什么是';ontouchstart&x27;在窗口中“;大多数浏览器都支持;?

Javascript 为什么是';ontouchstart&x27;在窗口中“;大多数浏览器都支持;?,javascript,dom,Javascript,Dom,我正在重构别人编写的一些代码。有一个函数使用: !!('ontouchstart' in window) 我在其他项目中也看到过这种情况: 在回答中: 但这似乎比其他选择要慢: 那么为什么要使用这个可能较慢的替代方案呢?哪些浏览器不支持其他解决方案?您的两个备选测试在某些方面都有缺陷: window.ontoochstart!==null测试非null侦听器。测试ontouchstart的值是一种危险的方法,因为库或其他代码可能会更改ontouchstart的值。测试值是一种糟糕的方法;最好

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

!!('ontouchstart' in window)
我在其他项目中也看到过这种情况: 在回答中:

但这似乎比其他选择要慢:


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

您的两个备选测试在某些方面都有缺陷:

  • window.ontoochstart!==null
    测试非null侦听器。测试
    ontouchstart
    的值是一种危险的方法,因为库或其他代码可能会更改
    ontouchstart
    的值。测试值是一种糟糕的方法;最好是测试属性本身的存在性,这将使我们进入下一个建议的测试

  • window.hasOwnProperty('ontouchstart')
    测试
    window
    对象是否有自己的
    ontouchstart
    属性。在一些浏览器中(我刚刚在Chrome37和IE9上确认了这一点),
    window
    没有自己的
    事件属性;相反,它们是
    窗口的属性

我们不应该测试某个值(因为之前的代码在运行代码之前可能已经更改了该值),我们也不能测试
窗口
自己的属性,因为浏览器在
窗口
的原型链中存在的事件侦听器属性的实现不同。因此,我们最一致的选择是测试属性是否存在于
窗口
的原型链中的任何位置(无论值如何)。这正是我们对
操作符中的
所做的


当然,如果其他人的代码在我们的测试之前运行,他们可以在原来没有的地方添加一个
ontouchstart
属性。完全严格地测试对事件的支持是不可能的,这是一项糟糕的业务。

您的两个备选测试在某些方面都有缺陷:

  • window.ontoochstart!==null
    测试非
null
侦听器。测试
ontouchstart
的值是一种危险的方法,因为库或其他代码可能会更改
ontouchstart
的值。测试值是一种糟糕的方法;最好是测试属性本身的存在性,这将使我们进入下一个建议的测试

  • window.hasOwnProperty('ontouchstart')
    测试
    window
    对象是否有自己的
    ontouchstart
    属性。在一些浏览器中(我刚刚在Chrome37和IE9上确认了这一点),
    window
    没有自己的
    事件属性;相反,它们是
    窗口的属性

  • 我们不应该测试某个值(因为之前的代码在运行代码之前可能已经更改了该值),我们也不能测试
    窗口
    自己的属性,因为浏览器在
    窗口
    的原型链中存在的事件侦听器属性的实现不同。因此,我们最一致的选择是测试属性是否存在于
    窗口
    的原型链中的任何位置(无论值如何)。这正是我们对
    操作符中的
    所做的



    当然,如果其他人的代码在我们的测试之前运行,他们可以在原来没有的地方添加一个
    ontouchstart
    属性。完全严格地测试对事件的支持是不可能的,这是一项糟糕的工作。

    我真的不理解你文章的主要问题。您想知道为什么使用y中的x方法,或者检查
    窗口中的
    ontouchstart
    属性是否足够吗?很抱歉造成混淆。问题是:为什么用它来代替其他可用选项?嗯。。。显然,要检查浏览器是否支持触摸事件,这在带有触摸屏的设备中是必不可少的<代码>y中的x
    只是为了更好的可读性,我想。显然不是<代码>y中的x
    似乎用于跨浏览器兼容性。而且它似乎比其他方法要慢:通常情况下,每个页面加载只调用一次,所以我猜速度不是大多数人关心的问题。我真的不理解你文章的主要问题。您想知道为什么使用y中的x方法,或者检查
    窗口中的
    ontouchstart
    属性是否足够吗?很抱歉造成混淆。问题是:为什么用它来代替其他可用选项?嗯。。。显然,要检查浏览器是否支持触摸事件,这在带有触摸屏的设备中是必不可少的<代码>y中的x
    只是为了更好的可读性,我想。显然不是<代码>y中的x
    似乎用于跨浏览器兼容性。而且它似乎比其他方法要慢:通常情况下,每个页面加载只调用一次,所以我猜速度不是大多数人关心的问题无效0?是的,但可能跨浏览器且速度更快。那会是跨浏览器吗?你真的那么担心速度吗?您每秒测试浏览器是否支持触摸事件多少次?在这里,代码的可读性要重要得多。至于它是否会持续有效:也许。这取决于是否所有浏览器都禁止将
    上的
    -事件属性设置为
    未定义的
    (如果发生此情况,将导致
    !==void 0
    )失败)。不,我不是。我只是好奇。如何
    window.ontoochstart!==未定义的
    可读性比窗口中的ontouch start
    差?此外,如果这允许删除Modernizer使用的
    DocumentTouch
    测试,那么这将是有价值的。你知道有哪些浏览器不允许将
    设置为
    未定义的
    事件属性吗?@conradk这是公平的;我将