Closure Library ondevicemotion永远不会被解雇

时间:2014-08-25 15:43:30

标签: javascript google-closure google-closure-library motionevent

亲爱的Javascript程序员,

谷歌的Closure图书馆总是让人疯狂。我希望你能在这个问题上帮助我:

我想在Closure lib中的函数内通过javascript捕获ondevicemotion - 事件。 没有Closure一切正常,我从这个页面抓取以下代码(感谢作者):http://www.peterfriese.de/how-to-use-the-gyroscope-of-your-iphone-in-a-mobile-web-app/

以下代码段显示" my"代码:

if (window.DeviceMotionEvent != undefined) {
    console.log("DME");
    window.ondevicemotion = function(e) {
    console.log("ODM");

    // handle events like e.rotationRate
    ...
    }
}

这在独立的html页面中完美运行。两个console.log都被触发。

相比之下,Closure似乎与window.ondevicemotion = function(e) {有问题,因为控制台会记录" DME"但不是" ODM"。 没有编译器警告或错误。

是否有人也认识到这样的问题?我很遗憾地不知道为什么Closure行为如此愚蠢(更可能是 这么愚蠢)。 ; - )

感谢阅读!任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

在ADVANCED_COMPILATION中运行,Closure Compiler为我最小化并混淆window.ondevicemotion,所以我也认为这也是你的问题。有两种方法可以解决这个问题:

1。使用括号表示法来设置/访问属性。

Closure Computer不会重命名通过括号表示法引用的任何属性。以下内容不应被混淆(但可能会被重写为window.ondevicemotion):

window['ondevicemotion'] = function(event) { ... }

2。使用extern让编译器知道不要重命名此属性。

与上面的情况类似,Closure Compiler会提示并不会重写属性,保持原样。但是,这给你一些类型检查带来了很好的好处,因为你要为Closure Compiler定义extern的签名:

/**
 * @param {goog.events.Event} event
 */
window.ondevicemotion = function(event) {};

决定使用哪一个最终是你的。在这种情况下,我很可能会选择第二个选项,如果有某些原因你不能使用外部,则只返回第一个选项。

相关问题