silkhood: Dynamische Änderung eines Event-Handlers.

Hallo zusammen,

Mein Problem ist, das ich in einem Formular dynamisch Felder hinzufüge. Dazu wird eine Eingabezeile mit mehreren Feldern kopiert, diese wird in meinem DIV-Container angehängt und ein evtl. vorhandener Index hochgezählt.
Das Funktioniert bei allen Attributen wie 'id' und 'name' auch soweit ganz Prima nur das ich bei Events wie 'onclick' nicht weiter komme. Ich bin soweit, das die Funktion, sowie die Parameter ausgelesen werden und der Index erhöht wird.
Wenn ich jedoch versuche die neue Funktion zuzuweisen, erfolgt diese nicht. Zur Zuweisung verwende ich folgenden Code:
obj[attrib] = function(){ windowfunktion; }
Im 'onclick' Aufruf steht immer noch der alte Index.

Leider kann ich einfach den Fehler nicht finden.

Ciao
Silkhood

  1. Wenn ich jedoch versuche die neue Funktion zuzuweisen, erfolgt diese nicht. Zur Zuweisung verwende ich folgenden Code:

    Du kannst dem Handler so immer nur ein Funktion zuweisen. Entweder du baust dir einen Wrapper, der die Funktionen aufnimmt und abruft.
    Ich hab die Situation mal hier beschrieben (der im Artikel bzw. in der addevent.js Datei beschriebene Weg ist eher umständlich, es sollte auch einfacher gehen).

    Struppi.

    1. ... in der addevent.js Datei beschriebene Weg ist eher umständlich, es sollte auch einfacher gehen).

      Ich hab das mal mit dem von Peter beschriebenen Weg umgesetzt, das geht doch einfacher:

      var addEvent = function(el, evt, func) {  
       var oldEvt = el[evt];  
       el[evt] = function(e) {  
        func(e);  
        if(oldEvt)oldEvt(e);  
       };  
      }  
      var NodeFunctor = function () {  
       this.addEvent = function (evt, func) {  
        return addEvent(this, evt, func);  
       };  
      };  
        
      window.onload = function() {  
        
       var el = document.getElementById('test');  
       NodeFunctor.call(el);  
       el.addEvent('onclick', function(e) {alert(e)});  
       el.addEvent('onclick', function(e) {alert('2. Klickevent')});  
      }
      

      getestet im FF 2.0 und IE 7.

      Was aber bleibt ist das in den Artikeln beschriebene Problem mit dem "memory leak" im IE. Der Punkt dabei ist, dass du die in addEvent() Funktion erzeugten Funktionsreferenzen vermutlich wieder von Hand löschen musst, da der IE das nicht von alleine macht. (ich kann aber auch falsch liegen, da ich mich damit noch nicht genau auseinandergesetzt habe)

      Struppi.

      1. Erstmal Danke für deine Hilfe. Ich habe dann aber doch eine andere Lösung gefunden. Die Methoden .getAttribute() und .setAttribute() liefern genau das Ergebnis welches ich haben will. Ich hatte das Problem das .getAttribute() bei einem Attribut das für das Objekt nicht vorgesehen einen Fehler meldet und abbricht. Und ich meine Abfrage umstellen musste, damit es läuft. Egal jetzt geht es.

        Thanx
        Silkhood

        1. Erstmal Danke für deine Hilfe. Ich habe dann aber doch eine andere Lösung gefunden. Die Methoden .getAttribute() und .setAttribute() liefern genau das Ergebnis welches ich haben will. Ich hatte das Problem das .getAttribute() bei einem Attribut das für das Objekt nicht vorgesehen einen Fehler meldet und abbricht. Und ich meine Abfrage umstellen musste, damit es läuft. Egal jetzt geht es.

          Hmm? Das klingt jetzt völlig anders als deine ursprüngliche Fragestellung. Ja, der IE hat bei manchen Attributen Probleme, daher ist die Funktion getAttribute() für Standard HTML Attribute überflüssig und sollte vermieden werden.

          Struppi.

          1. Hi,

            Hmm? Das klingt jetzt völlig anders als deine ursprüngliche Fragestellung. Ja, der IE hat bei manchen Attributen Probleme, daher ist die Funktion getAttribute() für Standard HTML Attribute überflüssig und sollte vermieden werden.

            Überflüssig: Nein. Vermeidung: Ja.

            Gruß, Cybaer

            --
            Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
            (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)
        2. Hi,

          Erstmal Danke für deine Hilfe. Ich habe dann aber doch eine andere Lösung gefunden. Die Methoden .getAttribute() und .setAttribute() liefern genau das Ergebnis welches ich haben will.

          Kann es sein, daß Du nicht mehrere Browser hast, um zu testen?

          Gruß, Cybaer

          --
          Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
          (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)