【问题标题】:Chrome Update broke my 'devicemotion' event handlerChrome 更新破坏了我的“devicemotion”事件处理程序
【发布时间】:2013-11-25 08:27:17
【问题描述】:

在我的网站上,我的一些 Javascript 已经运行了一年多,并且运行良好(据我所知,我为它在每个浏览器中都能正常工作而感到自豪)。但是最近它突然坏了,经过一些调试我发现了这个。

我有一些创建 eventHandler 的代码如下:

window.addEventListener(
    'devicemotion',
    function (e) { ... },
    false
);

此处理程序用于处理设备加速,但由于某种原因,在最近的一些 Chrome 更新中,此处理程序在我的所有计算机(笔记本电脑、台式机等)上被调用,而不仅仅是我的移动设备。据我所知,这些设备中都没有任何加速度计,并且过去从未在它们上执行过此处理程序。

谁能解释一下为什么这种行为发生了变化?在台式计算机上调用此处理程序似乎非常违反直觉。我尝试在 Chrome 中搜索与此相关的更新,但我不太熟悉搜索 Chrome 或 Chromium 存储库/源代码。

【问题讨论】:

  • 你从哪个chrome版本更新到了?
  • 老实说,我不确定哪个版本的 chrome 破坏了它,因为更新是自动发生的,而且我可能有一两个星期没有检查我的网站。现在我正在运行版本 31.0.1650.57 m。此外,window.ondevicemotion 似乎是 null,或者至少这是 Chrome 控制台告诉我的。
  • idk 但可以参考r263411r263415
  • 您的第二个参考使我遇到了问题。事实上,一个带有空值的事件会被发送一次(即acceleration = {null, null, null}),显然是为了让开发人员能够处理不支持此加速数据的设备。随意写一个答案,我会给你一些功劳。

标签: javascript google-chrome event-handling dom-events


【解决方案1】:

根据r196645 google 想要修复对 Device Orientation API 的设备运动部分的支持。

W3C specification draft说:

无法提供所有三个角度的实现必须将未知角度的值设置为空。如果提供了任何角度,则必须适当设置 absolute 属性。如果实现永远无法提供方向信息,则应在所有属性设置为 null 的情况下触发事件。

为了更正设备方向 API 的这一部分,他们打开了r263415 并告诉 chrome 在所有设备上触发 devicemotion 事件,并只传递 W3C specification draft 中指定的空值。

所以这就是这种行为发生变化的原因。

【讨论】:

    【解决方案2】:

    如果将监听器包裹在 if browser width / navigator 语句中会怎样?我知道这并不理想,但最近 chrome 似乎确实出现了很多问题。我目前正遭受一个无法治愈的错误(或者看起来就是这样),我的控制台始终保持空白,并且我必须使用金丝雀进行任何调试任务。

    【讨论】:

    • 嗯,我已经解决了类似于您描述的问题。我基本上用if (mobile) ... 包裹了侦听器,因为我已经有了查找访问我页面的移动设备的代码。我更好奇为什么我必须首先这样做,因为必须检查这个非常违反直觉。
    • 你运行的是什么版本的 chrome?
    • 版本 31.0.1650.57 m
    猜你喜欢
    • 2017-05-17
    • 1970-01-01
    • 2017-06-18
    • 2018-03-31
    • 2013-04-16
    • 2015-02-14
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多