2013-07-17 5 views
20

Ho una certa confusione intorno al nuovo attributo async all'elemento di script in HTML5 che spero che qualcuno possa dare una risposta chiara a.Qual è esattamente il vantaggio dell'attributo async HTML5 sugli elementi di script?

I browser sono in grado di connessioni parallele, pertanto le immagini verranno scaricate in parallelo. Ma qualsiasi javascript esterno non viene scaricato in parallelo con altri javascript esterni e immagini. Gli script bloccano il caricamento della pagina finché non sono stati scaricati ed eseguiti.

Per scaricare uno script senza bloccare il resto della pagina di caricamento, la tecnica più comune è quello di creare un elemento di script, come Google Analytics snippet fa:

var ga = document.createElement('script'); 
ga.type = 'text/javascript'; 
ga.src = '...ga.js'; 
ga.async = true; 
var s = document.getElementsByTagName('script')[0]; 
s.parentNode.insertBefore(ga, s); 

io non sono sicuro di come funziona esattamente - sia

  • il browser analizza e rende la pagina, quindi una volta che ha finito nota il DOM è cambiato, con conseguente script ga.js essere scaricato ed eseguito

o

  • il browser inizia a scaricare il codice JavaScript in parallelo con altre risorse.

Penso che sia il secondo.

Il nuovo snippet di Google Analytics asincrono include l'attributo async HTML5 nell'elemento di script che crea. Ciò non aiuterà il problema del blocco della pagina, che è già stato risolto con la tecnica "Script DOM Element". Quindi cosa aggiunge asincrono all'immagine? Secondo w3schools, "se è presente async, lo script viene eseguito in modo asincrono con il resto della pagina (lo script verrà eseguito mentre la pagina continua l'analisi)".

E secondo il sito di Steve Souders, "il vantaggio principale di questo [attributo async] è che dice al browser che gli script successivi possono essere eseguiti immediatamente - non devono aspettare ga.js".

Quindi la tecnica degli elementi DOM di Script e Sincronizzazione risolvono entrambi lo stesso problema?

Grazie.

risposta

8

L'attributo async è solo più chiaro (senza ambiguità molto semplice) e più pulito (sarà, o è già, parte delle rispettive specifiche HTML5) l'approccio per risolvere il problema. Se il tuo sito pubblica script da un altro dominio (o CDN), allora l'attributo async ti dà un po 'di affidabilità (consenti all'utente di leggere almeno il contenuto statico) in quanto la pagina non si bloccherà mentre uno script da un lento (forse giù) l'host remoto sta tentando di caricare.

+0

Ciao. Grazie per la risposta. Penso che tu sia d'accordo sul fatto che non ci siano differenze? Questa è la conclusione cui sono giunto, ma ho notato che questo post del rispettato Steve Souders suggerisce che c'è un netto vantaggio dall'uso del tag asincrono oltre la tecnica dell'elemento DOM Script [collegamento] (http: //www.stevesouders .com/blog/2009/12/01/google-analytics-va-async /). – user265330

+0

@ user265330 - l'articolo è del 2009 e non menziona l'attributo ASYNC sui tag di script. –

+0

Sì, lo fa. Sotto 'The Async snippet', il codice usa setAttribute per impostare async (ok, non come nel più recente ga snippet, ma è irrilevante) e poi continua a dire "... l'attributo 'async' è impostato su 'vero'. Molto bello! Il vantaggio principale di questo è che dice al browser che gli script successivi possono essere eseguiti immediatamente - non devono aspettare per ga.js. " – user265330

9

funzionerà:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 
<script>$('body').append('Yey');</script> 

non funzionerà:

<script async src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 
<script>$('body').append('Yey');</script> 
+1

Sì, trovo che poca gente ne parli ... devi usa l'attributo onload = "blah()" per fare il tuo init dopo il download dello script, o altrimenti metti semplicemente il codice init alla fine dello script stesso (non fare affidamento sul tradizionale $ (documento) .ready() però, perché non funzionerà più) –

+0

Molto bene il problema è stato risolto! - Vorrei sottolineare, che mentre il 2 è certo di non lavorare, 1 ° non è sicuro di preoccuparsi. Esprimendo semplicemente un intento, questo è ciò che si desidera ... (in pratica ovviamente avvolgendo qualsiasi manipolazione dom in un evento DOM-ready ...) –

2

C'è stato un grande article da Jake Archibald su HTML5Rocks che affronta questo argomento.

+0

Ma ha ragione, è un buon articolo. +1. – user265330

+0

@millimoose: l'articolo mostra le differenze e le conseguenze tra i diversi modi di caricare uno script. Quindi sì, fornisce informazioni relative alla domanda di user265330. – cr0

+2

@ cr0 È generalmente preferibile dimostrare effettivamente l'applicabilità di ciò a cui ci si collega, tracciando le parti più rilevanti di esso nella risposta. ([Vedi la meta domanda.] (Http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers)) Fondamentalmente la tua risposta dovrebbe stare in piedi il suo (che non è), e qualsiasi cosa a cui si collega dovrebbe fornire ulteriori informazioni. Altrimenti verosimilmente sarai messo in ombra da qualcuno disposto a impegnarsi di più. – millimoose

0

Secondo https://www.html5rocks.com/en/tutorials/speed/script-loading/ se si aggiunge dinamicamente un elemento <script> esso può non essere eseguito fino a quando DOMContentLoaded viene licenziato. Cioè, alcuni user agent (ad esempio MSIE 10) attenderanno che DOM sia pronto prima di eseguire dinamicamente gli elementi aggiunti <script>.

Immagino che Google voglia far funzionare il proprio codice di analisi più velocemente su tali agenti utente e come tale devono aggiungere il flag async per comunicare al browser (ad esempio MSIE 10) che è possibile iniziare a eseguire lo script il prima possibile. I browser compatibili con HTML5 verrebbero eseguiti come se lo async fosse vero anche se non era stato definito, quindi lo async=true è stato aggiunto solo per migliorare le prestazioni con i browser non HTML5.

Problemi correlati