作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在高级编译模式下遇到错误。
Uncaught TypeError: Object #<d> has no method 'attachEvent'
经过一些 source map 魔法后,我发现这是从 goog.events.listen
调用中抛出的,其中第一个参数是我的自定义对象,继承了 goog.events.EventTarget
.
这是闭包的来源
goog.events.EventTarget.prototype.addEventListener = function(
type, handler, opt_capture, opt_handlerScope) {
goog.events.listen(this, type, handler, opt_capture, opt_handlerScope);
};
所以这个函数在我的对象原型(prototype)上结束,连同 customEvent_ = true
,然后在 goog.events.listen
// Attach the proxy through the browser's API
if (src.addEventListener) {
if (src == goog.global || !src.customEvent_) {
src.addEventListener(type, proxy, capture);
}
} else {
// The else above used to be else if (src.attachEvent) and then there was
// another else statement that threw an exception warning the developer
// they made a mistake. This resulted in an extra object allocation in IE6
// due to a wrapper object that had to be implemented around the element
// and so was removed.
src.attachEvent(goog.events.getOnString_(type), proxy);
}
(最后一行是抛出的)
这不应该导致堆栈溢出吗?如果我的对象从 EventTarget
继承 addEventListener
,为什么它会进入 else
分支?在简单编译模式下,一切正常。这是如何工作的,为什么我只在高级编译模式下收到错误?
最佳答案
你能再添加一些代码吗?您的自定义事件是什么样的?基本上,JS 中默认的“addEventListener”被重写了。 IE没有实现addEventListener,只是attachEvent,返回的事件对象不是普通事件,而是一个goog.events.BrowserEvent .
在高级编译模式下,编译器展平(缩小)所有对象的属性,包括事件对象。您的自定义事件的属性可能会在高级编译模式下变平(这里很可能是这种情况),因此原型(prototype)中不存在 attachEvent() 。它可能变成了 aE() 或类似的东西。在任何人能够提出真正有用的建议之前,再添加一些代码。
关于javascript - Google Closure EventTarget 如何运作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11522174/
我是一名优秀的程序员,十分优秀!