onclick wird automatisch ausgeführt
eugen
- javascript
Hallo
ich will per Greasemonkey (Firefox) ein Button erstellen, der eine Funktion beim Anklicken ausführt. Doch leider führt er die Funktion bei mir immer aus (also schon bevor ich geklickt habe).
var links2 = document.createElement("button");
links2.setAttribute('onClick',send(lagerFreiraum)); //bei onclick passiert dasselbe
var buttonText = document.createTextNode(lagerFreiraum);
links2.appendChild(buttonText);
var td = document.getElementsByTagName("tr")[i].getElementsByTagName("td")[j];
var td_a = td.getElementsByTagName("br")[1];
td.insertBefore(links2, td_a);
function send(lF){
alert(lF);
}
Würde mich über Hilfe freuen
lg
eugen
Hallo,
links2.setAttribute('onClick',send(lagerFreiraum)); //bei onclick passiert dasselbe
Häufiger Fehler: Handler-Funktion direkt aufrufen
Du solltest besser addEventListener verwenden. In jedem Fall musst du ein Funktionsobjekt übergeben. Das ist beim Aufrufen von send natürlich nicht der Fall. send(lagerFreiraum) gibt wahrscheinlich undefined zurück, aber kein Funktionsobjekt.
Du kannst eine Closure erzeugen, indem du eine Funktion notierst, die dir eine Funktion zurückgibt. Dabei wird der übergebene Parameter eingeschlossen und steht der zurückgegebenen Funktion zur Verfügung:
links2.addEventListener('click', makeSend(lagerFreiraum), false);
function makeSend (1F) {
return function send () {
alert(1F);
};
}
Dasselbe lässt sich auch einfach schreiben. Du kannst bind benutzen, um eine Funktion zu erzeugen, die den Parameter übergeben bekommt:
links2.addEventListener('click', send.bind(this, lagerFreiraum), false);
In der funktionalen Programmierung nennt man dieses Verfahren Currying oder Schönfinkeln. Siehe auch http://www.peterkroener.de/ecmascript-5-die-nachste-version-von-javascript-teil-6-function-prototype-bind/.
Mathias
Hi,
ich will per Greasemonkey (Firefox) ein Button erstellen, der eine Funktion beim Anklicken ausführt. Doch leider führt er die Funktion bei mir immer aus (also schon bevor ich geklickt habe).
„Er“ ist nicht Schuld, du selber rufst die Funktion auf:
var links2 = document.createElement("button");
links2.setAttribute('onClick',send(lagerFreiraum)); //bei onclick passiert dasselbe
- genau hier.
Funktionsname-gefolgt-von-rundern-Klammern ist nun mal die Syntax zum \*Aufrufen\* einer Funktion.
Übergebe nur die Referenz auf die Funktion - also nur den Funktionsnamen, ohne runde Klammern dahinter.
Wenn du noch einen Parameter dabei übergeben musst, dann kannst du dich einer anonymen Funktion bedienen, Stichwort Closure.
MfG ChrisB
--
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
[latex]Mae govannen![/latex]
links2.setAttribute('onClick',send(lagerFreiraum));
Hier wird die Funktion durch die Notation `send(lagerFreiraum)`{:.language-javascript}direkt ausgeführt.
Du solltest entweder die Funktion als Zeichenkette schreiben
`links2.setAttribute('onClick','send(' + lagerFreiraum + ')');`{:.language-javascript}
oder besser auf `setAttribute()`{:.language-javascript} verzichten, sondern die Funktionsreferenz direkt zuweisen
`links2.onclick = function () {send(lagerFreiraum);};`{:.language-javascript}
Stur lächeln und winken, Männer!
Kai
--
Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken
in Richtung "Mess up the Web".([suit](https://forum.selfhtml.org/?t=197497&m=1324775))
[SelfHTML-Forum-Stylesheet](http://selfhtml.knrs.de/#h_stylesheet)