Când încorporarea JavaScript într-un document HTML, unde este locul potrivit pentru a pune <script> tag-uri și incluse JavaScript? Îmi amintesc că tu nu ar trebui să loc aceste în<head> secțiune, dar plasarea la începutul
Deci, în cazul în care is locul potrivit pentru a pune `<script> tag-uri?
(Această întrebare bibliografie această întrebare, în care s-a sugerat că JavaScript apeluri de funcții ar trebui să fie mutat de la <a> tag-uri pentru a
<script> tag-uri. Am'm în mod special folosind jQuery, dar mai general, răspunsurile sunt, de asemenea, adecvat.)
Aici's ce se întâmplă atunci când un browser încarcă un site web cu un <script>
eticheta pe ea:
Pasul #4 provoacă un rău experiența utilizatorului. Site-ul practic se oprește de încărcare de până la tine'am descarcat toate script-urile. Dacă nu's un lucru pe care utilizatorii urasc's de așteptare pentru un site web să se încarce.
Orice script poate introduce propria HTML prin document.scrie()` sau alte DOM manipulări. Acest lucru implică faptul că parser trebuie să așteptați până când scenariul a fost descarcat de & executat înainte de a putea analiza în condiții de siguranță restul documentului. După toate, script-ul ar putea au introdus propriile HTML din document.
Cu toate acestea, cei mai mulți dezvoltatori JavaScript nu mai manipula DOM în timp ce documentul se încarcă. În schimb, ei așteaptă până când documentul a fost încărcată înainte de a modifica aceasta. De exemplu:
<!-- index.html -->
<html>
<head>
<title>My Page</title>
<script type="text/javascript" src="my-script.js"></script>
</head>
<body>
<div id="user-greeting">Welcome back, user</div>
</body>
</html>
Javascript:
// my-script.js
document.addEventListener("DOMContentLoaded", function() {
// this function runs when the DOM is ready, i.e. when the document has been parsed
document.getElementById("user-greeting").textContent = "Welcome back, Bart";
});
Pentru că browser-ul nu stiu my-script.js e't de gând să modifice documentul până când acesta a fost descărcat de & executat, parser-ul se oprește de parsare.
Vechea abordare la rezolvarea acestei probleme a fost de a pune <script> tag-uri în partea de jos a
Această abordare are propriile sale probleme: browser-ul nu poate începe descărcarea script-uri până când întregul document este analizat. Pentru mai mari site-uri cu script-uri de mare & foi de stil, fiind capabil de a descărca script-ul cât mai curând posibil, este foarte important pentru performanta. Dacă site-ul dvs. nu't se încarcă în 2 secunde, oamenii vor merge la un alt site.
Într-o soluție optimă, browser-ul va începe descărcarea script-uri cât mai curând posibil, în timp ce, în același timp, parsarea restul documentului.
Astăzi, browsere sprijini "asincron" și amân
atribute pe scripturi. Aceste atribute spune browser-ului it's în condiții de siguranță pentru a continua parcurgerea în timp ce script-uri sunt descărcate.
<script type="text/javascript" src="path/to/script1.js" async></script>
<script type="text/javascript" src="path/to/script2.js" async></script>
Script-uri cu async atribut sunt executate în mod asincron. Acest lucru înseamnă script-ul este executat de indata ce-l's descărcat, fără blocarea browser-ul în timp. Acest lucru implică faptul că l's posibil pentru a script-ul 2 este descărcat & executat înainte de script-1.
Potrivit http://caniuse.com/#feat=script-async, 94.57% din toate browserele suporta acest lucru.
<script type="text/javascript" src="path/to/script1.js" defer></script>
<script type="text/javascript" src="path/to/script2.js" defer></script>
Script-uri cu amâna atribut sunt executate în ordine (de exemplu, primul scenariu 1, atunci scenariul 2). Acest lucru, de asemenea, nu va bloca browser-ul.
Spre deosebire de script async, amâna scripturile sunt executate numai după ce întregul document a fost încărcat.
Potrivit http://caniuse.com/#feat=script-defer, 94.59% din toate browserele suporta acest lucru. 94.92% susțin că cel puțin parțial.
O notă importantă pe browser-ul compatibilitate: în unele circumstanțe IE <= 9 poate executa amânat script-uri de comanda. Dacă aveți nevoie pentru a sprijini aceste browsere, vă rugăm să citiți acest primul!
Actualul state-of-the-art este de a pune script-uri în <head>
tag-ul și de a folosi "asincron" sau amân
atribute. Acest lucru permite script-uri pentru a fi descărcate imediat, fără a bloca browser-ul dumneavoastră.
Un lucru bun este că site-ul ar trebui să mai încarce corect pe 6% din browsere care nu acceptă aceste atribute în timp ce accelerarea alte 94%.
Chiar înainte de închiderea tag-ul body, după cum se menționează pe
http://developer.yahoo.com/performance/rules.html#js_bottom
Pune Script-uri în partea de Jos
problema cauzată de script-uri este faptul că acestea bloca descărcări paralele. HTTP/1.1 host sugerează că browsere download nu mai mult de două componente în paralel pe gazdă. Dacă vă servi imagini de la mai multe nume de gazdă, puteți obține mai mult de două descărcări să apară în paralel. În timp ce un script este de a descărca, cu toate acestea, browser-ul a câștigat't de a începe orice alte popularitate, chiar și pe diferite nume.
Non-blocare script tag-uri pot fi plasate aproape oriunde:
<script src="script.js" async></script>
<script src="script.js" defer></script>
<script src="script.js" async defer></script>
amân
script-ul este executat atunci când documentul a terminat de parsareasincron amâna
script cade înapoi la amâna comportament dacă asincron nu este acceptatAstfel de script-uri va fi executat în mod asincron/după documentul gata, ceea ce înseamnă că nu poate face acest lucru:
<script src="jquery.js" async></script>
<script>jQuery(something);</script>
<!--
* might throw "jQuery is not defined" error
* defer will not work either
-->
Sau asta:
<script src="document.write(something).js" async></script>
<!--
* might issue "cannot write into document from an asynchronous script" warning
* defer will not work either
-->
Sau asta:
<script src="jquery.js" async></script>
<script src="jQuery(something).js" async></script>
<!--
* might throw "jQuery is not defined" error (no guarantee which script runs first)
* defer will work in sane browsers
-->
Sau asta:
<script src="document.getElementById(header).js" async></script>
<div id="header"></div>
<!--
* might not locate #header (script could fire before parser looks at the next line)
* defer will work in sane browsers
-->
Având în a spus că, asincron script-uri oferă aceste avantaje:
Este posibil de a eluda ordinea de executare probleme prin utilizarea de script-uri externe care susțin callback. Multe terț Api-uri JavaScript acum suport non-blocare executie. Aici este un exemplu de încărcare Google Maps API asincron.
Sfatul standard, promovate de Yahoo! Performanță excepțională echipă, este de a pune `<script> tag-uri la sfârșitul documentului corpului, astfel încât acestea nu't bloc de randare a paginii.
Dar există unele abordări mai noi, care oferă o performanță mai bună, așa cum este descris în acest răspuns despre timpul de încărcare de la Google Analytics JavaScript fișier:
Există unele mare de slide-uri de Steve Souders (client-side de performanță expert) despre:
- tehnici Diferite pentru a încărca externe JavaScript fișiere în paralel
- efectul lor pe timpul de încărcare și de randare a paginii
- ce fel de "în curs" indicatori de browser-ul afișează (de exemplu, 'de încărcare' în bara de stare, clepsidra cursorul mouse-ului).
Dacă utilizați JQuery apoi pune javascript oriunde te-ai găsi cele mai bune și de a folosi $(document).gata()
pentru a se asigura că lucrurile sunt încărcate în mod corespunzător înainte de a executa orice funcții.
Pe o notă parte: - îmi plac toate tag-uri script în `
secțiune pentru ca asta pare a fi cel mai curat loc.<script src="myjs.js"></script>
</body>
tag script ar trebui să fie utilizați întotdeauna înainte de corp de aproape sau de Jos în HTML fișier.
apoi, puteți vedea conținutul de pe pagina întâi înainte de încărcare js fișier.
verifica acest lucru, dacă necesită : http://stevesouders.com/hpws/rule-js-bottom.php
XHTML Câștigat't Valida dacă script-ul este în altă parte decât în elementul head. se pare că poate fi peste tot.
Puteți amâna executarea cu ceva, cum ar fi jQuery, așa că nici't contează de unde's a plasat (cu excepția pentru o mică performanță lovit în timpul parsarea).
Abordarea modernă în 2019 este folosind ES6 module de tip script.
<script type="module" src="..."></script>
În mod implicit, module sunt încărcate asincron și defered. adică le puteți plasa oriunde și se va încărca în paralel și executa atunci când pagina finisaje de încărcare.
Diferențele între un scenariu și un modul sunt descrise aici:
https://stackoverflow.com/a/53821485/731548
Executarea unui modul, comparativ cu un scenariu este descris aici:
https://developers.google.com/web/fundamentals/primers/modules#defer
Suportul este afișat aici:
Convenționale (și acceptat pe scară largă) raspunsul este "în partea de jos", pentru că atunci întregul DOM va fi fost încărcată înainte de orice se poate începe executarea.
Există disidenți, din diverse motive, începând cu practica disponibile pentru a intenționat să înceapă executarea cu o pagina evenimentului onload.
Depinde, dacă încărcați un script care's necesare pentru stilul tău pagina / folosind acțiuni în pagina dvs. (cum ar fi clic pe un buton), atunci ai face bine să-l loc pe partea de sus. Dacă stilul dvs. este de 100% CSS și aveți toate opțiuni de rezervă pentru acțiuni buton atunci puteți să-l plasa în partea de jos.
Sau cel mai bun lucru (dacă este ca's nu constituie o problema) este ca poti face un modal de încărcare cutie, loc javascript în partea de jos a paginii și de a face să dispară atunci când ultima linie de script-ul dvs. se încarcă. În acest fel puteți evita utilizatorii care folosesc acțiuni în pagina dvs. înainte de script-uri sunt încărcate. Și, de asemenea, pentru a evita necorespunzătoare styling.
Inclusiv script-uri de la final este folosit în special în cazul în care conținutul/ stiluri de site-ul web este de a fi prezentat pentru prima dată.
inclusiv script-uri în cap mulțime de script-uri mai devreme și poate fi folosit înainte de încărcare a întregului site web.
dacă script-uri sunt introduse la ultima validare se va întâmpla numai după încărcarea întregii stiluri si design care nu este apreciat pentru rapid, receptiv, site-uri web.
Dacă vă mai pasă mult sprijin și performanță în IE<10, l's cel mai bun de a face MEREU tag-uri script ultima categorie de HTML corpului. Așa,'re sigur că restul de DOM a fost încărcat și nu te vei't de bloc și redare.
Dacă tu nu't pasă prea mult despre IE<10, ați putea dori pentru a pune script-uri în cap de document și de a folosi amâne, pentru a asigura că se execută numai după DOM a fost încărcat (
<script type="text/javascript" src="calea/catre/script1.js" amâne></script>). Dacă totuși doriți codului dvs. de a lucra în IE<10, don't uitați să-și încheie codul dvs. într-o fereastră.onload
chiar, deși!
În funcție de script-ul și utilizarea acestuia cel mai bun posibil (în termeni de încărcare a paginii și timp de redare) poate fi de a nu folosi convențional <script> tag-ul în sine, dar să-dinamic de declanșare la încărcare de script-ul asincron.
Există unele tehnici diferite, dar cel mai drept înainte este de a folosi document.createElement("script") atunci când fereastra.onload, evenimentul este declanșat. Apoi, script-ul este încărcat în primul rând atunci când pagina în sine a devenit, prin urmare, nu influențează momentul în care utilizatorul trebuie să aștepte pentru ca pagina să apară.
Acest lucru necesită în mod natural că script-ul în sine nu este necesar pentru randarea paginii.
Pentru mai multe informații, a se vedea post de Cuplare asincron script de către Steve Souders (creator de YSlow dar acum de la Google).
La cel mai bun loc pentru a pune <script> tag este înainte de închidere
tag, astfel încât descărcarea și executarea nu't bloca browser-ul pentru a analiza html în document,
De asemenea, încărcarea de fișiere js extern a-l's avantaje ca va fi cache de browsere și poate a accelera timpul de încărcare pagina, - l separă cod HTML și JavaScript și ajutor pentru a gestiona baza de cod mai bine.
dar browserele moderne sprijini, de asemenea, unele alte modalități optime de genul "asincron" și amân
pentru a încărca externe "javascript" fișiere.
În mod normal, HTML, pagina de execuție începe linie cu linie. Atunci când o sursă externă de JavaScript <script> element este întâlnit, HTML parsing este oprit până când JavaScript este să descărcați și gata pentru execuție. Aceasta pagina normala de executie poate fi schimbat folosind amân
și "asincron" atribut.
Amân
Atunci când un amâna atribut este folosit, JavaScript este descărcat în paralel cu HTML parsing dar va fi executa numai după complet HTML parsing se face.
<script src="/local-js-path/myScript.js" defer></script>
Când asincron atribut este folosit, JavaScript este descărcat imediat ce script este întâlnit și după descărcare, acesta va fi executat în mod asincron (în paralel), împreună cu HTML parsing.
<script src="/local-js-path/myScript.js" async></script>
amânare
, apoi
script1 este garantat pentru a executa mai întâi,referință:knowledgehills.com
Script blocuri DOM încărca pana l's încărcat și executat.
Dacă plasați script-uri la final de <body>
toate DOM are sansa de a încărca și face (pagina va "afișare" mai repede). <script>
va avea acces la toate aceste elemente DOM.
În altă parte, plasându-se după <body>
start sau de mai sus va executa script-ul (în cazul în care nu's încă nici elemente DOM).
Sunteți inclusiv jQuery, care înseamnă că puteți plasa oriunde doriți și de a folosi .gata()
Cred că depinde pe pagina de execuție. Dacă pagina pe care doriți să display nu este afișat în mod corespunzător, fără încărcare JavaScript în primul rând, atunci ar trebui să includă JavaScript fișier în primul rând. Dar Dacă puteți afișa/render-o pagină web fără a descărca inițial fișier JavaScript, atunci ar trebui să pui codul JavaScript în partea de jos a paginii. Pentru că se va crea un rapid de încărcare a paginii, și de la un utilizator's punct de vedere se pare că pagina se încarcă mai repede.
Puteți plasa mai de <script> trimiterile la sfârșitul lui
cel mai bun loc pentru a scrie "JavaScript" codul de la sfârșitul documentului codul după tag-ul pentru a încărca documentul apoi executa cod js. și dacă u scrie "JQuery" cod scrie
$(document).ready(function(){
//your code here...
});