Tôi nên đặt thẻ <script> ở đâu trong đánh dấu HTML?


1488

Khi nhúng JavaScript vào tài liệu HTML, đâu là nơi thích hợp để đặt các <script>thẻ và bao gồm JavaScript? Tôi dường như nhớ lại rằng bạn không nên đặt những thứ này trong <head>phần này, nhưng việc đặt ở đầu <body>phần cũng rất tệ, vì JavaScript sẽ phải được phân tích cú pháp trước khi trang được hiển thị hoàn toàn (hoặc một cái gì đó tương tự). Điều này dường như để lại phần cuối của <body>phần dưới dạng vị trí hợp lý cho <script>các thẻ.

Vì vậy, đâu nơi thích hợp để đặt các <script>thẻ?

(Câu hỏi này tham khảo câu hỏi này , trong đó có gợi ý rằng các lệnh gọi hàm JavaScript nên được chuyển từ <a>thẻ sang <script>thẻ. Tôi đặc biệt sử dụng jQuery, nhưng câu trả lời chung chung hơn cũng phù hợp.)


trong trường hợp bạn cũng đang tìm kiếm một giải pháp đơn giản và bạn đang sử dụng một số trình tạo phía máy chủ như Jekyll, tôi khuyên bạn nên bao gồm tập lệnh với nó. đơn giản hơn nhiều
cregox

Câu trả lời:


1863

Đây là những gì xảy ra khi một trình duyệt tải một trang web với một <script>thẻ trên đó:

  1. Tìm nạp trang HTML (ví dụ: index.html)
  2. Bắt đầu phân tích cú pháp HTML
  3. Trình phân tích cú pháp gặp một <script>thẻ tham chiếu tệp tập lệnh bên ngoài.
  4. Trình duyệt yêu cầu tệp script. Trong khi đó, trình phân tích cú pháp chặn và dừng phân tích cú pháp HTML khác trên trang của bạn.
  5. Sau một thời gian, tập lệnh được tải xuống và sau đó được thực thi.
  6. Trình phân tích cú pháp tiếp tục phân tích phần còn lại của tài liệu HTML.

Bước # 4 gây ra trải nghiệm người dùng xấu. Trang web của bạn về cơ bản dừng tải cho đến khi bạn đã tải xuống tất cả các tập lệnh. Nếu có một điều mà người dùng ghét thì nó đang chờ một trang web tải.

Tại sao điều này thậm chí xảy ra?

Bất kỳ tập lệnh nào cũng có thể chèn HTML của riêng nó thông qua document.write()hoặc các thao tác DOM khác. Điều này ngụ ý rằng trình phân tích cú pháp phải đợi cho đến khi tập lệnh được tải xuống & thực thi trước khi nó có thể phân tích cú pháp phần còn lại của tài liệu một cách an toàn. Rốt cuộc, tập lệnh có thể đã chèn HTML của chính nó vào tài liệu.

Tuy nhiên, hầu hết các nhà phát triển JavaScript không còn thao túng DOM trong khi tài liệu đang tải. Thay vào đó, họ đợi cho đến khi tài liệu được tải trước khi sửa đổi nó. Ví dụ:

<!-- 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";
});

Vì trình duyệt của bạn không biết my-script.js sẽ không sửa đổi tài liệu cho đến khi nó được tải xuống và thực thi, trình phân tích cú pháp dừng phân tích cú pháp.

Khuyến nghị cổ

Cách tiếp cận cũ để giải quyết vấn đề này là đặt <script>các thẻ ở dưới cùng của bạn <body>, bởi vì điều này đảm bảo trình phân tích cú pháp không bị chặn cho đến khi kết thúc.

Cách tiếp cận này có vấn đề riêng của nó: trình duyệt không thể bắt đầu tải xuống các tập lệnh cho đến khi toàn bộ tài liệu được phân tích cú pháp. Đối với các trang web lớn hơn với tập lệnh & bảng định kiểu lớn, việc có thể tải xuống tập lệnh càng sớm càng tốt là rất quan trọng đối với hiệu suất. Nếu trang web của bạn không tải trong vòng 2 giây, mọi người sẽ chuyển đến trang web khác.

Trong một giải pháp tối ưu, trình duyệt sẽ bắt đầu tải xuống tập lệnh của bạn càng sớm càng tốt, đồng thời phân tích phần còn lại của tài liệu.

Cách tiếp cận hiện đại

Ngày nay, các trình duyệt hỗ trợ asyncdefercác thuộc tính trên các tập lệnh. Các thuộc tính này cho trình duyệt thấy an toàn khi tiếp tục phân tích cú pháp trong khi các tập lệnh đang được tải xuống.

không đồng bộ

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

Các tập lệnh với thuộc tính async được thực thi không đồng bộ. Điều này có nghĩa là tập lệnh được thực thi ngay khi được tải xuống mà không chặn trình duyệt trong lúc này.
Điều này ngụ ý rằng tập lệnh 2 có thể được tải xuống và thực thi trước tập lệnh 1.

Theo http://caniuse.com/#feat=script-async , 97,78% tất cả các trình duyệt hỗ trợ điều này.

hoãn lại

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

Các tập lệnh với thuộc tính defer được thực thi theo thứ tự (tức là tập lệnh đầu tiên 1, sau đó là tập lệnh 2). Điều này cũng không chặn trình duyệt.

Không giống như các tập lệnh async, các tập lệnh trì hoãn chỉ được thực thi sau khi toàn bộ tài liệu đã được tải.

Theo http://caniuse.com/#feat=script-defer , 97,79% tất cả các trình duyệt hỗ trợ điều này. 98,06% hỗ trợ nó ít nhất một phần.

Một lưu ý quan trọng về khả năng tương thích trình duyệt: trong một số trường hợp, IE <= 9 có thể thực thi các tập lệnh bị trì hoãn không theo thứ tự. Nếu bạn cần hỗ trợ các trình duyệt đó, vui lòng đọc phần này trước!

Phần kết luận

Các trạng thái hiện đại là đặt các tập lệnh vào <head>thẻ và sử dụng các thuộc tính asynchoặc defer. Điều này cho phép các tập lệnh của bạn được tải xuống càng sớm càng tốt mà không chặn trình duyệt của bạn.

Điều tốt là trang web của bạn vẫn nên tải chính xác trên 2% trình duyệt không hỗ trợ các thuộc tính này trong khi tăng tốc 98% còn lại.


63
Tôi ngạc nhiên không ai trích dẫn lời giải thích của Google ... developers.google.com/speed/docs/insights/BlockingJS
Casey Falk

6
Tôi không rõ những gì chạm vào DOM và những gì không. Bạn có thể làm rõ? Có an toàn khi thực hiện tải async trên một cái gì đó như jquery.js không?
Doug

7
@Doug Ví dụ document.writehoạt động trên dom. Câu hỏi không phải là nếu một kịch bản thao túng dom, nhưng khi nó xảy ra. Miễn là tất cả các thao tác dom xảy ra sau khi domreadysự kiện đã được kích hoạt, bạn vẫn ổn. jQuery là một thư viện và do đó không - hoặc không nên - tự thao túng dom.
Bart

24
Câu trả lời này là sai lệch. Các trình duyệt hiện đại không ngừng phân tích cú pháp khi chúng đạt đến thẻ script đồng bộ có thể ảnh hưởng đến HTML, chúng chỉ dừng kết xuất / thực thi và tiếp tục phân tích cú pháp một cách lạc quan để bắt đầu tải xuống các tài nguyên khác có thể sẽ được yêu cầu sau đó nếu không có HTML nào bị ảnh hưởng.
Fabio Beltramini

40
Tại sao các thuộc tính asyncdeferkhông được sử dụng ở đâu? Ý tôi là, tôi đã xem rất nhiều nguồn HTML từ internet và tôi không thấy các thuộc tính asyncdeferthuộc tính ở bất cứ đâu. ...?
john cj

239

Ngay trước thẻ đóng cơ thể, như đã nêu trên

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

Đặt tập lệnh ở dưới cùng

Vấn đề gây ra bởi các tập lệnh là chúng chặn tải xuống song song. Đặc tả HTTP / 1.1 cho thấy các trình duyệt tải xuống không quá hai thành phần song song trên mỗi tên máy chủ. Nếu bạn phục vụ hình ảnh của mình từ nhiều tên máy chủ, bạn có thể nhận được nhiều hơn hai lần tải xuống song song. Tuy nhiên, trong khi tập lệnh đang tải xuống, trình duyệt sẽ không bắt đầu bất kỳ tải xuống nào khác, ngay cả trên các tên máy chủ khác nhau.


7
Đồng ý với khái niệm và giải thích của nó. Nhưng điều gì xảy ra nếu người dùng bắt đầu chơi với trang. Giả sử tôi có một thả xuống AJAX sẽ bắt đầu tải sau khi trang xuất hiện cho người dùng nhưng trong khi nó đang tải, người dùng nhấp vào nó! Và nếu người dùng 'thực sự thiếu kiên nhẫn' gửi biểu mẫu thì sao?
Xe tăng Hemant

9
@Hermant Nhận xét cũ nhưng bạn có thể thực hiện thủ thuật vô hiệu hóa các trường theo mặc định sau đó cho phép chúng sử dụng JS khi DOM được tải đầy đủ. Đó là những gì Facebook dường như đang làm ngày nay.
novato

2
Chỉ cần thử nghiệm điều này với chrome, để kiểm tra xem điều này có còn như cũ không. Nó là. Bạn có thể kiểm tra sự khác biệt về thời gian tải trang của trình duyệt tại đây. stevesouders.com/cuzillion
cypher

46
Nếu đây là cách thực hành tốt nhất, tại sao stack overflow bao gồm tất cả các thẻ script của chúng trong <head>? :-P
Philip

10
Trong một số trường hợp, đặc biệt là trong các trang web nặng ajax, tải trong đầu thực sự có thể dẫn đến thời gian tải nhanh hơn. Xem: encosia.com/dont-let-jquerys-document-pered-slow-you-down (lưu ý rằng hàm "live ()" không được dùng trong jquery, nhưng bài viết vẫn áp dụng với "on ()" hoặc " đại biểu "chức năng). Tải trong <head> cũng có thể cần thiết để đảm bảo hành vi chính xác như được chỉ ra bởi @Hermant. Cuối cùng, Modernizr.com/docs khuyên bạn nên đặt các tập lệnh của nó vào <head> vì những lý do được giải thích trên trang web của mình.
Nathan

77

Thẻ script không chặn có thể được đặt ở bất cứ đâu:

<script src="script.js" async></script>
<script src="script.js" defer></script>
<script src="script.js" async defer></script>
  • async tập lệnh sẽ được thực thi không đồng bộ ngay khi có sẵn
  • defer tập lệnh được thực thi khi tài liệu đã phân tích xong
  • async defer tập lệnh rơi trở lại hành vi trì hoãn nếu async không được hỗ trợ

Các tập lệnh như vậy sẽ được thực thi không đồng bộ / sau khi tài liệu sẵn sàng, điều đó có nghĩa là bạn không thể làm điều này:

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

Hoặc này:

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

Hoặc này:

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

Hoặc này:

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

Phải nói rằng, các kịch bản không đồng bộ cung cấp những lợi thế sau:

  • Tải xuống song song các tài nguyên :
    Trình duyệt có thể tải xuống các bảng định kiểu, hình ảnh và các tập lệnh khác song song mà không cần chờ tập lệnh tải xuống và thực thi.
  • Độc lập thứ tự nguồn :
    Bạn có thể đặt các tập lệnh bên trong phần đầu hoặc phần thân mà không lo bị chặn (hữu ích nếu bạn đang sử dụng CMS). Lệnh thực thi vẫn còn vấn đề mặc dù.

Có thể phá vỡ các vấn đề về thứ tự thực hiện bằng cách sử dụng các tập lệnh bên ngoài hỗ trợ các cuộc gọi lại. Nhiều API JavaScript của bên thứ ba hiện hỗ trợ thực thi không chặn. Dưới đây là ví dụ về việc tải API Google Maps không đồng bộ .


2
Đây là câu trả lời chính xác cho ngày hôm nay - sử dụng phương pháp này có nghĩa là dễ dàng hơn để giữ các vật dụng của bạn được khép kín, không cần phải làm <head>logic bao gồm logic.
Daniel Sokolowski

1
Tôi bối rối tại sao bạn không thể sử dụng asynchoặc deferkhi bao gồm jQuery khi bạn chỉ định trong khối thứ hai : <script src="jquery.js" async></script>. Bạn có thể giải thích tại sao? Tôi nghĩ rằng tôi cần phải có thẻ async để thực hiện hiệu ứng trên mỗi câu trả lời được chấp nhận, vì vậy trang của tôi có thể tải ngay cả khi jQuery vẫn đang tải]. Cảm ơn!
khuỷu tay khuỷu tay

3
@elbow 99% số lần <script src=jquery.js>được theo sau bởi $(function(){ ... })các khối ở đâu đó trong trang. Tải không đồng bộ không đảm bảo rằng jQuery sẽ được tải tại thời điểm trình duyệt cố phân tích các khối đó do đó sẽ tăng $ không được xác định lỗi (bạn có thể không gặp lỗi nếu jQuery được tải từ bộ đệm). Tôi đã trả lời một câu hỏi về việc tải jQuery không đồng bộ và bảo tồn $(function(){ ... }). Tôi sẽ xem nếu tôi có thể tìm thấy nó, hoặc bạn có thể xem câu hỏi này: stackoverflow.com/q/14811471/87015
Salman A

1
@SalmanA Cảm ơn bạn! Vâng, tôi rơi vào 99% đó. Trước tiên tôi cần jquerylib để tải, sau đó.js các tập lệnh còn lại của tôi . Khi tôi khai báo asynchoặc defertrên jquerythẻ lib, .jstập lệnh của tôi không hoạt động. Tôi nghĩ rằng $(function(){ ... })bảo vệ mà đoán đoán không. Giải pháp hiện tại: Tôi không thêm deferhoặc asyncvào jquerytập lệnh lib, nhưng tôi thêm asyncvào .jstập lệnh theo dõi của mình . Lưu ý: lý do tôi thực hiện bất kỳ điều nào trong số này là để làm cho Google Page Speed ​​hài ​​lòng. Thx một lần nữa để được giúp đỡ! Bất kỳ lời khuyên nào khác đều được chào đón. (Hoặc một liên kết đến câu trả lời trước của bạn). :)
elbowlobstercowstand

@elbow Xem stackoverflow.com/a/21013975/87015 , nó sẽ chỉ cung cấp cho bạn một ý tưởng chứ không phải là giải pháp hoàn chỉnh. Thay vào đó, bạn có thể tìm kiếm "thư viện trình tải jquery async".
Salman A

38

Lời khuyên tiêu chuẩn, được thúc đẩy bởi Yahoo! Nhóm Hiệu suất Đặc biệt, là đặt các <script>thẻ ở cuối phần thân tài liệu để chúng không chặn kết xuất trang.

Nhưng có một số cách tiếp cận mới hơn mang lại hiệu suất tốt hơn, như được mô tả trong câu trả lời này về thời gian tải của tệp JavaScript Google Analytics:

Có một số slide tuyệt vời của Steve Souder (chuyên gia hiệu suất phía khách hàng) về:

  • Các kỹ thuật khác nhau để tải các tệp JavaScript bên ngoài song song
  • ảnh hưởng của chúng đến thời gian tải và kết xuất trang
  • loại chỉ báo "đang tiến hành" nào mà trình duyệt hiển thị (ví dụ: 'đang tải' trên thanh trạng thái, con trỏ chuột đồng hồ cát).

25

Nếu bạn đang sử dụng JQuery thì hãy đặt javascript bất cứ nơi nào bạn thấy tốt nhất và sử dụng $(document).ready()để đảm bảo rằng mọi thứ được tải đúng cách trước khi thực hiện bất kỳ chức năng nào.

Bên cạnh đó, tôi thích tất cả các thẻ script của mình trong <head>phần này vì đó có vẻ là nơi sạch nhất.


14
trong đầu ... er? <header>?
Dan Lugg

7
Lưu ý rằng việc sử dụng $(document).ready()không có nghĩa là bạn có thể đặt JavaScript của mình ở bất cứ đâu bạn muốn - bạn vẫn phải đặt nó sau khi <script src=".../jquery.min.js">bạn bao gồm jQuery, để nó $tồn tại.
Rory O'Kane

2
Sẽ không tối ưu khi đặt các thẻ script trong phần <head> - điều này sẽ trì hoãn hiển thị phần hiển thị của trang cho đến khi các tập lệnh được tải.
CyberMonk

Không, @Dan, một headerphần tử là một phần của nội dung tài liệu HTML và sẽ xuất hiện một hoặc nhiều lần trong thẻ bodyphần tử . The `dành cho dữ liệu meta và dữ liệu phi nội dung cho tài liệu. Đó là, những ngày này, với deferasyncmột nơi lý tưởng cho các thẻ script. headercác phần tử chỉ nên chứa thông tin mô tả phần của tài liệu theo sau nó.
ProfK

1
@ProfK, Dan đã đề cập đến câu hỏi chưa được chỉnh sửa ban đầu khi anh ấy đăng bài này hơn 4 năm trước. Như bạn có thể thấy, câu hỏi đã được chỉnh sửa một năm sau đó.
kojow7

18

Cách tiếp cận hiện đại vào năm 2019 là sử dụng các kịch bản loại mô-đun ES6 .

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

Theo mặc định, các mô-đun được tải không đồng bộ và được bảo vệ. tức là bạn có thể đặt chúng ở bất cứ đâu và chúng sẽ tải song song và thực thi khi trang tải xong.

Sự khác biệt giữa tập lệnh và mô-đun được mô tả ở đây:

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

Việc thực hiện một mô-đun so với một kịch bản được mô tả ở đây:

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

Hỗ trợ được hiển thị ở đây:

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


thông tin hay để thêm vào nền tảng kiến ​​thức
Sagar

1
Chỉ cần lưu ý rằng điều này sẽ không hoạt động nếu bạn chỉ đang thử công cụ trên hệ thống tệp cục bộ của mình mà không có máy chủ. Ít nhất trên Chrome, bạn gặp phải lỗi xuất xứ chéo khi cố tải js từ HTML mặc dù cả hai đều có cùng nguồn gốc, hệ thống tệp của bạn.
hà mã

11

XHTML Không xác thực nếu tập lệnh ở bất kỳ đâu ngoài phần tử head. Hóa ra nó có thể ở khắp mọi nơi.

Bạn có thể trì hoãn việc thực thi bằng một cái gì đó như jQuery để nó không thành vấn đề ở đâu (ngoại trừ một cú đánh hiệu suất nhỏ trong quá trình phân tích cú pháp).


1
XHTML sẽ xác nhận với các thẻ script trong phần thân, cả nghiêm ngặt và chuyển tiếp. Thẻ phong cách tuy nhiên có thể chỉ trong đầu.
I.devries

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

thẻ script phải được sử dụng luôn trước khi đóng body hoặc bottom trong tệp HTML .

sau đó bạn có thể xem nội dung của trang trước khi tải tệp js .

kiểm tra điều này nếu yêu cầu: http://stevesouders.com/hpws/rule-js-bottom.php


2
Điều này thực sự đã trả lời câu hỏi. Tôi đã tự hỏi gần như tất cả các ví dụ được đăng không bao giờ đưa ra bối cảnh trực quan phù hợp của "cuối trang"
Ken Ingram

1
Câu trả lời này rất sai lệch và có lẽ sai nhất. Các bài viết trong GoogleMDN cho thấy rằng JS đồng bộ (là trường hợp ở đây) luôn chặn việc xây dựng và phân tích cú pháp DOM sẽ dẫn đến kết xuất đầu tiên bị trì hoãn. Do đó, bạn không thể xem nội dung của trang cho đến khi tệp JS được tìm nạp và hoàn tất việc thực thi bất kể bạn đặt tệp JS của mình ở đâu trong tài liệu HTML miễn là nó đồng bộ
Lingaraju EV

Nó cũng tham chiếu các điểm được thực hiện trong năm 2009 và không còn phù hợp.
toxaq

7

Câu trả lời thông thường (và được chấp nhận rộng rãi) là "ở dưới cùng", bởi vì sau đó toàn bộ DOM sẽ được tải trước khi mọi thứ có thể bắt đầu thực thi.

Có những người chống đối, vì nhiều lý do, bắt đầu với thực tiễn có sẵn để cố tình bắt đầu thực hiện với một sự kiện tải trang.


6

Nơi tốt nhất để đặt <script>thẻ là trước khi đóng </body>thẻ , vì vậy việc tải xuống và thực thi nó không chặn trình duyệt phân tích cú pháp html trong tài liệu,

Ngoài ra, việc tải các tệp js ra bên ngoài có những ưu điểm riêng như nó sẽ được các trình duyệt lưu vào bộ nhớ cache và có thể tăng tốc thời gian tải trang , nó tách mã HTML và JavaScriptgiúp quản lý cơ sở mã tốt hơn .

nhưng các trình duyệt hiện đại cũng hỗ trợ một số cách tối ưu khác như asyncdefertải các javascripttệp bên ngoài .

Không đồng bộ và trì hoãn

Thông thường thực thi trang HTML bắt đầu từng dòng. Khi gặp phải một yếu tố JavaScript bên ngoài, phân tích cú pháp HTML sẽ bị dừng cho đến khi JavaScript được tải xuống và sẵn sàng để thực thi. Việc thực thi trang bình thường này có thể được thay đổi bằng cách sử dụng deferasyncthuộc tính.

Defer

Khi một thuộc tính defer được sử dụng, JavaScript được tải xuống song song với phân tích cú pháp HTML nhưng sẽ chỉ được thực thi sau khi phân tích cú pháp HTML đầy đủ.

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

Async

Khi thuộc tính async được sử dụng, JavaScript được tải xuống ngay khi gặp tập lệnh và sau khi tải xuống, nó sẽ được thực thi không đồng bộ (song song) cùng với phân tích cú pháp HTML.

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

Khi nào nên sử dụng thuộc tính nào

  • Nếu tập lệnh của bạn độc lập với các tập lệnh khác và là mô-đun, hãy sử dụng async.
  • Nếu bạn đang tải script1 và script2 async, cả hai sẽ chạy
    song song với phân tích cú pháp HTML, ngay khi chúng được tải xuống
    và có sẵn.
  • Nếu tập lệnh của bạn phụ thuộc vào tập lệnh khác thì hãy sử dụng defercho cả hai:
  • Khi script1 và script2 được tải theo thứ tự deferđó, thì script1 được đảm bảo thực thi trước,
  • Sau đó script2 sẽ thực thi sau khi script1 được thực thi đầy đủ.
  • Phải làm điều này nếu script2 phụ thuộc vào script1.
  • Nếu tập lệnh của bạn đủ nhỏ và bị phụ thuộc bởi một tập lệnh khác asyncthì hãy sử dụng tập lệnh của bạn không có thuộc tính và đặt nó lên trên tất cả các asynctập lệnh.

tham khảo: kiến thức


3

Tùy thuộc, nếu bạn đang tải một tập lệnh cần thiết để tạo kiểu cho trang của bạn / sử dụng các hành động trong trang của bạn (như nhấp vào nút) thì tốt hơn bạn nên đặt tập lệnh lên trên cùng. Nếu kiểu dáng của bạn là 100% CSS và bạn có tất cả các tùy chọn dự phòng cho các hành động của nút thì bạn có thể đặt nó ở phía dưới.

Hoặc điều tốt nhất (nếu đó không phải là vấn đề đáng lo ngại) là bạn có thể tạo một hộp tải phương thức, đặt javascript của bạn ở cuối trang và làm cho nó biến mất khi dòng cuối cùng của tập lệnh của bạn được tải. Bằng cách này, bạn có thể tránh người dùng sử dụng các hành động trong trang của mình trước khi tập lệnh được tải. Và cũng tránh các kiểu dáng không phù hợp.


3

Bao gồm các tập lệnh ở cuối chủ yếu được sử dụng trong đó nội dung / phong cách của trang web sẽ được hiển thị đầu tiên.

bao gồm các tập lệnh trong phần đầu tải các tập lệnh sớm và có thể được sử dụng trước khi tải toàn bộ trang web.

nếu cuối cùng các kịch bản được nhập thì việc xác thực sẽ chỉ xảy ra sau khi tải toàn bộ kiểu dáng và thiết kế không được đánh giá cao cho các trang web phản hồi nhanh.


2

Tùy thuộc vào tập lệnh và cách sử dụng tập lệnh tốt nhất có thể (về thời gian tải trang và thời gian kết xuất) có thể không sử dụng <script> -tag mỗi se, nhưng để kích hoạt tự động việc tải tập lệnh không đồng bộ.

Có một số kỹ thuật khác nhau, nhưng đơn giản nhất là sử dụng document.createEuity ("script") khi sự kiện window.onload được kích hoạt. Sau đó, tập lệnh được tải trước tiên khi trang được hiển thị, do đó không ảnh hưởng đến thời gian người dùng phải đợi trang xuất hiện.

Điều này tự nhiên đòi hỏi rằng chính kịch bản không cần thiết cho việc hiển thị trang.

Để biết thêm thông tin, hãy xem bài viết Kết hợp các kịch bản không đồng bộ của Steve Souder (người tạo ra YSlow nhưng hiện tại Google).


2
  • Nếu bạn vẫn quan tâm rất nhiều về hỗ trợ và hiệu suất trong IE <10, tốt nhất là LUÔN LUÔN làm cho các thẻ script của bạn trở thành các thẻ cuối cùng trong phần thân HTML của bạn. Bằng cách đó, bạn chắc chắn rằng phần còn lại của DOM đã được tải và bạn sẽ không chặn và kết xuất.

  • Nếu bạn không quan tâm quá nhiều về IE <10, bạn có thể muốn đặt các tập lệnh của mình vào phần đầu của tài liệu và sử dụng deferđể đảm bảo chúng chỉ chạy sau khi DOM của bạn đã được tải ( <script type="text/javascript" src="path/to/script1.js" defer></script>). Tuy nhiên, nếu bạn vẫn muốn mã của mình hoạt động trong IE <10, đừng quên bọc mã của bạn window.onloadngay cả!


Trong câu trả lời được chấp nhận, điều này được gọi là khuyến nghị cổ xưa. Nếu bạn vẫn có ý đó, có lẽ bạn nên tạo một số tài liệu tham khảo để sao lưu nó.
dakab

1

Script chặn tải DOM cho đến khi nó được tải và thực thi.

Nếu bạn đặt các tập lệnh ở cuối <body>tất cả DOM có cơ hội tải và kết xuất (trang sẽ "hiển thị" nhanh hơn). <script>sẽ có quyền truy cập vào tất cả các thành phần DOM đó.

Mặt khác, đặt nó sau khi <body>bắt đầu hoặc ở trên sẽ thực thi tập lệnh (trong đó vẫn không có phần tử DOM).

Bạn đang bao gồm jQuery, điều đó có nghĩa là bạn có thể đặt nó bất cứ nơi nào bạn muốn và sử dụng. Yet ()


1

Tôi nghĩ rằng nó phụ thuộc vào việc thực hiện trang web. Nếu trang bạn muốn hiển thị không thể hiển thị đúng mà không tải JavaScript trước thì bạn nên bao gồm tệp JavaScript trước. Nhưng nếu bạn có thể hiển thị / kết xuất trang web mà không cần tải xuống tệp JavaScript ban đầu, thì bạn nên đặt mã JavaScript ở cuối trang. Bởi vì nó sẽ mô phỏng tải trang nhanh và theo quan điểm của người dùng, có vẻ như trang đó đang tải nhanh hơn.


1

Bạn có thể đặt hầu hết các <script>tài liệu tham khảo ở cuối <body>,
nhưng Nếu có các thành phần hoạt động trên trang của bạn đang sử dụng các tập lệnh bên ngoài,
thì phần phụ thuộc của chúng (tệp js) sẽ xuất hiện trước đó (lý tưởng là trong thẻ đầu).



-1

Ở cuối tài liệu HTML

Vì vậy, nó sẽ không ảnh hưởng đến việc tải tài liệu HTML trong trình duyệt tại thời điểm thực thi.


-1

Nơi tốt nhất để viết JavaScriptmã của bạn là ở cuối tài liệu sau hoặc ngay trước </body>thẻ để tải tài liệu trước rồi thực thi mã js.

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

Và nếu bạn viết JQuerydưới đây có thể nằm trong tài liệu đầu và nó sẽ thực thi sau khi tải tài liệu:

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

nó némSyntaxError
Raz

Câu trả lời của bạn không sai nhưng rất cần được cập nhật.
Paul Carlton

-2

Nó có ý nghĩa hơn đối với tôi để bao gồm tập lệnh sau HTML. Bởi vì hầu hết thời gian tôi cần tải Dom trước khi tôi thực thi tập lệnh của mình. Tôi có thể đặt nó vào thẻ đầu nhưng tôi không thích tất cả các trình nghe tải tài liệu. Tôi muốn mã của tôi ngắn và ngọt ngào và dễ đọc.

Tôi đã nghe các phiên bản cũ của safari rất kỳ quặc khi thêm tập lệnh của bạn bên ngoài thẻ head nhưng tôi nói ai quan tâm. Tôi không biết bất cứ ai sử dụng crap cũ làm bạn.

Câu hỏi hay bằng cách này.


-6

Bạn có thể đặt nơi bạn muốn các tập lệnh và một tập lệnh không tốt hơn tập lệnh khác.

tình hình như sau:

Trang tải một cách tuyến tính, "từ trên xuống", vì vậy nếu bạn đặt tập lệnh vào đầu, đảm bảo rằng nó bắt đầu tải trước mọi thứ, bây giờ, nếu bạn đặt nó vào trong cơ thể trộn với mã có thể khiến trang tải một cách khó coi.

xác định thực hành tốt không phụ thuộc vào nơi.

để hỗ trợ bạn, tôi sẽ đề cập như sau:

bạn có thể đặt:

và trang sẽ tải tuyến tính

trang được tải không đồng bộ với nội dung khác

nội dung của trang sẽ được tải trước và sau khi hoàn thành tải các tập lệnh được tải

thực hành tốt ở đây sẽ là khi nào sẽ thực hiện từng?

Tôi hy vọng tôi đã có ích, bất cứ điều gì chỉ cần trả lời tôi vấn đề này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.