目前,我们正在研究一种捕获JavaScript中发生的错误的方法。我们可以在包括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_FUNCTION中包含我们的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中正常工作。对于所有其他浏览器,您可以简单地覆盖window.EventTarget版本。基本上,我错过了call的使用,没有它,它不知道调用attachEvent的上下文。

    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));
      };
    

    09-26 22:16