nawrath: Wie feststellen, wann nachgeladenes JavaScript "bereit" ist?

Hallo Forum,

ich binde eine JavaScript-Datei nachträglich ein und habe nun das Problem, dass ich den Zeitpunkt nicht kenne, zu dem es "einsatzbereit" (geparsed) ist.

  
skript = document.createElement("script");  
skript.type="text/javascript";  
skript.src="thescript.php";  
heads = document.getElementsByTagName("head");  
head = heads[0];  
head.appendChild(skript);  
skript.onload = skriptgeladen();  
  
function skriptgeladen() {  
  //alert('das geladenen Script funktioniert nach diesem alert');  
  ausgabe(); // Funktion aus dem geladenen Script  
}  

Lade ich beispielsweise noch Seiteninhalt per Ajax nach, in dem etwa bei onclick-Ereignissen Funktionen aus dem nachgeladenen Script aufgerufen werden, funktioniert das einwandfrei.

Will ich aber nach laden des Scripts direkt etwas starten, kommt es zu Fehlern. Wie ihr seht, habe ich aus Verzweiflung schon zum onload-Event gegriffen, das auch feuert, aber dann ist das Script aber wohl noch nicht geparsed.

Wie kann ich nun feststellen wann das nachträglich eingebundene JavaScript "einsatzbereit" ist?

Roman

  1. Hallo,

    das load-Event ist durchaus richtig, vorausgesetzt, du registrierst den Event-Handler korrekt. Momentan registrierst du ihn falsch.

    Allerdings feuern das nicht load-Event nicht alle Browser. In manchen muss man stattdessen das readystatechange-Event überwachen und die readyState-Eigenschaft prüfen. Schau dir einmal an, wie jQuery das macht. Wenn das load-Ereignis passiert, ist das Script geladen. Beim readychange wird parallel der readyState abgefragt. Hat die Eigenschaft den Wert "loaded" oder "complete", ist das Script geladen.

    Mathias

    1. Hallo Mathias,

      danke für Deine Hilfe! Zu so später Stunde habe ich damit garnicht gerechnet. Wenn ich den Handler richtig übergebe, also als Referenz auf die Funktion ohne Funktionalität(), dann wird die Funktion auch erst beim Feuern des Events aufgerufen und nicht direkt, wie bei mir.
      Im Firefox wird das onload-Event unterstützt, morgen, bzw. nachher teste ich mal noch den aktuellen IE und Chrome und experimentiere ggf. mit readystate. Die Jungs von jQuery nehmen ja sogar noch auf den IE6 Rücksicht, soweit werde ich nicht gehen :-).

      Danke nochmals und gute Nacht,

      Roman

    2. Hallo molily,

      ... wie jQuery das macht. ...

      hat das einen Grund, dass das nachgeladene Script an den Anfang des Head gestellt wird (head.insertBefore( script, head.firstChild );)?

      Gruß, Jürgen

      1. Hallo molily,

        ... wie jQuery das macht. ...

        hat das einen Grund, dass das nachgeladene Script an den Anfang des Head gestellt wird (head.insertBefore( script, head.firstChild );)?

        Gruß, Jürgen

        Hallo Jürgen,

        ich will molily nicht vorweggreifen, im Kommentar steht jedoch, dass, um einen Bug im IE6 beim Umgang mit Basisknoten zu umgehen, .insertBefore anstelle von .appendChild genutzt wird. Bei den Tickets 2709 und 4378 gibt es denn auch ausführlichere Infos.

        Roman

  2. head.appendChild(skript);
    skript.onload = skriptgeladen();

    Der load-Hander sollte zudem vor dem Einhängen registriert werden.

    Die lesenswerte DailyJS-Reihe »Let's make a framework« hat sich auch einmal mit dem Laden von Scripten beschäftigt:
    http://dailyjs.com/2011/09/29/framework-82/

    Mathias

  3. Lieber nawrath,

    vielleicht benötigst Du einen mit anderen Scripten kompatiblen Autostart?

    Liebe Grüße,

    Felix Riesterer.

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

      danke für den Tip, da zeitgleich nichts anderes geladen wurde, konnte sich nichts beißen. Wie molily heute nacht schon sehr richtig feststellte, habe ich die Funktion direkt aufgerufen und keinen Handler übergeben, siehe auch meinen Post von 02:44 Uhr. Er wird zwar als Antwort auf molilys Post eingerückt aber zeitlich nicht korrekt sortiert.

      Roman

      1. Hallo,

        siehe auch meinen Post von 02:44 Uhr. Er wird zwar als Antwort auf molilys Post eingerückt aber zeitlich nicht korrekt sortiert.

        das ist ein altes Leiden dieses Forums: Beiträge auf gleicher Einrückungsebene werden chronologisch rückwärts sortiert (neuere Beiträge stehen weiter oben); einander untergeordnete Beiträge dagegen vorwärts, wie man es erwarten würde, also der Folgebeitrag steht etwas weiter eingerückt unter seinem Elternbeitrag.
        Als registrierter Benutzer kann man diese Sortierreihenfolge übrigens anpassen.

        Ciao,
         Martin

        --
        Alkohl ist ungesund,
        Rauchen ist schädlich,
        Sex ist unanständig
        - und die Erde ist eine flache Scheibe.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(