• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] Button: Onclick wird beim Erstellen ausgeführt

Rupert

New member
Hallo zusammen,

in einer dynamisch gefüllten Tabelle erzeuge ich für jede Zeile einen Button:
Code:
            var knopf = document.createElement("BUTTON");
            Spalte.appendChild(knopf);
            knopf.setAttribute("click",alert("123"));
            // knopf.addEventListener("click",alert("123"));
            // knopf.onclick = alert("123");
            var t = document.createTextNode("Klick");
            knopf.appendChild(t);

Das Problem: Egal welche der drei Methoden zum Erstellen des OnClick-Ereignisses verwendet wird, wird das Ereignis beim Erstellen des Buttons aufgerufen, nicht jedoch beim Anklicken.
 
Erklärung: JS wertet Zuweisungen von rechts nach links und Funktionsaufrufe von innen nach außen aus. Bei dir wird also, wie du schon beobachtet hast, die Funktion ausgeführt und dann der Rückgabewert der Funktion zugewiesen bzw. als Parameter an die Funktion weitergegeben. Du musst also eine Referenz auf eine Funktion verwenden. Das kannst du über eine anonyme Funktion machen oder einfach über die Variable, die die Funktion enthält (ja, alert ist eine Variable - so kannst du alert = 1; schreiben und hast damit die Referenz auf diese Funktion überschrieben).

Code:
funktion test(){
	alert(123);
}
knopf.addEventListener("click", test);
PS: addEventListener ist viel leichter zu warten und stabiler, da man darüber einfacher mehrere Funktionen an ein Event binden kann.
 
Zu früh gefreut. Meine Funktion benötigt leider einen Aufrufparmeter, der sich mit jeder Zeile ändert.
Code:
knopf.onclick = function(param) {
  alert(param);
};
gibt immer den gleichen Wert aus, obwohl jeder Button beim Erstellen einen anderen Wert erhält. Ich habe es mal mit einer einfachen Schleife von 1-5 probiert, dann ist der Wert in allen Zeilen 5.

BTW: Ich habe auch die zweite Methode mit
Code:
knopf.addEventListener("click", test);
ausprobiert. Diese Methode wird auch beim Erstellen des Buttons aufgerufen, was nicht sein soll.
 
Zurück
Oben