Gast: Funktion zu windows.onload hinzufügen

Hallo,

wie kann ich dem window.onload eine Funktion hinzufügen?

Habe dieses gefunden, das funktioniert aber nicht:

if(document.addEventListener){  
  document.addEventListener('load',  
  function() { int_sinnbild = window.setInterval("scrollSinnbild()",50); }  
}else{  
  document.attachEvent('load',  
  function() { int_sinnbild = window.setInterval("scrollSinnbild()",50); }  
}  

Das heisst, die Animation startet nicht. So startet sie aber:

window.onload = function() { int_sinnbild = window.setInterval("scrollSinnbild()",50); }

Dann wird aber der vorher in window.onload geschriebene Auftrag überschrieben.

Gruß, Gast

  1. Meine Herren,

    Hallo,

    wie kann ich dem window.onload eine Funktion hinzufügen?

    Habe dieses gefunden, das funktioniert aber nicht:

    Kein Wunder, das Skript weist ja auch Syntax-Fehler auf.

    Korriegerte Fassung:

    if(document.addEventListener){  
       document.addEventListener('load',  function() { int_sinnbild = window.setInterval("scrollSinnbild()",50); });  
    }else{  
       document.attachEvent('load', function() { int_sinnbild = window.setInterval("scrollSinnbild()",50); });  
    }  
    
    

    Und immer schön auf die korrekte Klammerung achten. Eine Klammer die auf geht, muss auch irgendwann wieder geschlossen werden.

    1. Korriegerte Fassung:

      if(document.addEventListener){

      document.addEventListener('load',  function() { int_sinnbild = window.setInterval("scrollSinnbild()",50); });
      }else{
         document.attachEvent('load', function() { int_sinnbild = window.setInterval("scrollSinnbild()",50); });
      }

        
      Danke, ich hatte mich soo auf die geschweiften Klammern konzentriert.  
        
      Aber das Problem ist nicht ganz behoben. Wenn ich dieses schreibe  
        
      ~~~javascript
      if(document.addEventListener){  
        document.addEventListener  
        ('load', function() { int_sinnbild = window.setInterval("scrollSinnbild()",50); } )  
      }else{  
        document.attachEvent  
        ('load', function() { int_sinnbild = window.setInterval("scrollSinnbild()",50); } )  
      }
      

      wirkt es nicht. Hier funktioniert beides:

      window.onload = function() { int_sinnbild = window.setInterval("scrollSinnbild()",50); }  
      if(document.addEventListener){  
        document.addEventListener  
        ('load', ini_google() )  
      }else{  
        document.attachEvent  
        ('load', ini_google() )  
      }
      

      Ich vermute mal, dass der Eventlistener mit so einer "fliegenden" Funktion nicht zurecht kommt.

      Gibt es vielleicht eine Kurzform in der Art

      window.onload = window.onload + ini_google();

      Gast

      1. Hallo!

        if(document.addEventListener){

        document.addEventListener
          ('load', function() { int_sinnbild = window.setInterval("scrollSinnbild()",50); } )
        }else{
          document.attachEvent
          ('load', function() { int_sinnbild = window.setInterval("scrollSinnbild()",50); } )
        }

        
        >  
        > wirkt es nicht.  
          
        Das load-Ereignis passiert beim window-Objekt:  
          
        `window.addEventListener('load', handlerfunktion);`{:.language-javascript}  
          
        Der Teil für ältere Internet Explorer benötigt die Schreibweise »onload«:  
          
        `window.attachEvent('onload', handlerfunktion)`{:.language-javascript}  
          
        Das sollte klappen. Im Sinne von: die Handlerfunktion sollte aufgerufen werden, wenn du den Code in einem Script platzierst, das vor dem load-Event ausgeführt wird.  
          
        
        > Hier funktioniert beides:  
        >   
        > ~~~javascript
          
        
        > if(document.addEventListener){  
        >   document.addEventListener  
        >   ('load', ini_google() )  
        > }else{  
        >   document.attachEvent  
        >   ('load', ini_google() )  
        > }
        
        

        Das funktioniert nur scheinbar. Es macht nicht das, was du willst. Du rufst die Funktionen hierbei sofort auf. In dem Moment, wo dieser Code ausgeführt wird. Nicht erst beim load-Event! An dieser Stelle dürfen keine Klammern hinter den Funktionsnamen stehen.

        Hintergrund:

        JavaScript ist eine stark funktionale Sprache. Funktionen sind in JavaScript reguläre Objekte und werden in Variablen oder Objekteigenschaften gespeichert. Beim Registrieren von Event-Handlern, bei setInterval/setTimeout, bei Callbacks usw. werden Funktionen als ganz normale Parameter übergeben. Dabei notiert man einfach den Namen der Variable, in der die Funktion gespeichert ist. Der wird dann zu dem Funktionsobjekt aufgelöst. Dahinter sollte nicht der Aufruf-Operator () notiert werden!

        Beispiele:

        var intervalStep = function() {  
          // …  
        };  
        var loadHandler = function() {  
          setInterval(intervalStep, 1000); // Direktes Übergeben der Funktion  
        };  
        window.addEventListener('load', loadHandler); // Direktes Übergeben der Funktion
        

        Ich vermute mal, dass der Eventlistener mit so einer "fliegenden" Funktion nicht zurecht kommt.

        Doch, sollte er. Das macht keinen Unterschied, wenn der Rest richtig notiert ist.

        Gibt es vielleicht eine Kurzform in der Art

        window.onload = window.onload + ini_google();

        Das ist eine klassische Operation der funktionalen Programmierung, aber in JavaScript gibt es dafür leider keine einfache Umsetzung. Das ginge funktional mit Closures.

        window.addEventListener/attachEvent ist hier die einfachste Lösung.

        Grüße,
        Mathias

        1. gruss Gast, hallo molily,

          Gibt es vielleicht eine Kurzform in der Art

          window.onload = window.onload + ini_google();
          »»
          Das ist eine klassische Operation der funktionalen Programmierung, aber in JavaScript
          gibt es dafür leider keine einfache Umsetzung. Das ginge funktional mit Closures.

          aus diesem Grund wäre es hilfreich, wenn in einer der nächsten JavaScript Versionen
          Function.prototype.before,
          Function.prototype.after sowie
          Function.prototype.around
          standardmäßig Einzug halten würden. Als Vorbild sei Function.prototype.bind
          genannt, eine Methode, die andere Methoden modifiziert - ein "Method Modifier".

          gegeben seien die beiden beispielhaften, auf Typprüfung verzichtenden Implementierungen ...

          Function.prototype.before = function (behaviorBefore, target) {  
            var proceedAfter = this;  
            
            return function () {  
              var args = arguments;  
            
              behaviorBefore.apply(target, args);  
              return proceedAfter.apply(target, args);  
            };  
          };  
          Function.prototype.after = function (behaviorAfter, target) {  
            var proceedBefore = this;  
            
            return function () {  
              var args = arguments;  
            
              proceedBefore.apply(target, args);  
              return behaviorAfter.apply(target, args);  
            };  
          };
          

          Gibt es vielleicht eine Kurzform in der Art

          window.onload = window.onload + ini_google();

          ... eine Änderung des "onload" Händlers sähe dann folgendermaßen aus ...

          window.onload = window.onload.after(ini_google);

          ... und soll der neu hinzugekommene Code vor der
          bisherigen Funtionalität ausgeführt werden - dann so ...

          window.onload = window.onload.before(ini_google);

          so long - peterS. - pseliger@gmx.net

          --
          »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
          Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
          ie:( fl:) br:> va:( ls:& fo:) rl:) n3;} n4:} ss:} de:µ js:} mo:? zu:]
  2. Lieber Gast,

    window.onload = function() { int_sinnbild = window.setInterval("scrollSinnbild()",50); }

    Dann wird aber der vorher in window.onload geschriebene Auftrag überschrieben.

    im kleinen Lehrgang zum vernünftigen Schreiben eines JavaScripts gibt es einen Abschnitt, der Dir beim Verständnis helfen sollte: Ein mit anderen Scripten kompatibler Autostart. Auch der Rest des Artikels könnte für Dich das eine oder andere Detail verständlicher machen.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)