zaphod1984: eventhandler in einer klasse, kontext?

Ich habe folgendes Problem:
Innerhalb einer Klasse werden verschiedene Dom-Elemente mit Eventhandlern belegt, unter anderem auch document.

Entsprechend dem Beispiel unten werden die Events dann verarbeitet. Im Firefox funktioniert das alles wunderbar, der Kontext der Aufrufe ist korrekt (im Beispiel kommt bei jedem Klick auf das document vier alerts mit vier verschiedenen Nummern), im IE wird immer die gleiche Nummer ausgegeben, d.h. der Kontext des Eventhandlers ist immer der gleiche!

Ich kann mir nicht vorstellen warum dem so ist oder was man dagegen machen könnte, hat da irgend jemand eine Idee?

Die Funktion addEventListener ist die von John Reisig.

  
<script>  
function addEvent( obj, type, fn ) {  
  if ( obj.attachEvent ) {  
    obj['e'+type+fn] = fn;  
    obj[type+fn] = function(){obj['e'+type+fn]( window.event );}  
    obj.attachEvent( 'on'+type, obj[type+fn] );  
  } else  
    obj.addEventListener( type, fn, false );  
}  
function C1(Pid) {  
	var v1 = parseInt(Math.random() * 1000000);  
	var id = Pid;  
	var box;  
	var __self = this;  
	  
	var __const = function() {  
		addEvent(document,'mouseup',handler);  
	}  
	var handler = function() {  
		alert(v1);  
	}  
	  
	__const();  
}  
  
var bla1 = new C1();  
var bla2 = new C1();  
var bla3 = new C1();  
var bla4 = new C1();  
  
</script>  

--
for your security, this text has been encrypted by ROT13 twice.
  1. folgende schnippsel sind obsolet, hatte ich vergessen raus zu machen:

    var id = Pid;
    var box;
    var __self = this;

      
    
    -- 
    for your security, this text has been encrypted by ROT13 twice.
    
    1. ich hatte eigentlich gedacht dass man sich auf eine lösung verlassen kann die von jemandem wie john reisig kommt, dem war leider nicht so, im IE wurden die events immer überschrieben so dass am ende der handler der letzten klasse aufgerufen wurde.

      ich bin jetzt hier hängen geblieben, das scheint mir eine gute lösung zu sein, klappt auch im IE5.5...

        
      <script>  
        
      function listen(evnt, elem, func) {  
      	if (elem.addEventListener) // W3C DOM  
      		elem.addEventListener(evnt,func,false);  
      	else if (elem.attachEvent) { // IE DOM  
      		var r = elem.attachEvent("on"+evnt, func);  
      		return r;  
      	}  
      }  
        
      function C1() {  
      	var v1 = parseInt(Math.random() * 1000000);  
      	var __const = function() {  
      		listen('mouseup',document,handler);  
      	}  
      	var handler = function(ev) {  
      		alert(v1);  
      	}  
      	__const();  
      }  
        
      var bla1 = new C1();  
      var bla2 = new C1();  
      var bla3 = new C1();  
      var bla4 = new C1();  
        
      </script>  
      
      
      --
      for your security, this text has been encrypted by ROT13 twice.
      1.   var r = elem.attachEvent("on"+evnt, func);  
        

        Hier findet keine Korrektur des Kontexts statt, d.h. du kannst im IE nicht über this auf das Objekt zugreifen, bei dem der Event-Handler registriert wurde.

        Mathias

        1. obige nachricht hatte ich abgeschickt, als eine fehler meldung kam hab ich deine nachricht gesehen und die dean edwards lösung für gut befunden. :)

          beim beispiel von listen hat es im IE aber funktioniert, this hab ich zwar nicht verwendet, der kontext (v1) war aber da...

          --
          for your security, this text has been encrypted by ROT13 twice.
  2. Die Funktion addEventListener ist die von John Reisig.

    Die addEvent-Funktion ist schlecht, weil sie für eine Funktion anhand ihrer Dekompilierung (Umwandlung in String) einen Hash bildet.
    Das ist Unsinn, wenn man »gleich aussehende« Funktionen nutzt, die aber als Closures verschiedene Variablen einschließen.

    Nutze eine andere addEvent-Funktion, z.B. diese
    http://dean.edwards.name/weblog/2005/10/add-event/
    http://dean.edwards.name/weblog/2005/10/add-event2/

    Wenn es einfacher gehen soll (good enough addEvent):
    http://www.ilfilosofo.com/blog/2008/04/14/addevent-preserving-this/
    http://www.dustindiaz.com/javascript-no-no/

    Mathias

    1. danke für deine antwort, letztendlich bin ich auch gerade eben darauf gekommen dass im IE die handler immer überschrieben werden. (nach vielen stunden testen)

      ich hatte eigentlich gedacht dass man sich auf eine lösung verlassen kann die von jemandem wie john reisig kommt, dem war leider nicht so.

      ich habe jetzt die lösung von dean edwards genommen, funktioniert wunderbar. :)

      danke nochmal.

      --
      for your security, this text has been encrypted by ROT13 twice.
      1. ich hatte eigentlich gedacht dass man sich auf eine lösung verlassen kann die von jemandem wie john reisig kommt, dem war leider nicht so.

        Mit dem addEvent Recoding Contest im Jahr 2005 fing die Entwicklung erst an. Dass Peter-Paul Koch damals John Resigs Beitrag den Pokal überreichte, war aus heutiger Sicht problematisch. Denn in der Zeit darauf wurden viele Probleme, Unzulänglichkeiten und stille Voraussetzungen dieser (und anderer) addEvent-Funktionen aufgedeckt und diskutiert. Im Nachhinein waren alle schlauer, dumm ist nur, dass die wichtigen Seiten nicht aktualisiert wurden und entscheidende Kritik irgendwo in Blog-Kommentaren versteckt ist.
        Die großen JavaScript-Frameworks (einschließlich jQuery von John Resig) verwenden heutzutage Funktionen, die konzeptionell eher auf Dean Edwards Beitrag zurückgehen.

        Mathias

        1. Mit dem addEvent Recoding Contest im Jahr 2005 fing die Entwicklung erst an. Dass Peter-Paul Koch damals John Resigs Beitrag den Pokal überreichte, war aus heutiger Sicht problematisch. Denn in der Zeit darauf wurden viele Probleme, Unzulänglichkeiten und stille Voraussetzungen dieser (und anderer) addEvent-Funktionen aufgedeckt und diskutiert.

          Aus heutiger Sicht? Was waren die anderen Beiträge? Das ist großer Mist und er springt mir ins Gesicht! Wie konnte *dieser* Beitrag siegen?

          Im Nachhinein waren alle schlauer, dumm ist nur, dass die wichtigen Seiten nicht aktualisiert wurden und entscheidende Kritik irgendwo in Blog-Kommentaren versteckt ist.

          Hmmm, auf John Resigs addEvents-Beitrag kann ich die Kommentare nicht sehen, trotz Klick. Das nenne ich wirklich "gut versteckt".

          Die großen JavaScript-Frameworks (einschließlich jQuery von John Resig) verwenden heutzutage Funktionen, die konzeptionell eher auf Dean Edwards Beitrag zurückgehen.

          Was von jQuery zu halten ist, kann man zum Glück in comp.lang.javascript nachlesen.

          --
          Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
          Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
          1. Hallo,

            willst du nur ein bisschen trollen?

            Mathias

            1. [latex]Mae  govannen![/latex]

              willst du nur ein bisschen trollen?

              Ich weiß zwar, daß du jQuery für nützlich hältst (ich stimme dem nicht zu), aber für einen der jQuery-Fanboys (man lese im Netz die typischen Antworten auf Beiträge, die jQuery zu kritisieren wagen; besser ist deine obige Entgegnung wahrlich nicht) habe ich dich bisher nicht gehalten. Andere der Trollerei zu bezichtigen, weil sie eine eigene Meinung haben, ist jedenfalls völlig daneben.
              Ich könnte hier auch auf jeden jQuery/prototype.js -Beitrag antworten "Verwendet diesen Mist nicht", aber solche Antworten sind nicht produktiv.

              Um es zu konkretisieren:
              Diese Analyse der neuesten jQuery-Version und der daraus entstandene Thread sind diesbezüglich zumindest größtenteils interessant.

              Ob man jQuery dennoch einsetzen will, darf dennoch jeder selber entscheiden.

              Cü,

              Kai

              --
              Ash nazg durbatulûk, ash nazg gimbatul,ash nazg thrakatulûk, agh burzum-ishi krimpatul
              SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
              1. Trollerei ist, wenn ich was über addEvent-Funktionen erzähle und, nur weil die Stichwörter »jQuery« und »John Resig« fallen, jemand antwortet: Und im übrigen ist jQuery scheiße! Und John Resig konnte noch nie programmieren und hat außerdem nen kleinen Pillemann!
                Sorry, aber was hat's mit dem Thema zu tun? jQuery war gar nicht das Thema! Schuldigung, dass ich Reizwörter am Rande meines Beitrags erwähnt habe.

                Ich könnte hier auch auf jeden jQuery/prototype.js -Beitrag antworten "Verwendet diesen Mist nicht",

                Siehste, das man das besser lassen sollte, wollte ich ausdrücken.

                aber solche Antworten sind nicht produktiv.

                Solche wie meine? Ich hatte nicht vor, über jQuery zu diskutieren. Darf man hier nicht jQuery erwähnen, ohne sich einer Diskussion stellen zu müssen? Wieso sollte ich auf so eine Vorlage eingehen?

                Um es zu konkretisieren:
                Diese Analyse der neuesten jQuery-Version und der daraus entstandene Thread sind diesbezüglich zumindest größtenteils interessant.

                LOL. Da habe ich bis zum vierten Absatz gelesen und gleich gemerkt, dass ich davon nichts zu erwarten habe außer Flames und Erbsenzählerei - also genau dasselbe, was ich in cljs fand, als ich das letzte mal darauf verwiesen wurde.
                99% dieser »Kritik« betrifft mich einfach nicht, solange das Werkzeug das tut, was ich von ihm erwarte. Und was den Rest angeht, verwende ich den Bug-Tracker. Ob John Resig nun den besagten kleinen Pillemann hat, ist mir ziemlich wurscht.
                Schreibt doch lieber gute JavaScripte, JS-Tutorials und -Dokus, anstatt euch das reinzutun.

                Mathias