eugen: onclick wird automatisch ausgeführt

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

  1. 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

    1. Ich danke dir!

  2. 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?
    
  3. [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)