2015-01-22 9 views
5

Qui è la mia situazione: ho aggiunto dinamicamente 2 script attraversoCome utilizzare jQuery per gestire i tag script aggiunti dinamicamente in parallelo

$('body').append('<script src="http://localhost:8080/script_1.js"></script>'); 
$('body').append('<script src="http://localhost:8080/script_2.js"></script>'); 

Poi ho scoperto che sarebbero caricati in sequenza anziché parallelo dalla console cromata.

Tuttavia, essi potrebbero essere caricati in parallelo se uso sia js nativi

document.body.appendChild(script); 

o la funzione jQuery: getScript

$.getScript('http://localhost:8080/script_1.js'); 

ho cercato un sacco e ha scoperto che jQuery in realtà sarà rimuovere lo script tag, analizza il sorgente e usa la sua funzione ajax $ .ajax() per caricare script invece di lasciarlo gestire al browser. Ma la funzione $ .getScript() usa anche $ .ajax() e non ha alcun blocco. Ovviamente, non è colpa di $ .ajax().

Qui è un banco di prova: Vai http://jquery.com e incollare seguente script nella console che aggiungerà un file js due volte attraverso jQuery

$('body').append('<script src="/jquery-wp-content/themes/jquery/js/plugins.js"></script>'); 
$('body').append('<script src="/jquery-wp-content/themes/jquery/js/plugins.js"></script>'); 

Controllare la timeline, troverete che vengono caricati in sequenza . Ovviamente, posso usare js nativi o $ .getScript() sopra per risparmiare tempo.

Tuttavia, voglio sapere perché? Perché queste chiamate jQuery ajax dall'aggiunta di tag script non sono in parallelo?

Aggiornamento

Più interessante, sembra la sequenza si applicano solo allo script da la stessa origine. Ho provato a caricare alcuni file js sotto forma di librerie ospitate da google e sono in parallelo. Provato in seguito anche in http://jquery.com

$('body').append('<script src="https://ajax.googleapis.com/ajax/libs/ext-core/3.1.0/ext-core.js"></script>'); 
$('body').append('<script src="https://ajax.googleapis.com/ajax/libs/ext-core/3.1.0/ext-core.js"></script>'); 
+0

"Gli script creati dinamicamente e aggiunti al documento sono asincroni di default" in base a [questo articolo] (http://www.html5rocks.com/en/tutorials/speed/script-loading/) ma non lo fa spieghiamo perché questo non è il caso degli script locali aggiunti da jQuery. – Moob

+0

@Moob si, lo so ... come ho detto, posso usare pure javascript 'document.body.appendChild (script);' per caricare e sì, sono paralleli ... ma voglio solo scoprire cosa è fatto segretamente per rendere il mio caso sequenziale –

+0

Ci sono alcuni indizi nella specifica https://html.spec.whatwg.org/multipage/scripting.html#script ma - nelle loro parole: "I dettagli esatti di elaborazione per questi attributi sono, per ragioni per lo più storiche, in qualche modo non banali, coinvolgendo una serie di aspetti dell'HTML: i requisiti di implementazione sono quindi necessariamente racchiusi in tutte le specifiche ... " – Moob

risposta

2

Quando aggiungendo script al DOM, a seconda del test cross-domain, vengono utilizzate diverse funzioni ajaxTransport.

Una richiesta interdominio accade quando abbiamo un protocollo: host: porta disadattamento

Nel primo caso stessa origine:

JQuery utilizza la funzione XMLHttpRequest open con async=false forzare una richiesta sincrona (see source).

xhr.open(
     options.type, 
     options.url, 
     options.async, 
     options.username, 
     options.password 
    ); 

Quindi l'avviso sulla console (almeno su Canary comunque).

sincrono XMLHttpRequest sul thread principale è obsoleta

Nel secondo caso trasversale origine:

JQuery utilizza ajax come segue (see source)

script = jQuery("<script>").prop({ 
        async: true, 
        charset: s.scriptCharset, 
        src: s.url 
       })..... 
document.head.appendChild(script[0]); 

che caricherà in parallelo come hai dichiarato.

Problemi correlati