Hướng dẫn does it matter where you put javascript? - bạn đặt javascript ở đâu có vấn đề gì không?

Tôi đã gây rối với HTML5, tôi chưa bao giờ thực sự có cái nhìn tốt về JavaScript trước đây. Tôi đang tham khảo tệp tập lệnh như thế này (không phải trong đầu)


Tuy nhiên, tập lệnh dường như chỉ hoạt động nếu nó đặt bên dưới các yếu tố nhất định trên trang.

Có những tình huống cụ thể khi nó có vấn đề ở đâu JavaScript được đặt không?

Cảm ơn trước.

hỏi ngày 22 tháng 7 năm 2010 lúc 12:25Jul 22, 2010 at 12:25

Hướng dẫn does it matter where you put javascript? - bạn đặt javascript ở đâu có vấn đề gì không?

Nếu tập lệnh không chờ đợi một sự kiện onload hoặc "sẵn sàng" nào đó, thì nó cần phải được đặt sau các yếu tố mà nó tham khảo (nếu không chúng sẽ không ở đó để tìm). Nếu bạn không chắc chắn, hãy gắn nó ngay trước .

Trong trường hợp này, có vẻ như đó chính xác là những gì đang xảy ra, nó đang tìm kiếm các yếu tố chưa được thêm vào DOM. Đặt kịch bản ở dưới cùng của là một thực tế phổ biến để chống lại điều này. Một số lựa chọn thay thế đang sử dụng sự kiện window.onload để chạy mã của bạn hoặc JQuery's $(document).ready() chẳng hạn (hầu hết các thư viện chính có một số tương đương với điều này).

Đã trả lời ngày 22 tháng 7 năm 2010 lúc 12:28Jul 22, 2010 at 12:28

Hướng dẫn does it matter where you put javascript? - bạn đặt javascript ở đâu có vấn đề gì không?

Nick Cravernick CraverNick Craver

615K134 Huy hiệu vàng1292 Huy hiệu bạc1152 Huy hiệu đồng134 gold badges1292 silver badges1152 bronze badges

Nếu tập lệnh của bạn hoạt động trên một phần tử, nó cần được đặt sau phần tử đó trên trang hoặc thiết lập để thực thi khi trang hoàn tất tải. Nếu tập lệnh chạy trước khi phần tử đã được thêm vào DOM (xảy ra khi nó gặp phải khi trình duyệt phân tích trang), thì tập lệnh không thể tìm thấy phần tử mà bạn muốn nó hoạt động. Đặt tập lệnh sau khi phần tử đảm bảo rằng phần tử có sẵn để nó hoạt động. Tương tự như vậy, buộc nó phải chạy sau toàn bộ tải trang đảm bảo rằng tất cả các phần tử đều có sẵn cho tập lệnh.

Tôi đề nghị rằng, trong thời gian càng tốt, bạn tải các tập lệnh của mình ngay trước khi thẻ đóng. Tôi cũng sẽ xem xét bằng cách sử dụng một khung, như jQuery, giúp dễ dàng chạy các tập lệnh của bạn trên trang tải hoàn chỉnh và bọc mã bên trong sự kiện tải của nó.

Đã trả lời ngày 22 tháng 7 năm 2010 lúc 12:33Jul 22, 2010 at 12:33

TVanfossontvanfossontvanfosson

514K97 Huy hiệu vàng695 Huy hiệu bạc793 Huy hiệu Đồng97 gold badges695 silver badges793 bronze badges

Thực tiễn tốt nhất theo quy tắc hiệu suất của Yahoo là đặt các tập lệnh ở cuối trang:

Vấn đề gây ra bởi các tập lệnh là chúng chặn các bản tải xuống song song. Thông số kỹ thuậ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 cho 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ượt tải xuống xảy ra song song. Mặc dù một tập lệnh đang tải xuống, tuy nhiên, 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.

Trong một số tình huống, không dễ để di chuyển các tập lệnh xuống đáy. Ví dụ, nếu tập lệnh sử dụng Document.Write để chèn một phần nội dung của trang, nó không thể được di chuyển thấp hơn trong trang. Cũng có thể có các vấn đề phạm vi. Trong nhiều trường hợp, có nhiều cách để giải quyết những tình huống này.

Một gợi ý thay thế thường xuất hiện là sử dụng các tập lệnh hoãn lại. Thuộc tính trì hoãn chỉ ra rằng tập lệnh không chứa document.write và là manh mối cho các trình duyệt mà chúng có thể tiếp tục kết xuất. Thật không may, Firefox không hỗ trợ thuộc tính trì hoãn. Trong Internet Explorer, kịch bản có thể được hoãn lại, nhưng không nhiều như mong muốn. Nếu một tập lệnh có thể được hoãn lại, nó cũng có thể được di chuyển xuống cuối trang. Điều đó sẽ làm cho các trang web của bạn tải nhanh hơn.

Đã trả lời ngày 22 tháng 7 năm 2010 lúc 12:30Jul 22, 2010 at 12:30

Robyawrobyawrobyaw

2.2182 Huy hiệu vàng24 Huy hiệu bạc27 Huy hiệu đồng2 gold badges24 silver badges27 bronze badges

2

Vâng, chúng tôi cần biết những gì trong kịch bản của bạn để nói với bạn thực sự, nhưng câu trả lời ngắn gọn là "Có nó không quan trọng".

Các tập lệnh (về cơ bản) thực thi khi gặp Trình duyệt. Một sai lầm cổ điển là tạo một tham chiếu đến một phần tử trang trong tập lệnh được đặt trước đó trong tài liệu so với phần tử mà nó tham khảo - khi tập lệnh được thực thi, phần tử chưa tồn tại!

Nó thường được coi là phù hợp để giữ các tập lệnh trong đầu, giải pháp cho vấn đề trên do đó là đính kèm mã chức năng vào các trình xử lý sự kiện onload.

Vòng thưởng: Một vấn đề về vị trí tập lệnh lý do tinh tế hơn nhiều là vì hầu hết các trình duyệt sẽ tải xuống một lần khi chúng gặp phải tập lệnh (vì lý do bảo mật và vì tập lệnh có thể sửa đổi các yêu cầu tải xuống chẳng hạn). Đây là một trong những lý do Yahoo khuyên bạn nên đặt các tập lệnh cuối cùng trong tài liệu của bạn, nhưng đó là một điều gây tranh cãi để làm vì một lợi ích tinh tế của nhận thức.

Đã trả lời ngày 22 tháng 7 năm 2010 lúc 12:31Jul 22, 2010 at 12:31

Annakataannakataannakata

73.1K16 Huy hiệu vàng113 Huy hiệu bạc180 Huy hiệu đồng16 gold badges113 silver badges180 bronze badges

Vâng, nó làm.

Ví dụ: chúng ta hãy nói mã JS của bạn ở đầu. và nó được giải thích trước khi trình duyệt được thực hiện một phần của cây Dom ... trong trường hợp này là phần tử HTML mà bạn đang tham khảo, nếu được tham chiếu trước khi nó có sẵn, sẽ tạo ra một lỗi rằng phần tử không được xác định.

Một lý do khác là trải nghiệm người dùng. Nếu CSS ở trên cùng, khi HTML được hiển thị, tất cả đều có vẻ tốt, nhưng trừ khi JS ở phía dưới, bạn sẽ phải chờ nó được tải và sẵn sàng thực hiện trước khi phần còn lại được hiển thị; Do đó, làm chậm tốc độ mà các mục trên màn hình được hiển thị.

Tôi thấy nó rất nhiều. Các nét khác nhau cho các trình duyệt khác nhau, nhưng chỉ cần đặt JS ở phía dưới, và CSS ở phía trên và bạn tránh phải lo lắng về những thứ như thế này.

Đã trả lời ngày 22 tháng 7 năm 2010 lúc 13:04Jul 22, 2010 at 13:04

Nó phụ thuộc vào những gì kịch bản được thiết kế để làm. Nếu nó đang sử dụng phương thức tài liệu.write (), thì nó không quan trọng ở đâu trên trang. Nếu nó đang cố gắng tham chiếu các phần tử trong DOM, tốt nhất là đặt vào đầu và có các chức năng truy cập các thành phần DOM được kích hoạt sau khi trang được tải.

Đã trả lời ngày 22 tháng 7 năm 2010 lúc 12:29Jul 22, 2010 at 12:29

Mạnh mẽRobusto

30.8k8 Huy hiệu vàng55 Huy hiệu bạc76 Huy hiệu Đồng8 gold badges55 silver badges76 bronze badges

Có một vài kịch bản trong đó vị trí là quan trọng.

  • Giả sử bạn có một chức năng gọi
    
    
    
    
    
    
    
    0 trong
    
    
    
    
    
    
    
    1 và bạn gọi nó trước khi bạn bao gồm
    
    
    
    
    
    
    
    1, thì đơn giản là nó sẽ không hoạt động vì
    
    
    
    
    
    
    
    0 chưa được xác định.
  • Nếu mã yêu cầu một phần tử nhất định phải có sẵn (ví dụ: tập lệnh hộp đèn) thì có thể tải mã trước khi các phần tử hình ảnh hộp đèn của bạn dẫn đến hộp đèn không làm gì cả.

Vì vậy, về cơ bản ... nó phụ thuộc rất nhiều vào những kịch bản bạn đang chạy. Đôi khi nó sẽ quan trọng, những lần khác nó sẽ không.

Đã trả lời ngày 22 tháng 7 năm 2010 lúc 12:29Jul 22, 2010 at 12:29

Mạnh mẽWolph

30.8k8 Huy hiệu vàng55 Huy hiệu bạc76 Huy hiệu Đồng10 gold badges132 silver badges147 bronze badges

Có một vài kịch bản trong đó vị trí là quan trọng.

Giả sử bạn có một chức năng gọi







0 trong






1 và bạn gọi nó trước khi bạn bao gồm






1, thì đơn giản là nó sẽ không hoạt động vì






0 chưa được xác định.

Nếu mã yêu cầu một phần tử nhất định phải có sẵn (ví dụ: tập lệnh hộp đèn) thì có thể tải mã trước khi các phần tử hình ảnh hộp đèn của bạn dẫn đến hộp đèn không làm gì cả.Jul 22, 2010 at 12:35

Vì vậy, về cơ bản ... nó phụ thuộc rất nhiều vào những kịch bản bạn đang chạy. Đôi khi nó sẽ quan trọng, những lần khác nó sẽ không.brad

Wolphwolph28 gold badges99 silver badges154 bronze badges

1

75,8K10 Huy hiệu vàng132 Huy hiệu bạc147 Huy hiệu đồng

Yahoo thực sự khuyên bạn nên đặt các tập lệnh của bạn ở phía dưới. Việc tải xuống tệp JS là một hành động chặn, điều đó có nghĩa là không có gì khác đang tải xuống tại thời điểm đó (chẳng hạn như hình ảnh/CSS) bằng cách đặt các tập lệnh của bạn ở phía dưới, người dùng nhận được HTML/IMAGE/CSS trước và thực sự thấy trang nhanh hơn, nhanh hơn, Và tải xuống JS của bạn sau khi thêm tính tương tác.

Phải nói rằng, như các bài đăng khác đã đề cập, tập lệnh của bạn phải đợi cho đến khi DOM sẵn sàng trước khi thực sự làm bất cứ điều gì với DOM, nếu không bạn sẽ có hành vi đa dạng tùy thuộc vào thời điểm DOM đã sẵn sàng.

Đã trả lời ngày 22 tháng 7 năm 2010 lúc 12:35Jul 22, 2010 at 12:38

BradbradStarx

31.4K28 Huy hiệu vàng99 Huy hiệu bạc154 Huy hiệu đồng45 gold badges181 silver badges259 bronze badges

Vâng, đây là những gì tôi nghĩ.

Nếu bạn cần thực hiện tập lệnh của mình, trước khi HTML bắt đầu kết xuất trong trình duyệt của máy khách thì sẽ tốt hơn nếu được đặt trong phần







4.







Và nếu bạn đang thực thi mã JavaScript giao tiếp với một phần tử theo một cách nào đó thì tập lệnh nên được đặt phía sau phần tử đó, bởi vì nếu tập lệnh bắt đầu phía trước thì nó không thể tìm thấy yếu tố tương ứng của nó để giao tiếp. Vì vậy, tốt hơn là đặt đằng sau yếu tố.

Đã trả lời ngày 22 tháng 7 năm 2010 lúc 12:38






STARXSTARX

75,9K45 Huy hiệu vàng181 Huy hiệu bạc259 Huy hiệu đồngJul 22, 2010 at 12:34

Đây không chỉ là về nơi tập lệnh được đặt trong trang, mà còn khi mã trong tập lệnh được thực thi.Guffa

Thẻ script thường đi trong phần







5 của trang. Tuy nhiên, điều đó có nghĩa là không có phần tử nào được tải khi mã tải và nếu nó được thực thi ngay lập tức, bạn không thể truy cập bất kỳ phần tử nào. Giải pháp cho điều đó là sử dụng sự kiện onload của trang. Thí dụ:108 gold badges721 silver badges993 bronze badges

Các thư viện JavaScript có thể có các phương pháp khác để thực hiện một cái gì đó tương tự, như sự kiện







7 trong JQuery.

Bạn có thể đặt các tập lệnh vào trang (mặc dù đây không phải là những gì được đề xuất bởi tiêu chuẩn HTML), nhưng nếu bạn cần truy cập các phần tử trong trang từ mã chạy ngay lập tức, tập lệnh phải được tải sau các phần tử. Thí dụ:Jul 22, 2010 at 13:22

Các kịch bản cũng có thể được đặt muộn trong trang vì lý do hiệu suất. Bạn có thể ghi nhớ điều đó và lưu nó cho đến khi bạn thực hiện bất kỳ vấn đề hiệu suất nào.

Đã trả lời ngày 22 tháng 7 năm 2010 lúc 12:34

Guffaguffa

Đã trả lời ngày 4 tháng 7 năm 2012 lúc 1:49Jul 4, 2012 at 1:49

Hướng dẫn does it matter where you put javascript? - bạn đặt javascript ở đâu có vấn đề gì không?

OlegolegOleg

23.8K7 Huy hiệu vàng60 Huy hiệu bạc89 Huy hiệu đồng7 gold badges60 silver badges89 bronze badges

Tôi nên đặt JavaScript ở đâu?

JavaScript trong hoặc bạn có thể đặt bất kỳ số lượng tập lệnh nào trong tài liệu HTML.Các tập lệnh có thể được đặt trong hoặc trong phần của trang HTML hoặc trong cả hai. or You can place any number of scripts in an HTML document. Scripts can be placed in the , or in the section of an HTML page, or in both.

Có tốt hơn là đặt JavaScript vào đầu hoặc cơ thể?

Nó thực sự phụ thuộc vào trang web của bạn.Nếu bạn đang truy cập và gọi các hàm JavaScript bên trong cơ thể thì nó phải được tham chiếu trong tiêu đề để được tải.Khác nếu bạn chỉ gọi JavaScript khi toàn bộ tài liệu được tải thì thật khôn ngoan khi đặt JavaScript ở cuối thân.If you are accessing and invoking the JavaScript functions inside the body then it must be referenced in the header so that is is loaded. Else if you are only going to call the JavaScript when the whole document is loaded then it is wise to put the JavaScript at the end of body.

Bạn có thể đặt JavaScript ở bất cứ đâu không?

Về mặt kỹ thuật, bạn có thể đặt JavaScript bất cứ nơi nào trong tài liệu của bạn..