Ergebnis 1 bis 15 von 15
  1. #1
    sacharja ist offline Mitglied
    registriert
    14-01-2006
    Beiträge
    30

    Event Auslöser (Callee von Event Objekt)?

    Hallo,
    kann man von einem event (egal was für eins) die verantwortliche Funktion/Quelltext aufrufen?


    Oder wie komme ich von meinem Event Objekt zum callee?

  2. #2
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Event Auslöser (Callee von Event Objekt)?

    was meinst du mit callee?

    Was ist die verantwortliche Funktion bei
    PHP-Code:
    onevent = function(e) { ..} 
    ?

  3. #3
    sacharja ist offline Mitglied
    registriert
    14-01-2006
    Beiträge
    30

    AW: Event Auslöser (Callee von Event Objekt)?

    Ich möchte quasi zu einem Event das aufgetreten ist die verantwortliche Funktion, die es auslöste, bearbeiten.

  4. #4
    cybaer ist offline Kaiser
    registriert
    12-09-2006
    Beiträge
    1.338

    AW: Event Auslöser (Callee von Event Objekt)?

    Zitat Zitat von sacharja Beitrag anzeigen
    Hallo,
    kann man von einem event (egal was für eins) die verantwortliche Funktion/Quelltext aufrufen?
    Ja.

    Oder wie komme ich von meinem Event Objekt zum callee?
    Der Caller ist in target bzw. srcElement spezifiziert. Und über den Caller kannst Du dann natürlich auch auf den Code zugreifen.

    Beispiel:

    Code:
    <title>Event-Test</title>
    
    <script type="text/javascript">
    
     // Funktion zum Testen (gibt eigenen Quelltext aus)
     function myFunc() {
      text(arguments.callee.toString());
     }
    
     // Ausgabe in der TEXTAREA
     function text(data) {
      var taObj=document.getElementsByTagName('textarea')[0];
      if(data) {
       taObj.value+=data+"\r\n------------------------------------------------------\r\n";
      } else {
       taObj.value="";
      }
     }
    
     // -------------------------------------------------------------
    
     // Funktion zum Analysieren der Events
     function examineEvents(e) {
      var eventName, eventObj, eventAttrib, eventFunc;
      var calledFuncName="", calledSrc="";
    
      // Event ermitteln
      e=window.event || e;
    
      // Objekt des Events ermitteln
      eventObj=e.target || e.srcElement;
      // Workaround fuer Safari-Bug
      if(eventObj.nodeType==3) { eventObj=eventObj.parentNode; }
    
      // Namen des Events ermitteln
      eventName="on"+e.type;
    
      // HTML-Event-Attribut auslesen
      eventAttrib=eventObj.getAttribute(eventName);
      // IE-Fehlbehandlung abfangen
      if(eventAttrib && typeof(eventAttrib)=="function") {
       // In String umwandeln
       eventAttrib=eventAttrib.toString();
       // Wurde der Event im HTML-Attribut notiert?
       if(eventAttrib.indexOf("function anonymous")==0) {
        // Ja: Wirklichen Inhalt des Attributs ermitteln
        eventAttrib=eventAttrib.substring(eventAttrib.indexOf("{")+2);
        // ...  zwischen den auesseren Klammern ist der eigentliche Code (der vom Event aufgerufen wird)
        eventAttrib=eventAttrib.substring(0,eventAttrib.lastIndexOf("}")-1);
       } else {
        // Nein: Variable loeschen
        eventAttrib=null;
       }
      }
    
      // -------------------------------------------------------------
    
      // Wenn Event tatsaechlich im HTML-Attribut notiert wurde
      if(eventAttrib) {
       // Hier wird einfachst Namen der einzigen Funktion ermittelt (das waere bei
       // mehreren Funktionen/unterschiedlichen Parametern entsprechend aufwendiger)
       calledFuncName=eventAttrib.replace("event","").replace("();","");
       // Funktionsobjekt, das beim Event ausgefuehrt wird
       eventFunc=window[calledFuncName];
       // Den Code dieser Funktion auslesen (Funktionen sind ein Unterobjekt von window)
       calledSrc=eventFunc.toString();
      } else {
      // Event wurde direkt via JS notiert
       // Wenn zum Event der Eventhandler existiert (beim "Bubbeln" ist dies meistens ja nicht der Fall) ...
       if(eventObj[eventName]) {
        // Funktionsobjekt, das beim Event ausgefuehrt wird
        eventFunc=eventObj[eventName];
        // Sourcecode ermitteln
        calledSrc=eventFunc.toString();
        // Bereich vor der 1. Klammer ausschneiden (enthaelt ggf. den Funktionsnamen)
        calledFuncName=calledSrc.substring(0,calledSrc.indexOf("("));
        // Moegliche weiße Zeichen entfernen
        while(calledFuncName.charAt(0)==" " || calledFuncName.charAt(0)=="\t" || calledFuncName.charAt(0)=="\n" || calledFuncName.charAt(0)=="\r") { calledFuncName=calledFuncName.substring(1); }
        // Das "function" entfernen
        calledFuncName=calledFuncName.substring(8);
        // Moegliche Leerzeichen entfernen
        while(calledFuncName.charAt(0)==" ") { calledFuncName=calledFuncName.substring(1); }
        // calledFuncName enthaelt jetzt den Namen der Funktion,
        // bzw. ist leer, wenn es sich um eine anonyme Funktion gehandelt hat
       }
      }
    
      // Infos ausgeben, wenn Sourcecode (und damit Eventhandler) vorhanden
      if(calledSrc) {
       // Jeder Event wird doppelt gelistet, wenn diese Funktion sowohl direkt, als auch indirekt (durchs "Bubbeln") aufgerufen wird
       text(eventObj.tagName.toLowerCase()+" ["+eventObj.innerHTML+"] "+eventName+" -> "+((calledFuncName)?(calledFuncName+"()"):"Anonyme Funktion")+" (Länge: "+calledSrc.length+" Bytes)");
      }
     }
    
     // -------------------------------------------------------------
    
     // Nach dem Laden
     window.onload=function() {
      // Beim 2. SPAN einen Eventhandler auf die myFunc-Test-Funktion setzen
      document.getElementsByTagName('span')[1].onmouseout=myFunc;
      // Beim 4. SPAN einen Eventhandler auf den "Examiner" setzen
      document.getElementsByTagName('span')[3].onmouseup=examineEvents;
      // Beim BUTTON einen Eventhandler auf eine anonyme Funktion zum Loeschen der TEXTAREA setzen
      document.getElementsByTagName('button')[0].onclick=function() { document.getElementsByTagName('textarea')[0].value=""; }
    
    
      // Events global abfangen & untersuchen:
      document.onmouseover=
      document.onmouseout=
      document.onmousedown=
      document.onclick=
      document.onmouseup=
      examineEvents;
    
     }
    </script>
    
    <body>
     <span onmouseover="myFunc();">Berühr mich (myFunc() via HTML-Code)!</span><br>
     <span>Verlaß mich (myFunc() via JS-Eventhandler)!</span><br>
     <span onmousedown="examineEvents(event);">Klick mich ('Examiner' via HTML-Code)!</span><br>
     <span>Klick mich ('Examiner' via JS-Eventhandler)!</span><br>
     <button>Löschen</button><br>
     <textarea style="width:98%; height:70%;" cols="70" rows="20"></textarea>
    </body>
    Das Funktions-Objekt (eventFunc) läßt sich natürlich auch separat aufrufen: eventFunc();

    Alternativ kannst Du das ganze auch auslagern (Stichwort: Event-Bubbling), falls kein Zugriff auf die Funktion selbst besteht, die ausgeführt werden soll. Dann muß an übergeordneter Stelle für jeden Event-Typ ein Handler installiert werden, der obige Auswertung vornimmt. Dies geschieht hier:

    Code:
      document.onmouseover=
      document.onmouseout=
      document.onmousedown=
      document.onclick=
      document.onmouseup=
      examineEvents;
    fängt z.b. ein paar Events ab.

    Edit: Code korrigiert und erweitert (s.u.)
    Geändert von cybaer (15-03-2007 um 09:34 Uhr)
    Gruß, Cybaer

  5. #5
    Cord Worthmann ist offline Routinier
    registriert
    27-07-2005
    Ort
    27356 Rotenburg
    Beiträge
    418

    Zum Verständnis

    arguments.callee ist ein Zeiger auf die aufgerufene Funktion (also im Zweifelsfall auf den Event-Handler selbst zeigend).

    arguments.caller (was Du wahrscheinlich suchst) hingegen enthält einen Zeiger auf die aufrufende Funktion.

    Zweiteres ist sehr nett und praktisch zum Aufbau eines Stacks aber leider seit JS/1.? deprecated und somit nicht mehr zu verwenden.

    Für eventuelles Debugging nimmst Du am besten den FF/1.x daher und verwendest dessen Error.stack Objekt, um verschiedentliche Fehler und deren Quellen zu lokalisieren.


    Grüsse
    Cord

  6. #6
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Zum Verständnis

    nicht arguments.calller, sondern FunktionsName.caller ist aber wirklich die Frage warum man sowas braucht und ob es nicht andere wege gibt.

  7. #7
    cybaer ist offline Kaiser
    registriert
    12-09-2006
    Beiträge
    1.338

    AW: Zum Verständnis

    Zitat Zitat von Cord Worthmann Beitrag anzeigen
    [Zweiteres ist sehr nett und praktisch zum Aufbau eines Stacks aber leider seit JS/1.? deprecated und somit nicht mehr zu verwenden.
    Ist seit 1.3 deprecated. Und schlimmer noch: arguments selbst ist seit 1.4 ebenfalls deprecated!
    Gruß, Cybaer

  8. #8
    cybaer ist offline Kaiser
    registriert
    12-09-2006
    Beiträge
    1.338

    AW: Zum Verständnis

    Zitat Zitat von ein schlauer Beitrag anzeigen
    nicht arguments.calller, sondern FunktionsName.caller
    Ersteres existiert, ist aber deprecated. Letzteres gibt es seit 1.5 - ist aber nicht standardisiert.
    Gruß, Cybaer

  9. #9
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Event Auslöser (Callee von Event Objekt)?

    OK, ich hab nur im FF getestet, Opera kennt die Eigenschaft auch nicht und in selfhtml stand es so, aber der IE 6 zumindest kennt tatsächlich arguments.caller

    [EDIT] Funktionsname.caller kennt auch der IE 6, Opera (9) scheint caller überhaupt nicht zu kennen.
    Geändert von ein schlauer (13-03-2007 um 10:15 Uhr)

  10. #10
    sacharja ist offline Mitglied
    registriert
    14-01-2006
    Beiträge
    30

    AW: Event Auslöser (Callee von Event Objekt)?

    Ja, Opera kennt caller nicht. "arguments.callee" kann man aber prima benutzen um anonyme Funktionen anzusprechen, was aber natürlich nur die Funktion selber liefert ich brauche es eine Ebene höher. Hab heute abend leider keine Zeit mehr cybaer Skript zu testen, aber werde morgen noch mal rumprobieren.

    Mein Thread Titel ist vlt etwas missverständlich. Hier also nochmal was ich genau machen möchte:
    Code:
    <script type="text/javascript">
    document.addEventListener('mouseover',function (e){//nefkt von hier umbenennen/ändern},false);
    </script>
    
    <div onmouseover='javascript:nefkt()'>ebbes</div>
    <script type="text/javascript">
    function nefkt(){//ebbes}
    </script>
    Ich möchte also jede Funktion, die beim "hovern" ausgeführt wird durch das 1. Skript verändern sprich umbenennen, so, dass ich diese Funktionen dann in anderen UserJS Scripts "bypassen" kann. Dazu bräuchte ich dann vom ersten Skript aus irgendwie Zugriff auf die "nefkt", wenns auch nur Lesezugriff ist.
    Geändert von sacharja (13-03-2007 um 21:00 Uhr)

  11. #11
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Event Auslöser (Callee von Event Objekt)?

    Also für mich klingt das eher so als ob du tasächlich das auslösende Objekt suchst, also das was cybaer dir beschrieben hat.

  12. #12
    cybaer ist offline Kaiser
    registriert
    12-09-2006
    Beiträge
    1.338

    AW: Event Auslöser (Callee von Event Objekt)?

    Zitat Zitat von sacharja Beitrag anzeigen
    Dazu bräuchte ich dann vom ersten Skript aus irgendwie Zugriff auf die "nefkt", wenns auch nur Lesezugriff ist.
    Du kannst "nefkt" auslesen, ändern oder auch komplett durch eine ganz andere Funktion ersetzen (die selbst durchaus auch "nefkt" aufrufen/beinhalten kann) ...
    Gruß, Cybaer

  13. #13
    cybaer ist offline Kaiser
    registriert
    12-09-2006
    Beiträge
    1.338

    AW: Event Auslöser (Callee von Event Objekt)?

    So, ich habe meinen oben geposteten Code korrigiert (lief nur im IE vollständig) und erweitert (für beliebige, auch anonyme, Event-Funktionen, ohne diese anpassen zu müssen).

    Ich habe nochmal bei arguments nachgelesen: Wahrscheinlich bezieht sich das deprecated nur auf arguments als Funktionseigenschaft. Als Ersatz dafür ist arguments jetzt und wohl auch zukünftig als lokale Variable abrufbar (und damit auch callee).

    D.h., wenn man nur den Inhalt der aufgerufenen Funktion haben möchte, kann man innerhalb dieser Funktion callee verwenden (im Beispiel macht das myFunc() - es gibt seinen Code in der TEXTAREA aus). (Im Beispiel wird nicht geprüft, welche von beiden Varianten der Browser unterstützt - wenn er callee überhaupt unterstützt.)

    Wenn man den Code beliebiger Event-Funktionen haben, oder diese zur Laufzeit verändern bzw. ersetzen möchte, dann kann man den Weg gehen, den examineEvents() beschreibt. Das funktioniert sowohl innerhalb der Funktion (examineEvents() wird ja als "normale" Eventfunktion in den "Klick-mich-Events" verwendet), wie auch außerhalb (in den verwendeten Events "wacht" examineEvents() von"außen" über die "eigentlichen" Event-Funktionen).

    Zu beachten ist noch, daß sowohl callee, als auch calledSrc in examineEvents() keinen browserübergreifend einheitlichen Code ausgeben (innerhalb eines Browsers ist das Ergebnis beider identisch).

    Erfolgreich getestet wurde in IE ab 5.5, Mozilla und Opera 9 ...
    Geändert von cybaer (15-03-2007 um 10:01 Uhr)
    Gruß, Cybaer

  14. #14
    sacharja ist offline Mitglied
    registriert
    14-01-2006
    Beiträge
    30

    AW: Event Auslöser (Callee von Event Objekt)?

    @cybaer
    Danke, werde es mal ausführlich testen. obj.onmouseover habe ich auch mit deinem Ansatz verwendet, aber eher zwangsweise, weil addEventListener('mouseover') erst nach addEventListener('DOMAttrModified') abgefeuert wird, obj.onmouseover dagegen davor. Jetzt muss ich nur noch testen was Opera ausgibt, wenn der original mouseover Befehl in einem nicht-zugänglichem Skript notiert ist (anstatt im Attribut).

    Was mir beim schnellen überfliegen deines Skriptes aufgefallen ist, dass du dir mit match() statt den ganzen Substrings und um den Funktionsnamen herauszufinden eine Menge Arbeit ersparen könntest

  15. #15
    cybaer ist offline Kaiser
    registriert
    12-09-2006
    Beiträge
    1.338

    AW: Event Auslöser (Callee von Event Objekt)?

    Zitat Zitat von sacharja Beitrag anzeigen
    obj.onmouseover habe ich auch mit deinem Ansatz verwendet, aber eher zwangsweise,
    Du solltest ggf. im Hinterkopf behalten, daß diese Notation mit allen Browsern (einheitlich) funktioniert. Solange nichts anderes explizit dagegen spricht, verwende ich sie also immer.

    Was mir beim schnellen überfliegen deines Skriptes aufgefallen ist, dass du dir mit match() statt den ganzen Substrings und um den Funktionsnamen herauszufinden eine Menge Arbeit ersparen könntest
    Ja, das ist mir schon klar. Und dem Smiley entnehme ich, daß dir auch klar ist, daß mir das wohl klar ist - womit ja alles geklärt wäre.
    Gruß, Cybaer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •