Javascript 为什么是';ontouchstart&x27;在窗口中“;大多数浏览器都支持;?
我正在重构别人编写的一些代码。有一个函数使用:Javascript 为什么是';ontouchstart&x27;在窗口中“;大多数浏览器都支持;?,javascript,dom,Javascript,Dom,我正在重构别人编写的一些代码。有一个函数使用: !!('ontouchstart' in window) 我在其他项目中也看到过这种情况: 在回答中: 但这似乎比其他选择要慢: 那么为什么要使用这个可能较慢的替代方案呢?哪些浏览器不支持其他解决方案?您的两个备选测试在某些方面都有缺陷: window.ontoochstart!==null测试非null侦听器。测试ontouchstart的值是一种危险的方法,因为库或其他代码可能会更改ontouchstart的值。测试值是一种糟糕的方法;最好
!!('ontouchstart' in window)
我在其他项目中也看到过这种情况:
在回答中:
但这似乎比其他选择要慢:
那么为什么要使用这个可能较慢的替代方案呢?哪些浏览器不支持其他解决方案?您的两个备选测试在某些方面都有缺陷:
测试非null侦听器。测试window.ontoochstart!==null
的值是一种危险的方法,因为库或其他代码可能会更改ontouchstart
的值。测试值是一种糟糕的方法;最好是测试属性本身的存在性,这将使我们进入下一个建议的测试ontouchstart
测试window.hasOwnProperty('ontouchstart')
对象是否有自己的window
属性。在一些浏览器中(我刚刚在Chrome37和IE9上确认了这一点),ontouchstart
没有自己的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这是公平的;我将