Javascript 如何在IE8中包装attachEvent

Javascript 如何在IE8中包装attachEvent,javascript,error-handling,custom-error-handling,Javascript,Error Handling,Custom Error Handling,现在我们正在研究一种捕获JavaScript中发生的错误的方法。我们的一切都可以在浏览器中工作,包括IE9和IE9之后 在现代浏览器中,我们可以使用一个函数来包装window.EventTarget.prototype.addEventListener,该函数执行try/catch,以捕获错误。例如,我们可以这样做: var addEventListener = window.EventTarget.prototype.addEventListener; window.EventTarget.

现在我们正在研究一种捕获JavaScript中发生的错误的方法。我们的一切都可以在浏览器中工作,包括IE9和IE9之后

在现代浏览器中,我们可以使用一个函数来包装
window.EventTarget.prototype.addEventListener
,该函数执行
try/catch
,以捕获错误。例如,我们可以这样做:

var addEventListener = window.EventTarget.prototype.addEventListener;

window.EventTarget.prototype.addEventListener = function (event, callback, bubble) {
return addEventListener.call(this, event, WATCH_FUNCTION(callback), bubble)
};
上面的
WATCH\u功能中有我们的
try/catch
。现在我们无法找到一种方法来包装IE8中元素上存在的
attachEvent
。例如:

var myObject = document.getElementById('my-id');

myObject.attachEvent('onclick', function () {reference-to-undefined-var});
我们的希望是总结所附事件将引发的错误。现在,我们无法确定如何始终包装attachEvent。我们将是第三方图书馆,因此我们不能强迫人们使用不同形式的附加事件

作为对任何关注这个问题的人的一个提醒,我试图忽略以下内容,但似乎没有任何效果:

  • Object.prototype.attachEvent
  • Element.prototype.attachEvent
  • window.attachEvent

我终于明白我做错了什么,下面的内容似乎在IE8中起作用。对于所有其他浏览器,您只需覆盖
窗口.EventTarget
版本即可。基本上我没有使用
调用
,否则它不知道调用
附件
的上下文

var attachEvent = window.Element.prototype.attachEvent,
      detachEvent = window.Element.prototype.detachEvent;

  window.Element.prototype.attachEvent = function (event, callback) {
    return attachEvent.call(this, event, watch(callback));
  };

  window.Element.prototype.detachEvent = function (event, callback) {
    return detachEvent.call(this, event, watch(callback));
  };

为什么不使用onerror事件?
onerror
仅捕获在该级别触发的事件。如果有人以开发方式设置了IE,它将不会捕获该级别的事件。此外,
onerror
上提供的堆栈跟踪和信息也没有执行
try/catch
时详细。我也在使用
onerror
。我希望获得尽可能多的信息。如果有人知道如何覆盖IHTMlement2的方法(从全局角度来看),那么请进一步了解这一点。我已经走得更远了。通过访问
window.Element.prototype.attachEvent
mine现在被调用。然而,IE8让我大惊小怪:“无效的过程调用或参数”。我认为
Element
之前失败的原因是页面直接干扰了Element。无论您如何尝试,库中都会有空白。最好只使用onerror而不使用堆栈,不要太在意旧浏览器。顺便说一句,这是一个开源项目吗?我正在开发一个js错误库,用于记录错误和解析堆栈。最初我想要一个V8 polyfill,但不可能做到这一点。至少我不想像你那样包装所有的东西,因为使用try-catch块会减慢代码的速度。这在技术上是可行的。但是,如果您有任何基于xml的节点,那么原型继承将被破坏。也就是说,xml节点上的attachEvent将无法工作。特别是表单的一个节点: