- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在重构别人写的一些代码。有一个函数使用:
!!('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
那么为什么要使用这个可能更慢的替代方案呢?哪些浏览器不支持其他解决方案?
最佳答案
您的两个替代测试在某些方面都有缺陷:
window.ontouchstart !== null
测试非null
监听器。测试 ontouchstart
的值是一种有风险的方法,因为库或其他代码可能会更改 ontouchstart
的值。测试值(value)是一种糟糕的方法;测试属性本身的存在会好得多,这将我们带到您提议的下一个测试...
window.hasOwnProperty('ontouchstart')
测试 window
对象是否有自己的 ontouchstart
属性。在某些浏览器中(我刚刚在 Chrome 37 和 IE9 上确认了这一点),window
没有有自己的 on
事件属性;相反,它们是 window.__proto__
的属性。
我们不应该测试一个值(因为之前的代码可能在我们运行我们的代码之前改变了值)并且我们不能测试 window
自己的属性,因为浏览器不同他们对 window
原型(prototype)链中存在的事件监听器属性的实现。因此,我们最一致的选择是测试该属性是否存在于 window
的原型(prototype)链中的任何位置(无论值如何)。这正是我们使用 in
运算符所做的。
当然,如果其他人的代码在我们的测试之前运行,他们可以在原本没有的地方添加一个 ontouchstart
属性。绝对严格地测试对事件的支持是不可能的,这是一件糟糕的事情。
关于javascript - 为什么 'ontouchstart' 在窗口 "supported by most browsers"中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25622810/
我想用 JavaScript 在触摸设备上复制悬停效果。我创建了 2 个事件 ontouchstart 和 ontouchend,但由于某种原因它不起作用,我收到控制台错误。 错误:未捕获的 DOME
我有一个固定宽度为 200px x 250px 的 div。我可以使用 javascript(在鼠标按下时)使 div 内容很好地滚动,在桌面浏览器中没有问题,但我需要能够让 div 滚动到我的 ip
我正在为平板电脑/智能手机构建带有滑动功能的图片库。我在 iPad 上得到了非常奇怪的结果,所以我决定一直跟踪它回到开始,并在不同事件发生时打印出来。 以下代码本应在我用手指完成滑动后发出类似“sta
我想根据 iPad 上项目的触摸来隐藏元素。以下链接显示 - https://developer.apple.com/library/archive/documentation/AppleApplic
我目前正在使用 Electron 开发 Web 应用程序。如果我在普通的 Chrome 浏览器中打开该应用程序,它会按预期工作:点击为点击,触摸为触摸。 但是如果我用 electron 打包它,它就不
我有一个带有 -webkit-overflow-scrolling:touch 的 div,里面有一个项目列表。 我正在使用 Angular ngTouch,它将我所有的 ng-clicks 处理为
目前,为了检测触摸屏设备,我在我的 javascript 中使用它: if ('createTouch' in document) { // do touchscreen-specific stuff
我的移动 View 触发了一个 ontouchstart 事件,它链接到这个: function mobileLinksShow() { document.querySelector('.mo
我正在尝试让 ontouchstart 适用于 Windows 平板电脑。如果检测到,它会禁用链接的顶层,以便单击事件允许菜单保持打开状态(而不是悬停效果)。 以下代码适用于其他触摸设备,因此我不确定
我有一个 jQuery 移动列表。我想让列表元素在用户触摸时突出显示。我尝试使用以下方法实现: $("#id").bind('touchstart tap', function () { $(
基本上,我有一个写有 :active 的 CSS 按钮,但每次我点击手机上的按钮时,在切换到 Activity 阶段之前会有延迟。 CSS: .btn {...} .btn:active{...} 然
我正在编写一个主要针对 iOS Safari 的网站,但我也希望它能够响应普通桌面。 所以我需要让一个按钮在桌面上对 onmousedown onmouseup 事件使用react,并让一个按钮在 i
我正在尝试编写将在浏览器中或作为 phonegap 应用程序运行的代码。我需要做的一件事是确定我是否处于支持触摸事件的环境中。 我当前的问题是我的 Chrome (20.0.01132.47 m) 为
我有一个具有悬停效果的按钮。但是我想禁用 ipad 和 iphone 中的悬停。它不工作 $(document).ready(function () { $(".content
我目前对每个要更改触摸类的元素使用以下内容: ontouchstart="$(this).addClass('select');" ontouchend="$(this).removeClass('s
我的 React 应用程序中有一个 div,我需要处理点击和触摸。但是,当我点击手机时,它会触发这两个事件。 如果我在移动设备上滑动或点击普通浏览器,它工作正常,在每种情况下只触发一个事件。 如何处理
当我构建一个项目时,我发现当我使用 onClick 双击该组件时,该组件按照我预期的方式工作。但是当我将 onClick 更改为 onTouchStart 时,它开始按照我的预期工作。 但是我有点担心
当我构建一个项目时,我发现当我使用 onClick 双击该组件时,该组件按照我预期的方式工作。但是当我将 onClick 更改为 onTouchStart 时,它开始按照我的预期工作。 但是我有点担心
我正在重构别人写的一些代码。有一个函数使用: !!('ontouchstart' in window) 我在其他项目中看到过这个:https://github.com/Modernizr/Modern
我正在使用 React Native 开发一个应用程序,它必须尽快响应点击手势,因为一秒钟内可以触发多个点击事件。不需要双击或移动手势,但需要注意同时点击。我一直在测试 onTouchStart 和
我是一名优秀的程序员,十分优秀!