PeterPanic: Internet Explorer onmouseover zickt bei Änderung des DOM

Hallo,

Folgendes Problem treibt mich seit 2 Tagen in den Wahnsinn.

Ich baue mithilfe von AJAX und JSON eine HTML Seite zusammen.
Im Zuge dessen iteriere ich über eine JSON Liste drüber
und versuche mir Tooltips für eine HTML-TD Zelle zusammenzubauen.
Ich habe das Ganze schon vereinfacht und will nur mehr dass er mir
beim mouseover folgende Funktion aufruft:

  
function myLittleFunction(i){  
        alert(i);  
    }  

Folgendes funktioniert einwandfrei in allen Browsern ausser dem IE

  
htmlCell.setAttribute("onmouseover", "myLittleFunction(x)");  

Da dem IE das setAttribute ja nicht bekömmlich ist folgender Code:

  
     for(var x = 0; x < planetData.rawmaterials.length; x++){  
            myLittleFunction(x);  
            htmlcell.onmouseover =  function(){myLittleFunction(x);};  
    }  

Ich übergebe in diesem Falle keine Daten aus dem JSON sondern einfachhalber
nur 'x'.
Bei Seitenaufbau mit 2 Objekten in der Liste passiert folgendes:
-alert mit 0
-alert mit 1

Und sobald ich nun mit der Maus über die Zelle fahre (egal ob die erste oder zweite)
-alert mit 2

Mir ist nun klar dass x einfach weiter iteriert wurde und er auf dieses x verweist aber, ich such seit 2 Tagen eine Möglichkeit nicht die variable sondern nur ihren Wert zu übergeben. Ich habst mit eval(x), '' + x, String(x), new String(x), x.toString() versucht. Ich hab Javascripts geladen und JSON.stringify drauf ausgeführt und alles mit dem selben Ergebnis er verwendet immer nur die Variable und damit den letzten Wert der auf die Variable gesetzt ist.

Über Listeners hab ichs auch ned hingekriegt:

  
        toField.attachEvent('on' + listenerType, functionToDo);  
        toField.addEventListener(listenerType, functionToDo, false);  

Nun hab ich zwar eine Reihe von Zellen mit verschiedenen Icons und Werten (das heißt ich iteriere richtig) aber der Tooltip zeigt in jeder Zelle den Wert der letzten Zelle.

  1. Hallo,

    das ist hier eine häufig gestellte Frage und du findest eine Antwort im Archiv unter den Suchbegriffen Closure und Schleifen.

    Z.B.
    http://forum.de.selfhtml.org/archiv/2012/1/t208566/
    http://forum.de.selfhtml.org/archiv/2006/12/t141557/

    Du kannst z.B. folgendes tun:

    function createHandler (x) {  
      return function () {  
        myLittleFunction(x);  
      };  
    }  
      
    for (var x = 0, l = planetData.rawmaterials.length; x < l; x++) {  
      htmlcell.onmouseover = createHandler(x);  
    }
    

    Das erzeugt mit jedem Schleifendurchlauf eine Funktion, welche den aktuellen Wert der Variable x einschließt, nicht die Variable selbst (denn dessen Wert ändert sich daraufhin).

    Genauere Erklärungen dazu findest du wie gesagt im Archiv.

    Grüße,
    Mathias

    1. Danke werd mir das durchlesen und sorry ich hab die Suchfunktion genutzt (Auch google vorher) aber anscheinend mit den falschen Suchbegriffen.

    2. Funktioniert einwandfrei, dange vielmals :)

      kann geschlossen werden ;)