Malte: Zähler-Wert in for-Schleife an anonyme Fkt übergeben

Hallo,
ich füge mehreren Elementen durch eine for-Schleife ein Event als
anonyme Funktion hinzu und möchte für jeden Schleifen-Durchlauf den aktuellen
Zähler-Wert gewissermaßen "einfrieren", weil ich diesen für den Inhalt der
jeweiligen Funktion benötige - Beispiel:

  
var wrapper = document.getElementById('wrapper'),  
    elems = wrapper.getElementsByTagName('div'),  
    i;  
  
for (i=0; i<elems.length; i++) {  
    elems[i].onclick = function() {set_color(i);}  
}  

Dieses Beispiel funktioniert natürlich nicht, weil der Zähler i den Wert
des letzten Durchlaufs der Schleife haben wird, sobald onclick in Kraft tritt.

Wie kann ich für z.B. elems[7] diese 7 möglichst einfach "retten" in die
anonyme Funktion?
Bestimmt ist die Lösung ganz einfach, aber stehe gerade total auf'm Schlauch...

Lieben Dank,
Malte

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

    Wie kann ich für z.B. elems[7] diese 7 möglichst einfach "retten" in die
    anonyme Funktion?

    Es gibt mehrere Möglichkeiten.

    Die "klassische" Version mit Closure sieht in Etwa so aus:

    https://forum.selfhtml.org/?t=206574&m=1402637

    (wobei man das mit einer Hilfsfunktion vereinfachen kann, wenn man diese konstrukte des Öfteren verwendet)

    oder einfacher in der Schleife dem Element einfach eine Eigenschaft anhängen:

    elems[i].countervalue = i;

    diese Eigenschaft kann man dann über die Elementreferenz, die man beim Kilck ja hat, einfach wuieder auslesen.

    Stur lächeln und winken, Männer!
    Kai

    --
    Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken
    in Richtung "Mess up the Web".(suit)
    SelfHTML-Forum-Stylesheet
    1. [latex]Mae  govannen![/latex]

      Und wieder hab ich ungeschickt
      den Sendeknopf zu früh gedrückt
      Bevor mich also and're plagen
      möchte ich jetzt schnell noch sagen
      daß dies nicht alle Wege waren
      die Variablenwerte zu bewahren
      Jedoch, so denk ich auf die Schnelle
      reicht es für fast alle Fälle
      Und fragst du dich nach weit'rem "wie"
      erklärt es vielleicht molily.

      Stur lächeln und winken, Männer!
      Kai

      --
      Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken
      in Richtung "Mess up the Web".(suit)
      SelfHTML-Forum-Stylesheet
      1. [latex]Om~nah~hoo~pez~nyeetz,~Kai345![/latex]

        YMMD!

        Matthias

        --
        1/z ist kein Blatt Papier. http://www.billiger-im-urlaub.de/kreis_sw.gif
      2. Vielen Dank für Hülf und Reime
        da werd ich gleichma loslegen
        die zähler zwingen hier daheime
        sich in die anonyme Funktion zu bewegen.

        :-}

  2. Hallo,

    Wie kann ich für z.B. elems[7] diese 7 möglichst einfach "retten" in die anonyme Funktion?

    Je nachdem, was du vorhast, gibt es, Kai hat es schon angedeutet ;), Alternativen zum Erzeugen von Closures und dem Speichern der Daten beim Element.

    Wenn du in set_color ohnehin nur elems[i] benötigst, kannst du die Sache vereinfachen und set_color direkt das angeklickte Element übergeben.

    elems[i].onclick = function () {  
      set_color(this);  
    };
    

    Siehe Zielelement des Events.

    Oder du definierst set_color direkt als Handler-Funktion, dann verweist this darin auf das Element:

    elems[i].onclick = set_color;  
      
    function set_color () {  
      this.style.color = 'red';  
    }
    

    Oder du überwachst sämtliche click-Ereignisse beim Wrapper (Event-Delegation) und kannst auf die Schleife verzichten:

    http://jsfiddle.net/saHkb/

    Mathias