2015-04-12 2 views
6

Ich habe eine Seite mit einem script Tag im Abschnitt HEAD:Wird das Skript, das mit einem Async-Attribut geladen wurde, ein Onload-Ereignis verzögern?

<script src="somescript.js" type="text/javascript" async></script> 

Wie es enthält async Attribut es lädt asynchron und Browser analysiert die Seite ohne für dieses Skript wartet heruntergeladen werden. Nach dem Herunterladen wird dieses Skript ebenfalls asynchron ausgeführt, so dass der Browser die Seite weiter analysieren kann.

Dieses Skript wird ausführen, nachdem einige Aktionen heruntergeladen und fügt noch ein weiteres Skript dynamisch über etwas ähnliches, dies zu:

var a = document.createElement('script'); 
    a.type = 'text/javascript'; 
    a.src = 'http://domain/otherscript.js'; 

    var elem_body = document.getElementsByTagName('body')[0]; 
    elem_body.appendChild(a); 

Dieses neue dynamisch eingefügt Skript wird auch asynchron und wieder Browser zu anderen weiter ausgeführt werden Dinge, so analysieren Sie die Seite oder andere Skripte wie benötigt.

Nun ist mein Verständnis, dass dieses Skript vom Anfang bis zum Ende seiner Ausführung den Browser in keiner Weise blockieren wird. Es wird geladen, ein anderes Skript eingefügt und vollständig asynchron ausgeführt. DOMContentLoaded Ereignis wird überhaupt nicht verlangsamt werden.

Könnte das möglicherweise das Auslösen von onload Event verzögern? Es scheint mir, dass dieses Skript starten würde, wenn die Seite fast geparst ist. Dann würde es andere Skripte anfordern und onload Event wäre möglicherweise verzögert weiter warten auf dieses letzte Skript, um seine Sache zu tun.

Ist mein Verständnis korrekt?

EDIT

Added-Test bei http://plnkr.co/edit/BCDPdgCjPeNUmLbf7wNR?p=preview und in Chrome scheint es, dass es Verzögerung onload Ereignis

+0

wie beschrieben, würde onload() höchstwahrscheinlich vor der Ausführung von otherscript.js ausgelöst werden, aber ein einfacher Test würde ausreichen. – dandavis

Antwort

4

Ja tut, wie Sie vorschlagen, wird es die window.onload Ereignis verzögern.

Ihr erstes Skript, fügt somescript.js ein Kind script Element auf der Seite, bevor die Seite geladen ist beendet (zB vor window.onload abgefeuert hat), und die Seite hat jetzt zum Download und die src des neu angehängten script Elements ausgeführt werden, bevor Es kann ein onload Ereignis auslösen.

Wenn Sie nicht willst, dass es das onload Ereignis verzögern, könnten Sie einen AJAX Antrag stellen den Inhalt otherscript.js und einfach eval es so führt sie im globalen Kontext (effektiv das gleiche wie die Angabe es über ein script zu bekommen Tag, aber ohne das onload Ereignis zu verzögern).

Verwandte Themen