Ralf: Code dynamisch einem Eventhandler zuweisen

Hallo!

Ich habe hier im Forum schon einige Lösungen gefunden, wie man einem Eventhandler (z.B. onclick) einen Funktionsaufruf zuweist. Aber leider ist mir das alles noch zu statisch (oder ich habe die Lösung nicht gefunden).

Mein Problem: Ich möchte beliebigen Javascript Code, der z.B. einem Input-Feld entnommen wird, einem Eventhandler zuweisen. Eigentlich exakt so, wie das auch beim onClick-Attribut mit HTML möglich ist.

Wenn also jemand in meiner Seite eingibt: alert('click');

Dann soll genau das ausgeführt werden, wenn der entsprechende Handler in Aktion tritt. Folgendes funktioniert:

  
fname = "alert";  
fwert = "click";  
meinobjekt.onclick = function () {window[fname](fwert)};  

Aber das wäre schon zu statisch, da ich x-beliebigen Code ausführen möchte (auch mit dem Risiko von Fehlern).

Kann man nicht dem onclick Objekt den Funktionscode variabel zuweisen? Ich kann ihn doch auch mit meinobjekt.onclick.toString() auslesen ...

Ralf

  1. hi,

    Aber das wäre schon zu statisch, da ich x-beliebigen Code ausführen möchte (auch mit dem Risiko von Fehlern).

    Dann könntest du eval nutzen - mit allen Risiken.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo,

      Dann könntest du eval nutzen - mit allen Risiken.

      Ich hatte eval() bis jetzt nur als Mittel zur Berechnung von Ausdrücken angesehen. Zumindest bei ein paar Beispielen hat es mit eval() funktioniert. Anscheinend genau so wie mit dem String bei setTimeout(). Interessant ...

      Vielen Dank!

      Ralf

  2. Hallo,

    var codestring = "alert('click');";
    meinobjekt.onclick = new Function(codestring);

    Ist aber letztlich auch nur eine Form von eval().

    Mathias

    1. Hallo,

      var codestring = "alert('click');";
      meinobjekt.onclick = new Function(codestring);

      Das quittiert mir der Firefox mit: "missing { before function body"

      Ralf

      1. Hi,

        meinobjekt.onclick = new Function(codestring);
        Das quittiert mir der Firefox mit: "missing { before function body"

        molily hat lediglich einen Parameter vergessen, der im Function()-Konstruktor die zu übergebenden Parameter spezifiziert. Die etwas merkwürdige Fehlermeldung resultiert daraus, dass es eben wirklich nur ein schönheitsoperiertes evil()[1] ist.

        Cheatah

        [1] Entschuldigung, eval() natürlich :-)

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hallo,

          molily hat lediglich einen Parameter vergessen, ...

          Es war mein Fehler - ich hatte "function" statt "Function" geschrieben. Kleine Ursache - große Wirkung ;)

          Ggü. eval() sieht es aber auf jeden Fall optisch besser aus ...

          Ralf

        2. Hallo,

          meinobjekt.onclick = new Function(codestring);
          Das quittiert mir der Firefox mit: "missing { before function body"

          molily hat lediglich einen Parameter vergessen

          Alle Parameter sind optional, ein Parameter ist dann der Funktionskörper:

          »new Function(p1, p2, ... , pn, body)

          The last argument specifies the body (executable code) of a function; any preceding arguments specify formal parameters.

          When the Function constructor is called with some arguments p1, p2,..., pn, body (where n might be 0, that is, there are no "p" arguments, and where body might also not be provided), the following steps are taken: (...)«

          (ECMAScript)

          Mathias

          1. Hi,

            Alle Parameter sind optional, ein Parameter ist dann der Funktionskörper:

            ah, das hatte ich bisher anders wahrgenommen. Danke für die Aufklärung.

            (ECMAScript)

            Weiterleitung auf http://bclary.com/build/update.

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
  3. Hi,

    fname = "alert";
    fwert = "click";
    meinobjekt.onclick = function () {windowfname};

      
    schau Dir mal die Methode bind() von [prototype.js](http://www.prototypejs.org/) an. Liefert recht interessante Möglichkeiten.  
      
    Cheatah  
    
    -- 
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|  
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html  
    X-Will-Answer-Email: No  
    X-Please-Search-Archive-First: Absolutely Yes
    
    1. Hallo,

      schau Dir mal die Methode bind() von prototype.js an. Liefert recht interessante Möglichkeiten.

      Ich habe mir mal ansatzweise den Artikel Organisation von JavaScripten angesehen. Schon der übersteigt meine derzeitigen Fähigkeiten um einiges. Darin wird auch auf bind() verwiesen und ich ahne, was man alles machen kann ...

      Ralf

      1. Hi,

        Ich habe mir mal ansatzweise den Artikel Organisation von JavaScripten angesehen. Schon der übersteigt meine derzeitigen Fähigkeiten um einiges.

        im Ernst: Das ist nicht schlimm. JavaScript ist nicht die niedliche kleine Zusammenklick-Formularprüfungs-und-User-nerv-Spielerei, sondern eine vollwertige, objektorientierte Programmiersprache mit hochgradig anspruchsvollen Möglichkeiten. Die fehlende Plattformunabhängigkeit (also die Crossbrowser-Problematik) tut ihr übriges, um ihre Nutzung zu erschweren. Nach meiner Erfahrung lohnt es sich aber, die Zeit und Mühe aufzuwenden.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes