dave: window dekorieren

Hi,

ich möchte dem IE7 etwas Funktionalität schenken, dazu müsste ich das window-Objekt dekorieren.
Konkret möchte ich dem IE7 window.attachEvent("hashchange") beibringen.

Mein Problem ist nun attachEvent entsprechend zu erweitern.

Was genau möchte ich erreichen:
Ich möchte wenn window.attachEvent aufgerufen wird eine eigene Methode ausführen und ggf. den Aufruf dann an die eigentlich window.attachEvent weiterleiten.

window.attachEvent = function(eventName, callback, useCapture){  
  // bei besonderem eventNamen etwas anderes machen  
  if(eventName == "hashchange") {  
    alert("hashchange");  
    return;  
  }  
  
  // bei allen anderen ganze normale Funktionalität  
  window.attachEvent(eventName, callback, useCapture);  
}

Das funktioniert so selbstverständlich nicht, da ich ja die ursprüngliche .attachEvent nirgends mehr habe.
Diese würde ich nun gerne irgendwo speichern so dass ich dann etwas in der Art machen könnte:

(function(){  
  // hier wird eine Referenz auf window.attachEvent gespeichert, eigentlich bräuchte ich eine Kopie  
  var oldAttachEvent = window.attachEvent;  
  window.attachEvent = function(eventName, callback, useCapture){  
    if(eventName == "bar") {  
      alert("bar");  
      return;  
    }  
    // hier sollte dann die ursprüngliche Funktion aufgerufen wird, da oben Copy by Ref erfolgte wird hier ein rekursiver Aufruf gestartet...  
    oldAttachEvent(eventName, callback, useCapture);  
  }  
})();

Das funktioniert so selbstverständlich auch nicht, weil bei Funktionen nur die Referenz zugewiesen wird.
Wie also könnte ich die Funktion kopieren?

Oder wie kann ich die .attachEvent des window-Objekts ändern, ohne die normale Funktionalität komplett zu verlieren?

Ist verständlich was ich versuche zu erreichen?

~dave

  1. (function(){

    // hier wird eine Referenz auf window.attachEvent gespeichert, eigentlich bräuchte ich eine Kopie
      var oldAttachEvent = window.attachEvent;
      window.attachEvent = function(eventName, callback, useCapture){
        if(eventName == "bar") {
          alert("bar");
          return;
        }
        // hier sollte dann die ursprüngliche Funktion aufgerufen wird, da oben Copy by Ref erfolgte wird hier ein rekursiver Aufruf gestartet...
        oldAttachEvent(eventName, callback, useCapture);
      }
    })();

    
    >   
    > Das funktioniert so selbstverständlich auch nicht, weil bei Funktionen nur die Referenz zugewiesen wird.  
      
    Doch das funktioniert. oldAttachEvent ist eine Referenz auch das alte Event.  
      
    Struppi.
    
    1. Hi,

      Doch das funktioniert. oldAttachEvent ist eine Referenz auch das alte Event.

      Man bin ich dämlich...
      Keine Ahnung wie ich drauf komm dass das nicht funktioniert...

      Danke.

      ~dave

  2. Hi,

    (function(){

    // hier wird eine Referenz auf window.attachEvent gespeichert, eigentlich bräuchte ich eine Kopie
      var oldAttachEvent = window.attachEvent;

      
    Warum solltest du eine „Kopie“ brauchen?  
      
    Auch window.attachEvent ist nicht „die Funktion selber“, sondern nur eine Referenz auf diese.  
      
      
    
    > ~~~javascript
    
      window.attachEvent = function(eventName, callback, useCapture){  
    
    >     if(eventName == "bar") {  
    >       alert("bar");  
    >       return;  
    >     }  
    >     // hier sollte dann die ursprüngliche Funktion aufgerufen wird, da oben Copy by Ref erfolgte wird hier ein rekursiver Aufruf gestartet...  
    >     oldAttachEvent(eventName, callback, useCapture);  
    >   }
    
    

    Warum an *dieser* Stelle?
    Du willst doch, dass die alte Funktionalität jedes Mal nach der neuen ausgeführt wird, oder? Dann gehört der Aufruf von oldAttachEvent mit in die anonyme Funktion hinein, nicht dahinter.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Hi,

      Du willst doch, dass die alte Funktionalität jedes Mal nach der neuen ausgeführt wird, oder? Dann gehört der Aufruf von oldAttachEvent mit in die anonyme Funktion hinein, nicht dahinter.

      Sorry, mein Fehler - genau das war ja der Fall ...

      MfG ChrisB

      --
      RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?