2010-09-28 13 views
7

Ich versuche, meine eigene Fehlerbehandlung zur JavaScript-setTimeout-Funktion hinzuzufügen. Der folgende Code funktioniert in Chrome gut:überschreiben eine globale Funktion in Javascript

Aber in IE7 wird es in eine rekursive Funktion. Aus irgendeinem Grund wird oldSetTimeout auf die neue Funktion eingestellt.

Irgendwelche Vorschläge?



side note: Ja, ich brauche es auf diese Weise zu tun. Ich benutze einen Stapel von 3rd-Party-Bibliotheken, die alle nicht gut mit setTimeout umgehen, also kann ich nicht einfach die Aufrufe von setTimeout ändern.

Antwort

16

Das ist, weil Sie genannte Funktionsausdrücke verwenden, die in IE falsch implementiert werden. Durch das Entfernen der Funktionsnamen wird das unmittelbare Problem behoben. Siehe kangax ist excellent article on this subject. Es gibt jedoch ein anderes Problem, das nicht so einfach behoben werden kann.

Im Allgemeinen ist es keine gute Idee, zu versuchen, Eigenschaften von Host-Objekten außer Kraft zu setzen (wie window, document oder jedes DOM-Element), weil es keine Garantie ist die Umgebung es zulässt. Host-Objekte sind nicht an dieselben Regeln wie native Objekte gebunden und können im Wesentlichen tun, was sie wollen. Es gibt auch keine Garantie dafür, dass eine Host-Methode ein Function Objekt ist und daher oldSetTimeout nicht immer eine apply() Methode haben kann. Dies ist der Fall in IE, so dass der Anruf an oldSetTimeout.apply(this, args); nicht funktioniert.

würde ich folgendes stattdessen vorschlagen:

window.oldSetTimeout = window.setTimeout; 

window.setTimeout = function(func, delay) { 
    return window.oldSetTimeout(function() { 
     try { 
      func(); 
     } 
     catch (exception) { 
      //Do Error Handling 
     } 
    }, delay); 
}; 
3

Minor Verbesserung der Antwort von Tim Down the original noch mehr zu imitieren:

window.oldSetTimeout = window.setTimeout; 
window.setTimeout = function(func, delay) { 
    return window.oldSetTimeout(function() { 
     try { 
      func(); 
     } 
     catch (exception) { 
      //Do Error Handling 
     } 
    }, delay); 
}; 
+0

Guter Punkt. Ich änderte meine Antwort; Ich hoffe, es macht dir nichts aus. –

+3

lol, aber jetzt gibt es Antworten, die dasselbe sagen>: | –

Verwandte Themen