JürgenB: Script nachladen: Problem mit Chrome und onload

Hallo,

mit folgenden Script lade ich bei Bedarf weitere Javascripte nach:

  
JB.LoadScript = function(url,callback) {  
  var scr = document.createElement('script');  
  scr.type = "text/javascript";  
  scr.async = true;  
  if(typeof(callback)=="function") {  
    scr.onloadDone = false;  
    scr.onload = function() {  
      if ( ! scr.onloadDone ) {  
        scr.onloadDone = true;  
        JB.Debug_Info(url,"loaded",false);  
        callback();  
      }  
    };  
    scr.onreadystatechange = function() {  
      if ( ( "loaded" === scr.readyState || "complete" === scr.readyState ) && ! scr.onloadDone ) {  
        scr.onloadDone = true;  
        JB.Debug_Info(url,"ready",false);  
        callback();  
      }  
    }  
  }  
  scr.src = url;  
  document.getElementsByTagName('head')[0].appendChild(scr);  
  //document.body.appendChild(scr);  
  //document.getElementsByTagName('head')[0].insertBefore(scr,document.getElementsByTagName('head')[0].firstChild);  
} // LoadScript  

Im IE8 und im IE9 feuert der onreadystatechange wenn das Script verfügbar ist, im Firefox und im Opera der onload. In der Callback-Funktion kann ich auf Funktionen aus dem Script zugreifen.

Im Chrome und im Safari feuert der onload allerdings schon, bevor das Script verfügpar ist. In der Callback-Funktion greife ich auf eine Funktion aus dem nachgeladenem Script zu und erhalte die Fehlermeldung "undefined is not a function".

Habt ihr eine Idee, wie ich zuverlässig prüfen kann, ob das Script da ist bzw. kennt ihr eine bessere Funktion zum Scriptnachladen?

Gruß, Jürgen

  1. Hallo,

    das sieht eigentlich in Ordnung aus. Denselben Ansatz verwende ich auch und jQuery beispielsweise hat fast denselben Code. Daher kann ich nicht so recht glauben, dass das nicht funktioniert. Habe es kurz geprüft, bei meinen Tests funktioniert deine Funktion fehlerfrei im Chrome. Was genau lädst du nach?

    Mathias

    1. Hallo Mathias,

      danke für deine Antwort. Du hast mich ermutigt, einen Minimaltest zu erstellen. Ergebnis: die Laderoutine funktioniert auch im Chrome. Danach habe ich das eigentliche Projekt in einen Testordner hochgeladen. Ergebnis: Es funktioniert auch im Chrome.

      Ich habe also jetzt den Zustand: es geht, aber ich weiß nicht warum. Meine Vermutung ist im Moment, dass es an meinem Test unter xamp und localhost gelegen hat, ein anderer Unterschied fällt mir nicht ein. Ich werde das heute Abend zu Hause noch mal testen. Vor allem werde ich den Minimaltest unter xamp laufen lassen.

      Gruß, Jürgen

  2. Habt ihr eine Idee, wie ich zuverlässig prüfen kann, ob das Script da ist bzw. kennt ihr eine bessere Funktion zum Scriptnachladen?

    Zuverlässig funktioniert eigentlich nur das Pollen auf eine Variable im Script, da manche Browser weder onreadystatechange noch onload rufen.

    1. Hallo unknown,

      Zuverlässig funktioniert eigentlich nur das Pollen auf eine Variable im Script, da manche Browser weder onreadystatechange noch onload rufen.

      die Idee hatte ich auch schon. Aber meine Tests unter IE8, IE9, aktueller FF, aktueller Chrome und aktueller Opera haben gezeigt, dass es so funktioniert. Mein Problem war ja evtl. der xamp.

      Bei welchen Browsern feuert denn weder onreadystatechange noch onload?

      Gruß, Jürgen

      1. Bei welchen Browsern feuert denn weder onreadystatechange noch onload?

        Das weiss ich auch nicht mehr, es reicht ja eigentlich zu wissen, dass es nicht alle machen. Ich dachte
        Safari weder noch
        IE onreadystatechange
        FF onload
        opera onreadystatechange und onload
        Chrome gab es noch nicht, als ich damit mal gespielt hatte

        1. Hallo unknown,

          Safari weder noch

          der hat sich bei mir wie Chrome verhalten. Ich werde ihn aber heute Abend noch einmal testen.

          Gruß, Jürgen

          1. der hat sich bei mir wie Chrome verhalten. Ich werde ihn aber heute Abend noch einmal testen.

            Ab Version 3 soll auch dort onload gefeuert werden.

  3. Hallo,

    so, ich habe das jetzt noch einmal getestet. Aus dem Internet und von der Festplatte funktioniert das Nachladen, nur über xampp liefern Chrome und Safari den Fehler. Auch ein Update auf die neueste Version des XAMPP hat keine Änderung gebracht.

    Gruß, Jürgen