亲爱的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行为如此愚蠢(更可能是 我 这么愚蠢)。 ; - )
感谢阅读!任何帮助表示赞赏!
答案 0 :(得分:0)
在ADVANCED_COMPILATION中运行,Closure Compiler为我最小化并混淆window.ondevicemotion
,所以我也认为这也是你的问题。有两种方法可以解决这个问题:
Closure Computer不会重命名通过括号表示法引用的任何属性。以下内容不应被混淆(但可能会被重写为window.ondevicemotion
):
window['ondevicemotion'] = function(event) { ... }
与上面的情况类似,Closure Compiler会提示并不会重写属性,保持原样。但是,这给你一些类型检查带来了很好的好处,因为你要为Closure Compiler定义extern的签名:
/**
* @param {goog.events.Event} event
*/
window.ondevicemotion = function(event) {};
决定使用哪一个最终是你的。在这种情况下,我很可能会选择第二个选项,如果有某些原因你不能使用外部,则只返回第一个选项。