HTML işaretlemesine <script> etiketlerini nereye koymalıyım?


1488

JavaScript'i bir HTML belgesine gömerken, <script>etiketleri ve içerilen JavaScript'i koymak için uygun yer nerede ? Bunları <head>bölüme yerleştirmemeniz gerektiğini hatırlıyorum , ancak bölümün başlangıcına yerleştirme de <body>kötü, çünkü sayfa tamamen (veya böyle bir şey) işlenmeden önce JavaScript ayrıştırılmalıdır. Bu , bölümün sonunu etiketler <body>için mantıklı bir yer olarak bırakıyor gibi görünüyor <script>.

Yani, nerede olduğunu koymak için doğru yer <script>etiketlerini?

(Bu soru , JavaScript işlev çağrılarının etiketlerden etiketlere taşınması gerektiği önerildiği bu soruya<a> başvurmaktadır <script>. Özellikle jQuery kullanıyorum, ancak daha genel cevaplar da uygun.)


sadece basit bir çözüm arıyorsanız ve Jekyll gibi bazı sunucu tarafı jeneratör kullanıyorsanız, bunun yerine komut dosyası dahil etmenizi öneririz. çok daha basit!
cregox

Yanıtlar:


1862

Bir tarayıcı <script>üzerinde etiketi olan bir web sitesi yüklediğinde şunlar olur :

  1. HTML sayfasını getirin (örn. İndex.html)
  2. HTML'yi ayrıştırmaya başlayın
  3. Ayrıştırıcı <script>, harici bir komut dosyasına başvuran bir etiketle karşılaşır .
  4. Tarayıcı kod dosyasını ister. Bu arada, ayrıştırıcı, sayfanızdaki diğer HTML'yi ayrıştırmayı engeller ve durdurur.
  5. Bir süre sonra komut dosyası indirilir ve daha sonra yürütülür.
  6. Ayrıştırıcı, HTML belgesinin geri kalanını ayrıştırmaya devam eder.

4. Adım kötü bir kullanıcı deneyimine neden oluyor. Web siteniz temel olarak tüm komut dosyalarını indirinceye kadar yüklemeyi durdurur. Kullanıcıların nefret ettiği bir şey varsa, bir web sitesinin yüklenmesini bekler.

Bu neden oluyor?

Herhangi bir komut dosyası kendi HTML'sini document.write()veya diğer DOM manipülasyonları aracılığıyla ekleyebilir . Bu, ayrıştırıcının belgenin geri kalanını güvenle ayrıştırmadan önce komut dosyasının indirilip yürütülmesini beklemesi gerektiği anlamına gelir. Sonuçta, senaryo olabilir belgede kendi HTML taktınız.

Ancak, çoğu JavaScript geliştiriciler artık DOM işlemek iken belge yükleme olduğunu. Bunun yerine, belgeyi değiştirmeden önce yüklenmesini beklerler. Örneğin:

<!-- index.html -->
<html>
    <head>
        <title>My Page</title>
        <script 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";
});

Tarayıcınız my-script.js dosyasını indirilinceye ve yürütülene kadar belgede değişiklik yapmayacağını bilmediğinden, ayrıştırıcı ayrıştırmayı durdurur.

Antika öneri

Bu sorunu çözmenin eski yaklaşımı <script>etiketleri etiketinizin altına yerleştirmekti <body>, çünkü bu ayrıştırıcının sonuna kadar engellenmemesini sağlar.

Bu yaklaşımın kendi sorunu vardır: belgenin tamamı ayrıştırılıncaya kadar tarayıcı komut dosyalarını indirmeye başlayamaz. Büyük komut dosyaları ve stil sayfaları olan daha büyük web siteleri için, komut dosyasını en kısa zamanda indirebilmek performans için çok önemlidir. Web siteniz 2 saniye içinde yüklenmezse kullanıcılar başka bir web sitesine gider.

Optimal bir çözümde, tarayıcı komut dosyalarınızı mümkün olan en kısa sürede indirmeye başlar ve aynı zamanda belgenizin geri kalanını ayrıştırır.

Modern yaklaşım

Bugün, tarayıcılar komut dosyalarındaki asyncve deferözelliklerini destekler . Bu özellikler, tarayıcıya komut dosyaları indirilirken ayrıştırmaya devam etmenin güvenli olduğunu söyler.

zaman uyumsuz

<script src="path/to/script1.js" async></script>
<script src="path/to/script2.js" async></script>

Eşzamansız özniteliğe sahip komut dosyaları eşzamansız olarak yürütülür. Bu, komut dosyasının indirilir indirilmez, bu arada tarayıcıyı engellemeden yürütüldüğü anlamına gelir.
Bu, komut dosyası 2'nin komut dosyası 1'den önce indirilip çalıştırılabileceğini gösterir.

Http://caniuse.com/#feat=script-async'e göre , tüm tarayıcıların% 97,78'i bunu desteklemektedir.

erteleme

<script src="path/to/script1.js" defer></script>
<script src="path/to/script2.js" defer></script>

Erteleme özniteliğine sahip komut dosyaları sırayla yürütülür (örn. Önce komut dosyası 1, sonra komut dosyası 2). Bu ayrıca tarayıcıyı engellemez.

Zaman uyumsuz komut dosyalarının aksine, erteleme komut dosyaları yalnızca tüm belge yüklendikten sonra yürütülür.

Http://caniuse.com/#feat=script-defer'e göre , tüm tarayıcıların% 97,79'u bunu desteklemektedir. % 98.06'sı en azından kısmen destekliyor.

Tarayıcı uyumluluğu hakkında önemli bir not: bazı durumlarda IE <= 9, ertelenmiş komut dosyalarını bozuk çalıştırabilir. Bu tarayıcıları desteklemeniz gerekiyorsa, lütfen önce bunu okuyun !

Sonuç

Tekniğin bilinen durumu, <head>etikete komut dosyaları koymak ve asyncveya deferözniteliklerini kullanmaktır . Bu, komut dosyalarınızın tarayıcınızı engellemeden en kısa sürede indirilmesini sağlar.

İyi olan şey, web sitenizin diğer özellikleri% 98'i hızlandırırken bu özellikleri desteklemeyen tarayıcıların% 2'sine doğru bir şekilde yüklenmesidir.


63
Kimsenin Google'ın açıklamasından alıntı yapmadığına şaşırdım ... developers.google.com/speed/docs/insights/BlockingJS
Casey Falk

6
DOM'ya neyin dokunup neyin dokunmadığı konusunda net değilim. Açıklayabilir misin? Jquery.js gibi bir şeyde zaman uyumsuz bir yükleme yapmak güvenli mi?
Doug

7
@ Dock Örneğin document.writedom üzerinde çalışır. Soru değil eğer bir komut dom işleyen, ama ne zaman öyle. domreadyEtkinlik tetiklendikten sonra tüm dom manipülasyonu gerçekleştiği sürece , sorun olmaz. jQuery bir kütüphanedir ve bu nedenle domu kendi başına değiştirmez veya etmemelidir.
Bart

24
Bu cevap yanıltıcı. Modern tarayıcılar, HTML'yi etkileyebilecek eşzamanlı bir komut dosyası etiketine ulaştıklarında ayrıştırmayı durdurmazlar, oluşturmayı / yürütmeyi durdururlar ve HTML etkilenmezse daha sonra istenecek diğer kaynakları indirmeye başlamak için iyimser ayrıştırmaya devam ederler.
Fabio Beltramini

40
asyncVe deferöznitelikleri neden hiçbir yerde kullanılmıyor? Demek istediğim, internetten çok sayıda HTML kaynağı görüntüledim asyncve deferhiçbir yerde ve özelliklerini göremiyorum. ...?
john cj

239

Kapanan gövde etiketinden hemen önce,

http://developer.yahoo.com/performance/rules.html#js_bottom

Komut Dosyalarını Alta Koy

Komut dosyalarının neden olduğu sorun paralel indirmeleri engellemesidir. HTTP / 1.1 belirtimi, tarayıcıların ana bilgisayar adı başına paralel olarak en fazla iki bileşen indirmesini öneriyor. Resimlerinizi birden çok ana bilgisayar adından sunuyorsanız, paralel olarak ikiden fazla indirme gerçekleştirebilirsiniz. Ancak bir komut dosyası indirilirken, tarayıcı farklı ana bilgisayar adlarında bile başka herhangi bir indirme işlemi başlatmaz.


7
Kavramı ve açıklamasını kabul etti. Ancak kullanıcı sayfa ile oynamaya başlarsa ne olur. Sayfa kullanıcıya göründükten sonra yüklemeye başlayacak bir AJAX açılır listem olduğunu varsayalım, ancak yüklenirken kullanıcı tıklar! Peki ya 'gerçekten sabırsız' bir kullanıcı formu gönderirse?
Hemant Tank

9
@Hermant Eski yorum, ancak alanları varsayılan olarak devre dışı bırakma ve ardından DOM tamamen yüklendiğinde JS'yi kullanma hile yapabilirsiniz. Facebook bugünlerde böyle görünüyor.
novato

2
Bunun hala aynı olup olmadığını kontrol etmek için bunu kromla test ettim. Bu. Tarayıcılarınızın sayfa yükleme süresindeki farklılıkları buradan kontrol edebilirsiniz. stevesouders.com/cuzillion
cypher

46
Bu en iyi yöntemse, yığın taşması neden tüm komut dosyası etiketlerini <head> içine ekler? :-P
Philip

10
Bazı durumlarda, özellikle ajax ağır sitelerde, kafadan yükleme aslında daha hızlı yükleme sürelerine neden olabilir. Bkz: encosia.com/dont-let-jquerys-document-ready-slow-you-down ("live ()" işlevinin jquery'de kullanımdan kaldırıldığını, ancak makalenin yine de "on ()" veya " delege "işlevi). @Hermant tarafından belirtildiği gibi doğru davranışı garanti etmek için <head> içine yükleme de gerekebilir. Son olarak, modernizr.com/docs sitesinde açıklandığı nedenlerle komut dosyalarını <head> içine yerleştirmenizi önerir.
Nathan

77

Engellemeyen komut dosyası etiketleri hemen hemen her yere yerleştirilebilir:

<script src="script.js" async></script>
<script src="script.js" defer></script>
<script src="script.js" async defer></script>
  • async komut dosyası hazır olur olmaz eşzamansız olarak yürütülür
  • defer komut dosyası, belge ayrıştırmayı tamamladığında yürütülür
  • async defer zaman uyumsuz desteklenmiyorsa komut dosyası erteleme davranışına geri döner

Bu tür komut dosyaları eşzamansız olarak / belge hazır olduktan sonra yürütülür, yani bunu yapamazsınız:

<script src="jquery.js" async></script>
<script>jQuery(something);</script>
<!--
  * might throw "jQuery is not defined" error
  * defer will not work either
-->

Veya bu:

<script src="document.write(something).js" async></script>
<!--
  * might issue "cannot write into document from an asynchronous script" warning
  * defer will not work either
-->

Veya bu:

<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
-->

Veya bu:

<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
-->

Bununla birlikte, eşzamansız komut dosyalarının bu avantajları sunduğunu belirttik:

  • Kaynakların paralel indirilmesi :
    Tarayıcı, bir komut dosyasının indirilmesini ve yürütülmesini beklemeden stil sayfalarını, görüntüleri ve diğer komut dosyalarını paralel olarak indirebilir.
  • Kaynak sırası bağımsızlığı :
    Komut dosyalarını engelleme konusunda endişelenmeden başınızın veya vücudunuzun içine yerleştirebilirsiniz (CMS kullanıyorsanız faydalıdır). Ancak infaz emri hala önemlidir.

Geri aramaları destekleyen harici komut dosyaları kullanarak yürütme sırası sorunlarını atlatmak mümkündür. Birçok üçüncü taraf JavaScript API'sı artık engellenmeyen yürütmeyi desteklemektedir. Google Haritalar API'sını eşzamansız olarak yüklemeye bir örnek .


2
Bu, bugün için doğru cevaptır - bu yaklaşımı kullanmak, widget'larınızı kendi içinde tutmanın daha kolay olduğu anlamına gelir, fantezi <head>dahil mantığa gerek yoktur .
Daniel Sokolowski

1
Eğer kullanamazsınız neden karıştı asyncveya defersize ikinci blokta belirttiğiniz şekilde jQuery dahil olduğunda: <script src="jquery.js" async></script>. Nedenini açıklayabilir misiniz? Performans için async etiketine sahip olmam gerektiğini düşündüm - kabul edilen cevap başına - jQuery hala yüklenirken bile sayfam yüklenebilir]. Teşekkürler!
elbowlobstercowstand

3
@elbow% 99'unu sayfanın herhangi bir yerinde bloklar <script src=jquery.js>izliyor $(function(){ ... }). Eşzamansız yükleme, tarayıcı bu blokları ayrıştırmaya çalıştığında jQuery'nin yükleneceğini garanti etmez, bu nedenle $ tanımlanmamış bir hatayı yükseltir (jQuery önbellekten yüklenmişse hatayı alamayabilirsiniz). JQuery'yi eşzamansız olarak yükleme ve koruma ile ilgili bir soruyu yanıtladı $(function(){ ... }). Bulabilir miyim bakacağım, ya da şu soruya bakabilirsiniz: stackoverflow.com/q/14811471/87015
Salman A

1
@SalmanA Teşekkürler! Evet, bu% 99'a düşüyorum. Önce jqueryyüklemek için lib'e, sonra kalan .jskomut dosyalarına ihtiyacım var. Beyan ettiğimdeasync veya deferüzerinde jquerylib komut etiketinde, benim .jskomut dosyaları çalışmaz. Bunu $(function(){ ... })koruduğumu sanıyordum - sanırım hayır. Güncel çözüm: Ben katmayan deferveya asyncüzerinde jquerylib komut, ama ben eklerim asynckadar benim takip üzerindeki .jskomut dosyaları. Not: Bunlardan herhangi birini yapmamın nedeni Google Page Speed'i mutlu etmektir. Yardım için tekrar teşekkürler! Başka herhangi bir tavsiye bekliyoruz. (Veya önceki cevabınıza bir bağlantı). :)
elbowlobstercowstand

@elbow Bkz. stackoverflow.com/a/21013975/87015 , size sadece bir fikir verir, ancak tam bir çözüm sunmaz . Bunun yerine "jquery async yükleyici kitaplıklarını" arayabilirsiniz.
Salman A

38

Yahoo! Olağanüstü Performans ekibi, <script>etiketleri sayfanın oluşturulmasını engellememeleri için belge gövdesinin sonuna yerleştirmektir.

Ancak , Google Analytics JavaScript dosyasının yükleme süresi hakkındaki bu yanıtta açıklandığı gibi, daha iyi performans sunan bazı yeni yaklaşımlar vardır :

Steve Souders (müşteri tarafında performans uzmanı) hakkında bazı harika slaytlar var:

  • Harici JavaScript dosyalarını paralel olarak yüklemek için farklı teknikler
  • yükleme süresi ve sayfa oluşturma üzerindeki etkileri
  • tarayıcının ne tür "devam ediyor" göstergeleri (örn. durum çubuğunda 'yükleme', kum saati fare imleci).

25

JQuery kullanıyorsanız, javascript'i en iyi bulduğunuz yere koyun ve kullanın $(document).ready() herhangi bir işlevi yerine getirmeden önce düzgün bir şekilde yüklendiğinden emin olmak için .

Yan not: Bölümdeki tüm script etiketlerimi <head>en temiz yer gibi görünüyor.


14
kafasında ... er? <header>?
Dan Lugg

7
Kullanmanın $(document).ready()JavaScript'inizi istediğiniz yere koyabileceğiniz anlamına gelmediğini unutmayın - hala <script src=".../jquery.min.js">jQuery'yi eklediğiniz yere koymanız gerekir , böylece $mevcut.
Rory O'Kane

2
Komut dosyası etiketlerini <head> bölümüne koymak en uygun yöntem değildir - bu, komut dosyaları yüklenene kadar sayfanın görünen bölümünün görüntülenmesini geciktirir.
CyberMonk

Hayır, @Dan, bir headeröğe HTML belgesi içeriğinin bir parçasıdır ve bodyelement . The head` etiketi içinde belgenin meta verileri ve içerik dışı verileri için bir veya daha fazla kez gerçekleşmelidir . O ile, bugünlerde deferve asyncscript etiketleri için ideal bir yer. headeröğeler yalnızca belgenin kendisini izleyen bölümünü tanımlayan bilgileri içermelidir.
ProfK

1
@ProfK, Dan bunu 4 yıl önce yayınladığında orijinal düzenlenmemiş sorudan bahsediyordu. Gördüğünüz gibi, soru bir yıl sonra düzenlendi.
kojow7

18

2019'daki modern yaklaşım ES6 modül tipi komut dosyalarını kullanmaktır .

<script type="module" src="..."></script>

Varsayılan olarak, modüller zaman uyumsuz olarak yüklenir ve ertelenir. yani bunları istediğiniz yere yerleştirebilirsiniz; bunlar paralel olarak yüklenir ve sayfa yüklenmeyi bitirdiğinde yürütülür.

Bir komut dosyası ve bir modül arasındaki farklar burada açıklanmaktadır:

https://stackoverflow.com/a/53821485/731548

Bir komut dosyasına kıyasla bir modülün yürütülmesi burada açıklanmıştır:

https://developers.google.com/web/fundamentals/primers/modules#defer

Destek burada gösterilir:

https://caniuse.com/#feat=es6-module


bilgi tabanına eklemek için güzel bir bilgi
Sagar

1
Sadece yerel dosya sisteminizde sunucu olmadan bir şeyler deniyorsanız bunun işe yaramayacağını unutmayın. Chrome'da en azından, her ikisi de dosya kaynağınız aynı kökene sahip olsa da HTML'den js yüklemeye çalışırken çapraz kökenli bir hata alırsınız.
hippietrail

11

Komut dosyası head öğesi dışında herhangi bir yerde ise XHTML Doğrulanmaz. her yerde olabileceği ortaya çıktı.

Yürütmeyi jQuery gibi bir şeyle erteleyebilirsiniz, böylece nereye yerleştirildiği önemli değildir (ayrıştırma sırasında küçük bir performans isabeti dışında).


1
XHTML, vücuttaki komut dosyası etiketleriyle hem katı hem de geçişli olarak doğrulayacaktır. Ancak stil etiketleri yalnızca başlıkta olabilir.
I.devries

11
<script src="myjs.js"></script>
</body>

komut dosyası etiketi gövdeyi kapatmadan önce veya HTML dosyasında Alttan önce kullanılmalıdır .

js dosyasını yüklemeden önce sayfanın içeriğini görebilirsiniz .

gerekiyorsa bunu kontrol edin: http://stevesouders.com/hpws/rule-js-bottom.php


2
Bu aslında soruyu yanıtladı. Gönderilen neredeyse tüm örneklerin "sayfanın sonu" nun düzgün görsel bağlamını hiç vermediğini merak ediyordum
Ken Ingram

1
Bu cevap çok yanıltıcı ve büyük olasılıkla yanlıştır. Google ve MDN'deki makaleler , senkronize JS'nin (buradaki durum) her zaman DOM yapısını ve ayrıştırmayı engellediğini ve bu da ilk render işleminin gecikmesine neden olacağını önermektedir. Bu nedenle, JS dosyanızı alındığı ve JS dosyanızı senkronize olduğu sürece HTML belgesine nereye koyduğunuza bakılmaksızın sayfanın içeriğini göremezsiniz
Lingaraju EV

Ayrıca 2009 yılında yapılan ve artık ilgili olmayan noktalara da atıfta bulunmaktadır.
toxaq

7

Geleneksel (ve yaygın olarak kabul edilen) cevap "en altta" dır, çünkü daha sonra herhangi bir şey yürütülmeye başlamadan önce tüm DOM yüklenecektir.

Çeşitli nedenlerden ötürü, bir sayfa onload olayıyla kasıtlı olarak yürütmeye başlamak için mevcut uygulamadan başlayarak muhalifler vardır.


6

Koymak için en iyi yer <script>etiketi kapanış öncedir </body>etiketi , indirme yüzden ve o belgede html ayrıştırmak için tarayıcı engellemez yürütülürken

Ayrıca dışarıdan vardır kendi avantajları vardır js dosyaları yükleme öyle olacak tarayıcılar tarafından önbelleğe edebilir sayfa yükleme sürelerini hızlandırmak , bu HTML ve JavaScript kodu ayıran ve daha iyi kod tabanını yönetmek için yardıma .

ancak modern tarayıcılar harici dosyaları yüklemek asyncve deferyüklemek gibi diğer en uygun yolları da destekler javascript.

Asenkron ve Erteleme

Normalde HTML sayfası yürütme satır satır başlar. Harici bir JavaScript öğesiyle karşılaşıldığında, bir JavaScript indirilip çalıştırılmaya hazır olana kadar HTML ayrıştırma durdurulur. Bu normal sayfa yürütme deferve asyncözniteliği kullanılarak değiştirilebilir .

Defer

Bir erteleme özelliği kullanıldığında, JavaScript HTML ayrıştırma ile paralel olarak indirilir, ancak yalnızca tam HTML ayrıştırma yapıldıktan sonra yürütülür.

<script src="/local-js-path/myScript.js" defer></script>

Async

Eşzamansız öznitelik kullanıldığında, komut dosyasıyla karşılaşır karşılaşmaz JavaScript indirilir ve indirme işleminden sonra HTML ayrıştırma ile birlikte eşzamansız olarak (paralel olarak) yürütülür.

<script src="/local-js-path/myScript.js" async></script>

Hangi özellikler ne zaman kullanılır?

  • Komut dosyanız diğer komut dosyalarından bağımsız ve modüler ise kullanın async.
  • Script1 ve script2 ile birlikte yüklüyorsanız async, her ikisi
    de indirilir
    ve kullanılabilir olur olmaz HTML ayrıştırma ile paralel olarak çalışır .
  • Komut dosyanız başka bir komut dosyasına bağlıysa, deferher ikisi için de kullanın :
  • Script1 ve script2 bu sırayla yüklendiğinde defer, önce script1'in yürütülmesi garanti edilir,
  • Ardından, script1 tamamen yürütüldükten sonra script2 yürütülür.
  • Script2 script1'e bağlıysa bunu yapmalıdır.
  • Komut dosyanız yeterince küçükse ve başka bir tür komut dosyasına bağlıysa, komut dosyanızı niteliksiz asynckullanın ve tüm asynckomut dosyalarının üstüne yerleştirin .

başvuru: Knowledgehills.com


3

Sayfanıza stil eklemek için gerekli bir komut dosyası yüklüyorsanız / sayfanızdaki eylemleri kullanarak (bir düğmeyi tıklamak gibi), üstüne yerleştirmeniz daha iyi olur. Stiliniz% 100 CSS ise ve düğme eylemleri için tüm yedek seçenekleriniz varsa, alt tarafa yerleştirebilirsiniz.

Veya en iyi şey (bu bir endişe değilse) kalıcı bir yükleme kutusu oluşturabilir, javascriptinizi sayfanızın altına yerleştirebilir ve komut dosyanızın son satırı yüklendiğinde kaybolmasını sağlayabilirsiniz. Bu şekilde, kullanıcılar komut dosyaları yüklenmeden önce sayfanızdaki işlemleri kullanmalarını önleyebilirsiniz. Ayrıca yanlış şekillendirmeden kaçının.


3

Sonda komut dosyaları eklemek, esas olarak web sitesinin içeriğinin / stillerinin önce gösterileceği yerlerde kullanılır.

komut dosyalarının kafaya dahil edilmesi komut dosyalarını erken yükler ve tüm web sitesinin yüklenmesinden önce kullanılabilir.

komut dosyaları en son girilirse, doğrulama yalnızca hızlı yanıt veren web siteleri için takdir edilmeyen tüm stilleri ve tasarımı yükledikten sonra gerçekleşir.


2

Komut dosyasına ve kullanımına bağlı olarak, mümkün olan en iyi (sayfa yükleme ve oluşturma süresi açısından) geleneksel bir <script> etiketi kullanmak değil, komut dosyasının yüklenmesini eşzamansız olarak tetiklemek olabilir.

Bazı farklı teknikler vardır, ancak en basit olanı window.onload olayı tetiklendiğinde document.createElement ("script") kullanmaktır. Daha sonra komut dosyası, sayfanın kendisi oluşturulduğunda önce yüklenir, böylece kullanıcının sayfanın görünmesini beklemesi gereken zamanı etkilemez.

Bu doğal olarak komut dosyasının kendisinin sayfanın oluşturulması için gerekli olmamasını gerektirir.

Daha fazla bilgi için, post bkz komut zaman uyumsuz birleştirilmesi (Google'da YSlow yaratıcısı ama şimdi) Steve Souders tarafından.


2
  • IE <10'da hala destek ve performansla ilgileniyorsanız, her zaman komut dosyası etiketlerinizi HTML gövdesinin son etiketleri haline getirmeniz en iyisidir. Bu şekilde, DOM'un geri kalanının yüklendiğinden eminsiniz ve engellemez ve oluşturmazsınız.

  • IE <10 ile artık fazla ilgilenmiyorsanız, komut dosyalarınızı belgenizin başına koymak ve deferyalnızca DOM'niz yüklendikten sonra çalışmasını sağlamak için kullanabilirsiniz ( <script type="text/javascript" src="path/to/script1.js" defer></script>). Kodunuzun hala IE <10'da çalışmasını istiyorsanız, kodunuzu window.onloaddüz bir şekilde sarmayı unutmayın !


Kabul edilen cevapta bu, “eski öneri” olarak adlandırılmaktadır. Hâlâ demek istiyorsan, muhtemelen onu desteklemek için biraz referans vermelisin.
dakab

1

Komut dosyası, yüklenip yürütülene kadar DOM yükünü engeller.

<body>Tüm DOM'lerin sonuna komut dosyaları yerleştirirseniz yükleme ve oluşturma şansı vardır (sayfa daha hızlı "görüntülenir").<script>bu DOM öğelerinin tümüne erişebilecek.

Diğer yandan <body> başlangıcından veya üzerine komut dosyası yürütülür (hala DOM öğelerinin olmadığı yerlerde).

JQuery dahil edersiniz, yani istediğiniz yere yerleştirip kullanabilirsiniz .ready ()


1

Web sayfasının yürütülmesine bağlı olduğunu düşünüyorum. Görüntülemek istediğiniz sayfa önce JavaScript yüklenmeden düzgün görüntülenemiyorsa, önce JavaScript dosyasını eklemeniz gerekir. Ancak, başlangıçta JavaScript dosyasını indirmeden bir web sayfasını görüntüleyebilir / oluşturabilirseniz, sayfanın altına JavaScript kodu koymanız gerekir. Hızlı bir sayfa yükünü taklit edeceği ve kullanıcının bakış açısından bu sayfanın daha hızlı yüklendiği anlaşılıyor.


1

<script>Referansların çoğunu sonuna yerleştirebilirsiniz <body>,
Ancak Sayfanızda harici komut dosyaları kullanan etkin bileşenler varsa,
bunların bağımlılığı (js dosyaları) bundan önce gelmelidir (ideal olarak baş etiketinde).



-1

HTML Belgesinin Sonunda

Böylece, yürütme sırasında HTML belgesinin tarayıcıya yüklenmesini etkilemez.


-1

JavaScriptKodunuzu yazmak için en iyi yer, önce </body>belgeyi yüklemek ve sonra js kodunu yürütmek için etiketin hemen öncesinde veya hemen öncesinde belgenin sonundadır .

<script> ... your code here ... </script>
</body>

Ve eğer yazdığınızda JQuery, ana belgede olabilir ve belge yüklendikten sonra yürütülür:

<script>
$(document).ready(function(){
   //your code here...
});
</script>

atarSyntaxError
Raz

Cevabınız yanlış değildi ama güncellenmesi ciddi bir ihtiyaçtı.
Paul Carlton

-2

Komut dosyasını HTML'den sonra eklemek benim için daha mantıklı. Çünkü çoğu zaman komut dosyamı yürütmeden önce Dom yüklemem gerekiyor. Kafa etiketine koyabilirdim, ancak tüm Belge yükleme dinleyicisinin yükünü sevmiyorum. Kodumun kısa, tatlı ve okunması kolay olmasını istiyorum.

Komut dosyanızı kafa etiketinin dışına eklerken safari'nin eski sürümlerinin quarky olduğunu duydum ama kimin umurunda olduğunu söylüyorum. O eski saçmalığı kullanan kimseyi tanımıyorum.

Bu arada iyi bir soru.


-6

Senaryoları istediğiniz yere yerleştirebilirsiniz ve biri diğer bir uygulamadan daha iyi değildir.

durum aşağıdaki gibidir:

Sayfa lineer olarak yüklenir, "yukarıdan aşağıya", eğer betiği kafasına koyarsanız, her şeyden önce yüklenmeye başlamasını sağlar, şimdi, kodla karıştırılmış gövdenin içine koyarsanız sayfa yükleri çirkin bir şekilde yol açabilir.

iyi uygulamayı tanımlamak nereye bağlı değildir.

sizi desteklemek için aşağıdakilerden bahsedeceğim:

yerleştirebilirsiniz:

ve sayfa doğrusal olarak yüklenecek

sayfa diğer içerikle eşzamansız olarak yüklendi

sayfanın içeriği, komut dosyalarının yüklenmesi tamamlanmadan önce ve sonra yüklenir

burada iyi uygulama, her biri ne zaman uygulanacak?

Umarım yardımcı oldum, her şey bana bu soruyu cevaplıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.