2010-12-27 11 views
1

Ich weiß nicht, wie ich es nennen soll, aber was ich will, ist diese Änderungsfunktion für jeden Tag der Woche zu haben.Ich bin nicht in der Lage, mehrere Ereignisse zu loopen und zu erstellen

Ist etwas falsch mit meiner Verkettung? Die Schleife funktioniert definitiv und ich bekomme die Werte aus dem Array.

+0

Was funktioniert nicht? Aus dem obigen Text geht nicht hervor. Ist es auch möglich, dass mehrere Wochentags-Checkboxen gleichzeitig in Ihrer Benutzeroberfläche aktiviert sind? – Adrian

+0

Entschuldigung. Das Änderungsereignis passiert nicht .... Ich meine wenn ich die Tage manuell in die Selektoren schreibe funktioniert es. Also ich denke, es ist meine Verkettung. – Adam

Antwort

2

Wenn Sie eine Funktion innerhalb einer Schleife in Javascript verwenden und die Funktion die Schleifenvariable verwendet, erfasst sie die Variable selbst, nicht den aktuellen Wert. Am Ende der Schleife ist die Variable der letzte Wert, den i erreicht. Sie müssen alles in eine andere Funktion einfügen und den aktuellen Wert der Variablen an diesen übergeben.

for(i=0;i<daysofweek.length;i++){ 
    (function(i) { 
    $("input[name=" + daysofweek[i] + "]").change(function() { 
     if($(this).is(':checked')) { 
     $("#" + daysofweek[i] + "_content").show(); 
     } else { 
     $("#" + daysofweek[i] + "_content").hide(); 
     }  
    }); 
    })(i); //loop through all days of the week creating the event that show/hides days 
} 
+0

Dies funktioniert sicherlich, aber es könnte durch die Wiederverwendung einer einzelnen benannten Funktion verbessert werden, anstatt eine identische anonyme Funktion in jeder Iteration der Schleife zu konstruieren. – user113716

2

Sie verlieren den richtigen Wert von i, weil es in der for Schleife nicht scoped ist.

Sie könnten use $.each() instead, die einen Verschluss schafft:

$.each(daysofweek, function(i, val) { 
    $("input[name=" + daysofweek[i] + "]").change(function() { 
     if (this.checked) { 
      $("#" + daysofweek[i] + "_content").show(); 
     } else { 
      $("#" + daysofweek[i] + "_content").hide(); 
     } 
    }); //loop through all days of the week creating the event that show/hides days 
}); 

Auch ich $(this).is(':checked')-this.checked geändert. Es ist viel schneller.

Sie können auch ein Bit by using .toggle() anstelle von show/hide vereinfachen.

$.each(daysofweek, function(i, val) { 
    $("input[name=" + daysofweek[i] + "]").change(function() { 
     $("#" + daysofweek[i] + "_content").toggle(this.checked); 
    }); //loop through all days of the week creating the event that show/hides days 
}); 
+1

Wenn Sie 'each' verwenden, können Sie' val' anstelle von 'daysofweek [i]' schreiben. – Chuck

+0

@Chuck: Sehr wahr. Jeder der Parameter könnte geschlossen sein, und "val" würde eine Eigenschaftensuche speichern. – user113716

1

Variablen werden nicht in JavaScript Block-scoped, so dass die Funktionen Sie auf die Änderung() Methode übergeben werden den gleichen Wert von i alle haben.

Verwandte Themen