adapter: Inline-Event-Handler "onload" im body-Tag vermeidbar?

Liebes Forum,

generell würde ich gerne Inline Event Handler vermeiden. Aber ist der Inline Event Handler "onload" im body-Tag überhaupt vermeidbar?

<body onload="init()">
...

Am liebsten wäre es mir, in einem im <head>-Tag eingebundenen externen JavaScript diesen Event-Handler zu setzen.

<script src="das-script.js" type="text/javascript"></script>

Dummerweise existiert beim Parsen des Dokuments das body-Element ja noch nicht, wenn das Script ausgeführt wird, so dass ich nicht - etwa mit document.getElementsByTagName("body") - darauf zugreifen kann.

Schöne Grüße
adapter

  1. Hallo adapter.

    generell würde ich gerne Inline Event Handler vermeiden.

    Dummerweise existiert beim Parsen des Dokuments das body-Element ja noch nicht, wenn das Script ausgeführt wird, so dass ich nicht - etwa mit document.getElementsByTagName("body") - darauf zugreifen kann.

    Dafür gibt es eine einfache Lösung: window.onload

    Dies notierst du in deinem externen JS beispielsweise wie folgt:

    window.onload = function () {  
      // Dein Code  
    }
    

    Die onload-Eigenschaft repräsentiert den Eventhandler, der ansonsten im HTML notiert werden müsste.

    Einen schönen Sonntag noch.

    Gruß, Ashura

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    <mathbr:del.icio.us />
    1. Heißa, Ashura,

      window.onload = function () {

      // Dein Code
      }

        
      Oder eben  
      `window.onload = init;`{:.language-javascript}  
      , was in adapters Fall wohl den gegebenen Code genau wiederspiegeln würde.  
        
      Gautera!  
      Grüße aus [Biberach Riss](http://www.stadt-biberach.de/),  
      Candid Dauth  
      
      -- 
      Ein Fußball-Fan? Noch auf der Suche eine Schlafmöglichkeit im Großraum Stuttgart für die WM 2006? Wie wäre es mit Herrenberg, einer gemütlichen Kleinstadt am Rande des Schönbuchs – von der Lage her ideal, auch für andere Vorhaben im Urlaub. [Ferienwohnungen-Herrenberg.com](http://www.ferienwohnungen-herrenberg.com/).  
        
      <http://cdauth.de/>
      
      1. Hallo Candid.

        window.onload = init;
        , was in adapters Fall wohl den gegebenen Code genau wiederspiegeln würde.

        Ah, das hatte ich überlesen. Danke für die Ergänzung.

        Einen schönen Sonntag noch.

        Gruß, Ashura

        --
        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
        <mathbr:del.icio.us />
    2. Hi,

      window.onload = function () {

      // Dein Code
      }

        
      Ich benutz eher folgendes:  
        
      ~~~javascript
        
      var bdsaf_oldonload = window.onload;  
      function bdsaf_onload()  
      {  
         if (bdsaf_oldonload)  
             bdsaf_oldonload();  
         //hier der eigentliche Code  
      }  
      window.onload = bdsaf_onload;  
      
      

      wobei bdsaf irgendein pro Modul unterschiedlicher Buchstabenhaufen ist.

      Auf die Art kann man beliebig viele Module in eine Seite einbinden, ohne daß ein onload den anderen überschreibt - falls schon ein onload vorhanden war, wird der gemerkt und bei onload dann erstmal aufgerufen.
      Einzige Bedingung ist, daß sich der Buchstabenhaufen unterscheidet - meist benutz ich irgendeine Abkürzung für das, was das Modul machen soll.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Schreinerei Waechter
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. Hallo,

        var bdsaf_oldonload = window.onload;
        function bdsaf_onload()
        {
           if (bdsaf_oldonload)
               bdsaf_oldonload();
           //hier der eigentliche Code
        }
        window.onload = bdsaf_onload;

        Die wohl bekannteste Seite zu diesem Thema ist denke ich: <http://simon.incutio.com/archive/2004/05/26/addLoadEvent>  
          
        Grüße  
        Jeena Paradies
        
        -- 
        [Open- vs. Closed Source Software](http://jeenaparadies.net/weblog/2005/dec/open-vs-closed-source-software) - Verdienstmöglichkeiten | [Jlog](http://jeenaparadies.net/webdesign/jlog/) | [Gourmetica Mentiri](http://jeenaparadies.net/gourmetica-mentiri/)
        
        1. JA!!!!!!!!!

          Die wohl bekannteste Seite zu diesem Thema ist denke ich: http://simon.incutio.com/archive/2004/05/26/addLoadEvent

          Vielen Dank! GENAU DIESEN LINK habe ich gesucht! Hatte das nämlich vorgestern erst überflogen, doch wegen gelöschter History nicht mehr wiederfinden können, implementiere gerade so eine JSON-Sache und möchte das JavaScript möglichst unabhängig vom HTML haben: wiederverwendbares Script mit minimalen Änderungsanfornderungen an die einbettende HTML-Seite. :)

          Schöne Grüße
          adapter

          1. Hallo,

            GENAU DIESEN LINK habe ich gesucht!

            Habe ich es mir doch irgendwie gedacht ;-)

            Grüße
            Jeena Paradies

            --
            Open- vs. Closed Source Software - Verdienstmöglichkeiten | Jlog | Gourmetica Mentiri
      2. Hallo MudGuard.

        Ich benutz eher folgendes:

        Sehr geschickt, werde ich mir merken.

        Doch ich frage mich, warum Folgendes offenbar nicht funktioniert:

        window.onload += alert('Foo');  
        window.onload += alert('Bar');  
          
        window.onload += callme;  
          
        function callme () {  
          alert('Baz');  
        }  
          
        window.onload += function () {  
          alert('Qux');  
        }
        

        Die Werte „Foo“ und „Bar“ werden wie erwartet ausgegeben. Die anderen jedoch nicht.

        Ein alert(window.onload) bringt jedoch nur Folgendes:

        NaN
        function callme() {
        alert('Baz');
        }
        function () {
        alert('Qux');
        }

        Woran liegt es, dass die beiden Funktionen nicht ausgeführt werden und der Wert der onload-Eigenschaft mit „NaN“ beginnt? Letzteres, weil der onload-Eigenschaft kein Initialwert zugewiesen wurde, oder?

        Einen schönen Sonntag noch.

        Gruß, Ashura

        --
        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
        <mathbr:del.icio.us />
        1. Hallo.

          Letzteres, weil der onload-Eigenschaft kein Initialwert zugewiesen wurde, oder?

          Offenbar nicht. Auch mit einer Initialzuweisung erscheint NaN.

          Einen schönen Sonntag noch.

          Gruß, Ashura

          --
          sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
          <mathbr:del.icio.us />
        2. Hallo Ashura,

          window.onload += alert('Foo');
          window.onload += alert('Bar');

          du rufst also zweimal die alert-Funktion auf und "addierst" das Funktionsergebnis jedesmal zu onload. Hm, wie ist der Plus-Operator für ein Element definiert, das eigentlich eine Referenz (für die Oldschool-Programmierer: einen Zeiger) auf eine Funktion erwartet?

          window.onload += callme;

          Hier "addierst" du tatsächlich eine Referenz/einen Zeiger auf eine Funktion zu onload...

          function callme () {
            alert('Baz');
          }

          und das ist die zugehörige Definition der Funktion.

          window.onload += function () {
            alert('Qux');
          }

          dito, nur dass du hier eine namenlose Funktion direkt hinzufügst.

          Die Werte „Foo“ und „Bar“ werden wie erwartet ausgegeben. Die anderen jedoch nicht.

          Programmierst du auch in C? Wenn nein, schade. Dann müsste dir nämlich der Unterschied zwischen einer Funktion, einem Zeiger bzw. einer Referenz auf eine Funktion und dem Funktionsergebnis klar sein, und das würde dir das Verständnis der hier beschriebenen Zusammenhänge erleichtern.

          NaN
          function callme() {
          alert('Baz');
          }
          function () {
          alert('Qux');
          }

          Woran liegt es, dass die beiden Funktionen nicht ausgeführt werden

          Weil du nur deren Definitionen mit dem onload-Handler verknüpft hast, nicht deren Rückgabewert.

          und der Wert der onload-Eigenschaft mit „NaN“ beginnt?

          Ich vermute, das ist eine Auswirkung des impliziten, nicht eindeutig durchschaubaren Typecasts, der durch die ersten beiden Anweisungen erzwungen wurde.

          Puh, jetzt hast du was zum Knobeln.  ;-)
          Schönen Abend noch,

          Martin

          --
          "Drogen machen gleichgültig."
           - "Na und? Mir doch egal."
          1. Hallo Martin.

            Hm, wie ist der Plus-Operator für ein Element definiert, das eigentlich eine Referenz (für die Oldschool-Programmierer: einen Zeiger) auf eine Funktion erwartet?

            Gute Frage.

            Programmierst du auch in C? Wenn nein, schade.

            Ich lerne „on Demand“; C und seine Derivate waren bisher noch nicht erforderlich.

            Dann müsste dir nämlich der Unterschied zwischen einer Funktion, einem Zeiger bzw. einer Referenz auf eine Funktion und dem Funktionsergebnis klar sein, und das würde dir das Verständnis der hier beschriebenen Zusammenhänge erleichtern.

            Funktion und Referenz auf diese sind mir bekannt, mit Zeigern kann ich nicht viel mehr anfangen, als damit auf Buttons zu klicken.

            Woran liegt es, dass die beiden Funktionen nicht ausgeführt werden

            Weil du nur deren Definitionen mit dem onload-Handler verknüpft hast, nicht deren Rückgabewert.

            OK, verstehe ich. Also kann ich davon ausgehen, dass mein experimentelles Vorgehen wie beschrieben nicht möglich ist.

            Ich vermute, das ist eine Auswirkung des impliziten, nicht eindeutig durchschaubaren Typecasts, der durch die ersten beiden Anweisungen erzwungen wurde.

            Äh, sicher.

            Einen schönen Sonntag noch.

            Gruß, Ashura

            --
            sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
            <mathbr:del.icio.us />
            1. Hallo,

              Hm, wie ist der Plus-Operator für ein Element definiert, das eigentlich eine Referenz (für die Oldschool-Programmierer: einen Zeiger) auf eine Funktion erwartet?
              Gute Frage.

              ... und?
              Normalerweise heißt das doch "Gute Frage. Nächste Frage?"

              Ich lerne „on Demand“; C und seine Derivate waren bisher noch nicht erforderlich.

              Das mit dem "on demand" war mir klar, davon hatten wir's ja neuelich schon mal (bin jetzt zu faul zum Raussuchen). Aber ich hätte mir vorstellen können, dass eine Einführung in C im Rahmen von Schule, Lehre, Ausbildung, etc. mal dran war. Das wird schließlich als _die_ Programmiersprache in sehr vielen Ausbildungsberufen und Studiengängen gelehrt.

              Funktion und Referenz auf diese sind mir bekannt, mit Zeigern kann ich nicht viel mehr anfangen, als damit auf Buttons zu klicken.

              *lol*
              Der Begriff "Referenz" hat mit der zunehmenden Verbreitung objektorientierter Sprachen den "Zeiger" weitgehend abgelöst, aber letztendlich ist es dasselbe: Ein Konstrukt, das nur auf eine Variable, eine Funktion, oder ein beliebiges Objekt verweist, analog zu einem Link.

              So long,

              Martin

              --
              Most experts agree: Any feature of a program that you can't turn off if you want to, is a bug.
              Except with Microsoft, where it is just the other way round.
              1. Hallo Martin.

                Gute Frage.

                ... und?
                Normalerweise heißt das doch "Gute Frage. Nächste Frage?"

                Was ist schon normal …

                Aber ich hätte mir vorstellen können, dass eine Einführung in C im Rahmen von Schule, Lehre, Ausbildung, etc. mal dran war. Das wird schließlich als _die_ Programmiersprache in sehr vielen Ausbildungsberufen und Studiengängen gelehrt.

                Das höchste der Gefühle in Sachen Programmierung waren in meinem bisherigen Bildungsgang BASIC und VBA. Keines von beiden benötige ich momentan im Alltag.
                Ich hätte wohl doch einen reinen Programmierweg einschlagen sollen. Aber irgendwann werde ich auch C(++), Perl, Python, Ruby, etc. einen Anwendungszweck finden.

                Der Begriff "Referenz" hat mit der zunehmenden Verbreitung objektorientierter Sprachen den "Zeiger" weitgehend abgelöst, aber letztendlich ist es dasselbe: Ein Konstrukt, das nur auf eine Variable, eine Funktion, oder ein beliebiges Objekt verweist, analog zu einem Link.

                Hm, eigentlich recht logisch. Doch wenn man mir dies nicht explizit sagt, bringe ich diese beiden nicht in Beziehung zueinander. Danke für die Information.

                Einen schönen Sonntag noch.

                Gruß, Ashura

                --
                sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
                <mathbr:del.icio.us />
        3. Hi,

          [code lang=javascript]window.onload += alert('Foo');

          Du versuchst hier, auf onload, welches üblicherweise eine Funktionsreferenz enthält, den Rückgabewert von alert('Foo') zuzuweisen - der alert wird sofort ausgeführt.

          window.onload += alert('Bar');

          Selbiges in Grün.

          window.onload += callme;

          Auf die Funktionsreferenz versuchst Du, eine weitere Funktionsreferenz draufzuaddieren.

          Ich habe den Eindruck, Du vermutest, daß window.onload ein String sein soll, zu dem Du etwas hinzufügen willst.
          Dann müßtest Du aber auch Strings hinzufügen ...

          Die Werte „Foo“ und „Bar“ werden wie erwartet ausgegeben.

          Die Werte werden zwar ausgegeben, aber eher nicht so, wie Du es erwartest ...

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          Schreinerei Waechter
          Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
          1. Hallo MudGuard.

            Du versuchst hier, auf onload, welches üblicherweise eine Funktionsreferenz enthält, den Rückgabewert von alert('Foo') zuzuweisen - der alert wird sofort ausgeführt.

            Stimmt, war mir gerade entfallen.

            Ich habe den Eindruck, Du vermutest, daß window.onload ein String sein soll, zu dem Du etwas hinzufügen willst.

            Nein, ich sehe onload als das, was es ist, als Eigenschaft.

            Einen schönen Sonntag noch.

            Gruß, Ashura

            --
            sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
            <mathbr:del.icio.us />
            1. Ich habe den Eindruck, Du vermutest, daß window.onload ein String sein soll, zu dem Du etwas hinzufügen willst.

              Nein, ich sehe onload als das, was es ist, als Eigenschaft.

              Ja ist es auch und du kannst auch onload zuweisen was du möchtest, nur wird diese Eigenschaft dann aber nicht ihren nutzen erfüllen.

              Du kannst dir es ungefähr so vorstellen, der Browser lädt die Seite, ist er damit fertig schaut er nach ob in onload eine Referenz auf eine Funktion steht, wenn ja wird diese aufgerufen. In JS würde das aussehen:

              [Seite ist fertig geladen]
              if(typeof window.onload == 'function') window.onload();

              Struppi.

    3. Vielen Dank!

      Hatte es mit document.onload versucht und SELFHTML ist in dieser Hinsicht unvollständig. ;)

      gr.
      a.