2012-02-21 39 views
7

Tôi đã nhận thấy một số tập lệnh dường như được gọi trước khi những người khác trên một trang nhất định, tôi đã tự hỏi, thứ tự cụ thể cho các tập lệnh để tải là gì? Trong trang trước khi tham chiếu .js script? Chúng có chạy theo thứ tự từ <script> đầu tiên được đề cập đến cuối cùng trong trang hay tùy thuộc vào trình duyệt này không? Làm cách nào để đảm bảo rằng một tập lệnh cụ thể đầu tiên chạy trong một trang?Đảm bảo tập lệnh Javascript đầu tiên được chạy?

Trả lời

4

Tôi đã nhận thấy một số tập lệnh dường như được gọi trước các trang khác trên một trang nhất định . Tôi đã tự hỏi, thứ tự cụ thể cho các kịch bản để tải là gì?

Điều này được thiết lập bởi W3C trong thông số ngôn ngữ của chúng. Ví dụ, đối với số HTML 4.01 Specification, nó được xác định trong Section 18.2.4 Dynamic modification of documents, item 1.

Trong trang trước các tập lệnh .js được tham chiếu?

Xem ở trên. Không, các tập lệnh nội tuyến và liên kết được xử lý giống nhau.

Chúng có chạy theo thứ tự từ đầu đến cuối trong trang, hoặc tùy thuộc vào trình duyệt này không?

Thông số kỹ thuật gọi cho chúng chạy liên tục từ trên xuống dưới. Bạn sẽ phải tìm một trình duyệt thực hiện ngôn ngữ theo đặc điểm kỹ thuật. Tôi không thể nghĩ ra bất kỳ điều gì ngay bây giờ để xử lý các thẻ SCRIPT khác nhau, nhưng tôi chắc chắn điều đó là có thể.

Một điều cần xem xét khác là định nghĩa "chạy". Điều đó nghe có vẻ như phân tích cú pháp ngữ nghĩa, nhưng không phải như vậy. JavaScript, giống như bất kỳ ngôn ngữ lập trình nào, được thiết kế để hoạt động theo các tiêu chuẩn. JavaScript được chỉ định trong các ECMA-262 5.1 Edition/June 2011 standard để đánh giá từ trái sang phải trong Phần 7 Quy ước Lexical. (Kết thúc dòng được coi là ký tự ngoài cùng bên trái của dòng tiếp theo.) Tài liệu này cũng cung cấp các quy ước cho thứ tự trong đó các câu lệnh và các hoạt động khác được đánh giá, chẳng hạn như các câu lệnh WHILE hoặc FOR.

Làm cách nào để đảm bảo rằng tập lệnh cụ thể đầu tiên chạy trong một trang?

(1) Đặt ở trên cùng và (2) chọn trình duyệt triển khai đặc tả ngôn ngữ.

Tuy nhiên, tôi cảm thấy có thể có vấn đề gì đó đằng sau câu hỏi này. Nếu bạn đang cố dừng mã không mong muốn để thực thi, bạn sẽ phải chặn mã đó cho đến khi trình xử lý sự kiện ONLOAD đăng ký rằng trang đã hoàn tất. (Chỉ cần đính kèm các hoạt động của bạn trong một hàm hoặc bao quanh chúng với một IF để kiểm tra cờ boolean, tức là isLoaded được đặt đúng bằng ONLOAD.) Sau đó, khi trình xử lý sự kiện ONLOAD kích hoạt, bạn có thể khởi động các hoạt động theo lịch biểu của riêng bạn mà không phải lo lắng về những thứ như đối tượng DOM không được khôi phục.

9

Miễn là không có tập lệnh nào được tải động hoặc được đánh dấu là không đồng bộ hoặc trì hoãn, tập lệnh được chạy hoặc được đánh giá theo thứ tự gặp phải trong trang. Vì vậy, các tập lệnh đầu tiên gặp phải đầu tiên.

Tệp tập lệnh được tham chiếu bên ngoài phải được tải sẽ khiến tất cả thực thi javascript tiếp tục chờ cho đến khi tệp được tham chiếu bên ngoài được tải và phân tích cú pháp và chạy.

Vì vậy, thứ tự đánh giá của javascript bình thường (không đồng bộ, không trì hoãn) được xác định 100% theo thứ tự nó gặp phải trong trang.

+0

Vui lòng cung cấp tham chiếu cho điều đó từ ECMA-262 phiên bản 5+ tuyên bố đây là hành vi được chỉ định theo tiêu chuẩn. Bạn có chắc chắn nó hoạt động theo cách này trên tất cả các trình duyệt và nền tảng và không chỉ là một con sáo? – ingyhere

+0

@ingyhere - Tôi không biết nơi nào có một tham chiếu về nó, tôi không có thời gian để xem ngay bây giờ. Đây là javascript WAY hoạt động - nếu bạn có một số lý do để thách thức điều đó, hãy nêu rõ lý do đó. Javascript thực thi từ trên xuống. Nó hoàn toàn phải nhất quán trên các trình duyệt hoặc rất nhiều trang sẽ phá vỡ bởi vì mọi người dựa vào javascript thực hiện từ trên xuống dưới tất cả các thời gian. Khá nhiều ngôn ngữ phải cung cấp thứ tự thực hiện được đảm bảo giữa các phần mã khác nhau vì điều đó thường được yêu cầu để làm cho logic của bạn hoạt động. – jfriend00

+0

Đây là một tham chiếu: http://docstore.mik.ua/orelly/webprog/jscript/ch12_03.htm – jfriend00

5

Theo mặc định, các thẻ script được tải xuống và được đánh giá tuần tự khi chúng gặp phải trong tài liệu HTML.

Tuy nhiên nếu bạn sử dụng thuộc tính async hoặc defer, việc thực thi xảy ra sau khi tập lệnh hoàn tất tải xuống (không đồng bộ) hoặc sau khi tải xong trang (trì hoãn).

+0

Không tính vào việc trì hoãn thuộc tính * hoãn cho đến khi phân tích cú pháp (nếu không nó sẽ là một lựa chọn tốt cho các sự kiện tải và sẵn sàng). Trong HTML 4, [trì hoãn] (http://www.w3.org/TR/html401/interact/scripts.html#adef-defer) chỉ là gợi ý rằng tập lệnh không tạo nội dung để trình duyệt có thể tiếp tục tải trong khi thực hiện nó. Trong HTML5, [trì hoãn] (http://www.w3.org/TR/html5/scripting-1.html#attr-script-defer) có nghĩa là "đợi cho đến khi phân tích xong". HTML5 không được hỗ trợ đầy đủ mà hành vi được chỉ định có thể dựa vào, có lẽ không phải trong một vài năm. – RobG

1

Tập lệnh được chạy theo thứ tự chúng được đánh giá trong tệp html, giống như bạn đọc nó từ trên xuống dưới.

Tuy nhiên, không đồng bộ và trì hoãn có thể ghi đè điều này cho các trình duyệt đã triển khai.

Các vấn đề liên quan