Mike: document.createElement event

Hi,

ich habe das gleiche Problem wie hier http://forum.de.selfhtml.org/archiv/2005/8/t113733/ und versucht mir aus der Lösung etwas zusammenzureimen.

Letztendlich funktioniert es jetzt zwar mit:
newRow.onclick= new Function('xyz','this.bgColor="#D9D9F0"');

Aber gefallen tut es mir nicht richtig, wohl weil ich es nicht richtig verstehe.

1. Es wird eine neue Funktion bei jeder reihe geschrieben, diese heisst dann auch immer xyz. Mehrere Funktionen alle gleichen Namen?

2. Warum überhaupt eine Funktion? im Text kam ja auch die mögliche Antwort auf: newRow.setAttribute("onmouseover","this.bgColor='#FF0000'","false");

Das hätte mit wesentlich besser gefallen, aber das funktioniert ja nicht.
Gibt es dennoch so eine ähnnliche Möglichkeit ohne Funktion zu erzeugen?

Gruss
Mike

  1. Hi,

    Letztendlich funktioniert es jetzt zwar mit:
    newRow.onclick= new Function('xyz','this.bgColor="#D9D9F0"');

    Aber gefallen tut es mir nicht richtig, wohl weil ich es nicht richtig verstehe.

    1. Es wird eine neue Funktion bei jeder reihe geschrieben, diese heisst dann auch immer xyz. Mehrere Funktionen alle gleichen Namen?

    Die "Benamung" der Funktion ist entbehrlich. Du kannst auch eine "anonyme" Funktion verwenden, also schreiben
    element.onlick = function() { this.xy = "abc"; }

    1. Warum überhaupt eine Funktion?

    Weil Eventhandlerattribute in der JavaScript-Repraesentation eines HTML-Elements nun mal Funktionsreferenzen als Wert erwarten.

    Gibt es dennoch so eine ähnnliche Möglichkeit ohne Funktion zu erzeugen?

    Wozu?

    Du kannst natuerlich auch die Funktion erst ein Mal definieren, mit einem Namen versehen,
    function xyz() { ... }
    und dann den Eventhandlern verschiedener Elemente zuweisen,
    element1.onblubb = xyz;
    element2.onblubb = xyz;

    Damit ersparst du dem Client zumindest, jedes Mal eine neue anonyme Funktion zu erzeugen.

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
  2. ich habe das gleiche Problem wie hier http://forum.de.selfhtml.org/archiv/2005/8/t113733/ und versucht mir aus der Lösung etwas zusammenzureimen.

    Aber nicht aus meiner http://forum.de.selfhtml.org/archiv/2005/8/t113733/#m722554

    Letztendlich funktioniert es jetzt zwar mit:
    newRow.onclick= new Function('xyz','this.bgColor="#D9D9F0"');

    Warum das veraltete bgColor?

    1. Warum überhaupt eine Funktion? im Text kam ja auch die mögliche Antwort auf: newRow.setAttribute("onmouseover","this.bgColor='#FF0000'","false");

    Das hätte mit wesentlich besser gefallen, aber das funktioniert ja nicht.

    Ich sehe zwar nicht warum das besser gefällt, aber funktionieren tut es nur im IE nicht, es ist aber im Prinzip auch nicht richtig. Die Eventhandler erwartet eine Funktionsreferenz, die beim eintreten des Events aufgerufen wird. Da du offensichtlich die gleiche Funktion mehrmals verwenden willst, kannst du auch eine normale Funktion verwenden, wie Chris schon zeigte.

    function changeBgColor(e) {  
    this.style.backgroundColor='#FF0000';  
    }  
    /*...*/  
      
    // und dann immer wenn du den Event zuweisen möchtest  
    newRow.onclick= changeBgColor;  
    
    

    Struppi.

  3. newRow.onclick= new Function('xyz','this.bgColor="#D9D9F0"');

    1. Es wird eine neue Funktion bei jeder reihe geschrieben, diese heisst dann auch immer xyz. Mehrere Funktionen alle gleichen Namen?

    Nur zur Info: Da verstehst du etwas falsch. new Function erzeugt einfach ein Funktionsobjekt ohne "Namen", es gibt die Funktion einfach zurück und erst dann speichert man sie irgendwo unter einem Namen.

    Das "xyz" im obigen Beispiel hat eine ganz andere Bedeutung. Es ist ein Parameter, den die Funktion entgegennimmt! Man verwendet new Function so:
    new Function("parameter1", "parameter2", ... "parameterN", "Funktionskörper")

    Aber das brauchst du wie gesagt gar nicht und der Parameter xyz ist in dem Fall ohnehin unnötig. (Die Handlerfunktion bekommt das Event-Objekt als ersten und einzigen Parameter, das verwendest du nicht, und xyz wäre ein doofer Variablenname dafür.)

    1. Warum überhaupt eine Funktion?

    Weil so das traditionelle Event-Handling seit 1995 funktioniert.
    Das DOM, also das dynamische Setzen von Attributen an HTML-Elementknoten, kam erst viel später und daher ist .onclick = "string" bzw. setAttribute("onclick", "string") nicht so breit unterstützt.
    http://redaktion.selfhtml.org/selfhtml-preview/javascript/einbindung.html#fehler-code-als-string

    Mathias

  4. Hi,

    danke an alle, nun habe ich es verstanden.

    Interessant wie sich euere Anworten ergänzen, tatsächlich brachte jede einzeln und dann zusammen genommen Licht ins Dunkel.

    @struppi
    Ich benutze kein bgColor, das war nur als Beispiel aus dem Thread, stellvertretend für irgendein event.

    Gruss
    Mike