2015-01-20 3 views
1

지금 우리는 JavaScript에서 발생하는 오류를 잡는 방법을 연구하고 있습니다. 우리는 Internet Explorer 9 이후를 포함한 모든 브라우저에서 작동합니다.IE8에서 attachEvent를 래핑하는 방법

최신 브라우저에서는 오류를 캡처하기 위해 try/catch의 기능을 사용하여 window.EventTarget.prototype.addEventListener을 감쌀 수 있습니다. 예를 들어 우리는이 작업을 수행 할 수 있습니다

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하는 방법을 알아낼 수 없습니다. 우리는 제 3 자 도서관이되어 사람들이 다른 형태의 사건을 사용하도록 강요 할 수는 없습니다. 마지막으로

  • Object.prototype.attachEvent
  • Element.prototype.attachEvent
  • window.attachEvent
+0

왜 onerror 이벤트를 사용하지 않습니까? – Mouser

+0

'onerror'는 그 레벨에서 시작된 이벤트 만 캡처합니다. 누군가가 개발 방식으로 IE 설정을 가지고 있다면 레벨에서 이벤트를 캡처하지 않습니다. http://stackoverflow.com/questions/1915812/window-onerror-does-not-work 또한 stacktrace 및'onerror'에서 사용할 수있는 정보는'try/catch' 할 때와 같이 자세하지 않습니다. 'onerror'도 사용하고 있습니다. 가능한 한 많은 정보를 얻고 싶습니다. –

+0

누군가가 IHTMLElement2의 메소드 (글로벌 관점에서)를 재정의하는 방법을 알고 있다면 더 많은 것을 볼 수 있습니다. https://msdn.microsoft.com/en-us/library/ie/aa703984(v=vs.85).aspx –

답변

1

I을 : 나는 다음과 없음을 무시하려고 노력이 질문에 보이는 사람을위한 참고로

작동하는 것 내가 뭘 잘못했는지 알아 냈고 다음은 IE8에서 작동하는 것으로 보입니다. 다른 모든 브라우저의 경우 window.EventTarget 버전을 간단하게 무시할 수 있습니다. 기본적으로 attachEvent을 호출하는 컨텍스트를 알지 못한다면 call의 사용을 놓치고있었습니다.

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

이것은 기술적으로 작동합니다. 그러나 XML 기반 노드가 있으면 프로토 타입 상속이 손상됩니다. 즉, xml 노드의 attachEvent는 작동하지 않습니다. 특히 형태의 노드 :

관련 문제