【问题标题】:How Google Closure EventTarget works?Google Closure EventTarget 是如何工作的?
【发布时间】:2012-07-17 12:11:42
【问题描述】:

我在高级编译模式下遇到错误。

Uncaught TypeError: Object #<d> has no method 'attachEvent'

经过一些源映射魔术后,我发现这是从 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);
};

所以这个函数最终出现在我的对象的原型上,还有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 分支?在简单编译模式下,一切正常。这是如何工作的,为什么我只在高级编译模式下收到错误?

【问题讨论】:

  • 您能分享一下您对该对象的实际实现吗?

标签: javascript events google-closure-compiler google-closure google-closure-library


【解决方案1】:

您可以添加更多代码吗?您的自定义活动是什么样的?基本上,来自 JS 的默认“addEventListener”被重新编写。 IE没有实现addEventListener,只是attachEvent,返回的事件对象不是普通事件,而是一个goog.events.BrowserEvent

在高级编译模式下,编译器会展平(缩小)所有对象的属性,包括事件对象。您的自定义事件的属性可能会在高级编译模式下变平(这很可能是这里的情况),因此原型中不存在 attachEvent()。它可能已经变成 aE() 或类似的东西。在任何人能够提出真正有用的建议之前,再添加一些代码。

【讨论】:

    猜你喜欢
    • 2017-02-14
    • 2014-07-04
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    相关资源
    最近更新 更多