basti_p: eventhandler via script auslösen

Hallo,

gibt es eine Möglichkeit, eine via eventhandler angefügte Funktion im selben Kontext via Script auszuführen?

Bsp HTML:

<fieldset id="example">
<select onchange="test(this)">...

Bsp Javascript - vereinfacht!!!
for(childs in example){
var tmp=childs.onchange
...

in tmp habe ich jetzt einen Verweis auf die entsprechende Funktion.
Wie kann ich diese aus dem Script heraus aufrufen - also quasi

childs.onchange.execute;:-)

Gibts da eine Möglichkeit?

Danke und Grüße Basti

  1. Yerf!

    childs.onchange.execute;:-)

    childs.onchange ist also eine Funktion... und wie ruft man eine Funktion auf? ...richtig!

    childs.onchange();

    In deinem Fall muss man das noch erweitern:

    childs.onchange(childs);

    Damit wird dann auch der Parameter wie gewünscht übergeben.

    Gruß,

    Harlequin

    --
    <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
    1. Hallo,

      heißen Dank!

      Grüße Basti

  2. gibt es eine Möglichkeit, eine via eventhandler angefügte Funktion im selben Kontext via Script auszuführen?

    Das geht nicht. ein Inline Event wird im Kontext window ausgeführt, ein per JS zugefügter Event, im Kontext des Elementes.

    Bsp Javascript - vereinfacht!!!
    for(childs in example){
    var tmp=childs.onchange
    ...

    in tmp habe ich jetzt einen Verweis auf die entsprechende Funktion.

    Du hast u.U. eine Referenz auf die Funktion, die Funktion wird aufgerufen in dem du eine Klammer drumherum setzt.

    Struppi.

    1. Yerf!

      gibt es eine Möglichkeit, eine via eventhandler angefügte Funktion im selben Kontext via Script auszuführen?

      Das geht nicht. ein Inline Event wird im Kontext window ausgeführt, ein per JS zugefügter Event, im Kontext des Elementes.

      Hm, das bringt mich gerade etwas zum nachdenken... (ich muss zugeben, dass ich JavaScript immer noch nicht voll im Griff hab)

      Ich verwende bei einer Funktion folgenden Konstrukt:

        
      function xyz()  
      {  
        //[... viel Code]  
        var hori = document.createElement("tabel");  
        var verti = document.createElement("table");  
        var scrl = document.createElement("div");  
        //[... viel Code]  
        
        scrl.onscroll = function(){  
          hori.style.left = (-this.scrollLeft) + "px";  
          verti.style.top = (-this.scrollTop) + "px";  
          };  
        scrl.onscroll();  
      }  
      
      

      Ist hier scrl.onscroll(); kein Inline-Event-Aufruf, oder wieso bekomme ich innerhalb dieser Funktion mitels this das richtige Objekt (also scrl)?

      Oder erzeuge ich hier ein Sonderverhalten durch den Closure?

      Interessant ist auch, dass ein

        
      (scrl.onscroll = function(){  
        hori.style.left = (-this.scrollLeft) + "px";  
        verti.style.top = (-this.scrollTop) + "px";  
        })();  
      
      

      im FF ebenfalls funktioniert, aber im IE zum Fehler führt (this.scrollLeft existiert ist undefined).

      Gruß,

      Harlequin

      --
      <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
      1. Ist hier scrl.onscroll(); kein Inline-Event-Aufruf, oder wieso bekomme ich innerhalb dieser Funktion mitels this das richtige Objekt (also scrl)?

        Oh, mit inline meinte im HTML dort ist der Kontext erstmal window, d.h. wenn man die funktion aufruft ist in der Eventfunktion this = window im gegensatz zu dem von dir gezeigten.

        (scrl.onscroll = function(){
          hori.style.left = (-this.scrollLeft) + "px";
          verti.style.top = (-this.scrollTop) + "px";
          })();

        
        > im FF ebenfalls funktioniert, aber im IE zum Fehler führt (this.scrollLeft existiert ist undefined).  
          
        Evtl. hat nicht jedes Element per default die Eigenschaft scrollTop/Left, weiß ich aber grad auch nicht.  
          
        Struppi.
        
        1. Yerf!

          Oh, mit inline meinte im HTML dort ist der Kontext erstmal window, d.h. wenn man die funktion aufruft ist in der Eventfunktion this = window im gegensatz zu dem von dir gezeigten.

          Ah sorum, ok.

          (scrl.onscroll = function(){
            hori.style.left = (-this.scrollLeft) + "px";
            verti.style.top = (-this.scrollTop) + "px";
            })();

          
          > > im FF ebenfalls funktioniert, aber im IE zum Fehler führt (this.scrollLeft existiert ist undefined).  
          >   
          > Evtl. hat nicht jedes Element per default die Eigenschaft scrollTop/Left, weiß ich aber grad auch nicht.  
            
          Da aber die erstgezeigte Version mit dem eigenständigen Aufruf im IE geht muss dies eigentlich bedeuten, dass bei der 2. Variant im IE this != scrl ist (im FF aber trotzdem).  
            
          Wobei mir grad so auffällt, dass ich im Code sowieso statt this gleich scrl schreiben kann. Die Referenz bleibt mir ja analog zu hori/verti ebenfalls erhalten.  
            
            
          Gruß,  
            
          Harlequin  
            
          
          -- 
          <!--[if IE]>This page is best viewed with a webbrowser. [Get one today!](http://www.opera.com)<![endif]-->
          
          1. Evtl. hat nicht jedes Element per default die Eigenschaft scrollTop/Left, weiß ich aber grad auch nicht.

            Da aber die erstgezeigte Version mit dem eigenständigen Aufruf im IE geht muss dies eigentlich bedeuten, dass bei der 2. Variant im IE this != scrl ist (im FF aber trotzdem).

            Nein, der IE macht das analog wie Firefox, also this ist das Element wo der  event stattfand.

            Wobei mir grad so auffällt, dass ich im Code sowieso statt this gleich scrl schreiben kann. Die Referenz bleibt mir ja analog zu hori/verti ebenfalls erhalten.

            Ja, du hast aber dann u.U. memory leaks im IE.

            Struppi.

            1. Yerf!

              Nein, der IE macht das analog wie Firefox, also this ist das Element wo der  event stattfand.

              Aber anscheinend ist er unterschiedlicher Meinung über das "wo", je nachdem ob ich scrl.onscroll(); oder (scrl.onscroll = function(){...})(); schreibe. Wobei ich in diesem Fall sogar dem IE fast recht geben würde, dass der zweite Aufruf hier einen anderen Kontext hat.

              Wobei mir grad so auffällt, dass ich im Code sowieso statt this gleich scrl schreiben kann. Die Referenz bleibt mir ja analog zu hori/verti ebenfalls erhalten.

              Ja, du hast aber dann u.U. memory leaks im IE.

              Hm, davon hab ich schon mal gehört. Gibts dazu eine verständliche Erklärung, was man besser unterlassen sollte? Ich setze Closures ja swoieso recht sparsam ein, weil ich sie immernoch für *komische Magie* halte. Aber in dem Fall ists echt praktisch, da ich mir nirgends die ganzen Referenzen auf die Elemente zwischenspeichern muss (müsst mir sonst n Objekt dafür bauen oder so). Es geht sogar soweit, dass die Funktion zusätzlich noch eine Funktionsreferenz zurückliefert, über die ich die Größe der Elemente anpassen kann. Nicht dass ich da nichtsahnend in irgendwelche Probleme renne...

              Gruß,

              Harlequin

              --
              <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
              1. Hi,

                Ja, du hast aber dann u.U. memory leaks im IE.

                Hm, davon hab ich schon mal gehört. Gibts dazu eine verständliche Erklärung, was man besser unterlassen sollte?

                Recht ausfuehrlich widmen sich diesem Thema u.a.:
                http://www.codeproject.com/jscript/leakpatterns.asp
                http://www.bazon.net/mishoo/articles.epl?art_id=824

                Bei Microsoft selber gibt's irgendwo auch noch einen ausfuehrlichen Artikel dazu, von einem der IE-Teammitglieder verfasst. (IIRC verlinkt ihn auch einer der obigen Artikel irgendwo.)

                Und der Leak Detector ist teilweise auch hilfreich, solche Dinger aufzuspueren:
                http://outofhanwell.com/ieleak/

                MfG ChrisB

                1. Yerf!

                  Danke für die Links, die werd ich mir mal anschauen.

                  Gruß,

                  Harlequin

                  --
                  <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->