Ihre zugrunde liegende Problem ist, dass th Die Variable, die innerhalb des onclick
Callbacks IdString
verwendet wird, hat seine Deklaration hoisted an den Anfang des aktuellen Bereichs, dh die Funktion, in der es ausgeführt wird. Das bedeutet, dass jedes Mal, wenn Sie innerhalb der Schleife sind, dessen Wert überschrieben wird - es ist funktional gleich wie folgt aus:
var IdString;
var RelevantDiv = document.getElementById("RelevantDiv");
for (var i = 0; i < 5; i++) {
for (var j = 0; j < 5; j++) {
var NewButton = document.createElement("NewButton");
IdString = "ID" + i + "_" +j;
NewButton.onclick = function() { DoStuff(IdString) };
RelevantDiv.appendChild(NewButton);
}
}
Sie müssen sicherstellen, dass Sie den richtigen Wert von IdString
zu erfassen, wenn Sie es brauchen, das ist typischerweise durch die Verwendung eines Verschlusses getan:
var RelevantDiv = document.getElementById("RelevantDiv");
for (var i = 0; i < 5; i++) {
for (var j = 0; j < 5; j++) {
(function(IdString) {
var NewButton = document.createElement("NewButton");
NewButton.onclick = function() { DoStuff(IdString) };
RelevantDiv.appendChild(NewButton);
})("ID" + i + "_" +j)
}
}
Hier schaffen wir eine weitere innere Funktion einen neuen Rahmen zu schaffen, jeden einzelnen IdString
Wert zu halten. Es wird dann sofort mit dem richtigen Wert für jede Iteration der Schleifen aufgerufen. IdString
wird dann in diesem Abschluss erfasst, und der korrekte Wert wird innerhalb des Rückrufs onclick
verwendet.
Alternativ können Sie bind the argument im Moment wissen Sie, was der entsprechende Wert ist:
var RelevantDiv = document.getElementById("RelevantDiv");
for (var i = 0; i < 5; i++) {
for (var j = 0; j < 5; j++) {
var NewButton = document.createElement("NewButton");
NewButton.onclick = DoStuff.bind(null, "ID" + i + "_" +j);
RelevantDiv.appendChild(NewButton);
}
}
Damit entfällt sowohl mit den inneren Funktionen und weisen direkt auf das onclick
Ereignis zu einer Kopie die DoStuff
Funktion, die das richtige Argument haben wird.
In welcher Umgebung laufen Sie? Ist ES2015 verfügbar? Ein einfacher Wechsel von 'var' zu' let' würde helfen, wenn dies der Fall ist. –
@JamesThorpe muss für so viele Browserversionen wie möglich funktionieren. – IntegrateThis