2012-12-11 9 views
43

Vorrei caricare il seguente codice JavaScript utilizzando sia rinviare e asincrone:È possibile utilizzare sia gli attributi asincroni che quelli di rinvio su un tag di script HTML?

<script defer async src="/js/somescript.js"></script>

Da rinviare è supportato da Internet Explorer 5.5+, come si può vedere in CanIUse.com, vorrei grazia fallback usare il differimento se async non è disponibile. Async penso che sia meglio usare quando è disponibile ma non è supportato fino a Internet Explorer 10.

La mia domanda è quindi è il codice HTML valido sopra? In caso contrario, è possibile creare questa situazione utilizzando JavaScript che rientri con garbo all'utilizzo di un rinvio su uno script quando async non è disponibile?

risposta

75

Dalla specifica: https://www.w3.org/TR/2011/WD-html5-20110525/scripting-1.html#attr-script-async

L'attributo rinviare può essere specificato anche se è specificato l'attributo async, per provocare i browser legacy Web che supportano solo rinviare (e non asincrone) a ripiegare al comportamento rinviare invece del comportamento di blocco sincrono che è l'impostazione predefinita.

+9

+1 per approfondire la specifica W3C –

+0

È vero ?: 1.both 'async'' defer' esiste, i browser moderni funzionano come' async'; 2.both 'async'' defer' esiste, i vecchi browser funzionano come' defer' invece di comportamento 'default' – vikyd

8

Sì, è un HTML valido e funzionerà come previsto.

Qualsiasi W3C browser compatibile riconoscerà l'asincrona attributo e curare lo script correttamente, mentre l'eredità IE versioni riconosceranno il rinviare dell'attributo .

Dal momento che entrambi gli attributi sono booleano tu non dover assegnare qualsiasi valore.

+0

Grazie @jandy per un'altra grande risposta! –

+1

"... funzionerà come previsto." Che cosa ti aspetti che faccia comunque ?! –

4

La domanda è: cosa ti aspetti che faccia? Se entrambi asincrona e rinviare sono presenti mi aspetterei lo script per essere differita ed eseguito solo dopo DOMContentLoaded quando il browser è inattivo, ma se sto leggendo le specifiche destra sembra che rinviare viene ignorata se async viene impostato e lo script viene caricato in modo asincrono, quindi verrà eseguito non appena sarà disponibile, cosa che potrebbe accadere prima di DOMContentLoaded e potrebbe bloccare altre risorse.

Esistono tre modalità possibili che possono essere selezionate utilizzando questi attributi. Se l'attributo async è presente, lo script verrà eseguito in modo asincrono, non appena sarà disponibile. Se l'attributo async non è presente ma è presente l'attributo defer, lo script viene eseguito quando la pagina ha terminato l'analisi. Se nessuno degli attributi è presente, lo script viene recuperato ed eseguito immediatamente, prima che l'agente utente continui ad analizzare la pagina.

https://www.w3.org/TR/2011/WD-html5-20110525/scripting-1.html#attr-script-async

Problemi correlati