2012-04-12 24 views
8

Tôi đang cố gắng tìm ra một vấn đề với một số mã tôi đã kế thừa.Tương tác giữa jQuery .ready() và <script defer>

Tôi có một trang HTML với

<script type="text/javascript" src="file1.js" defer="defer"></script> 
<script type="text/javascript" src="file2.js" defer="defer"></script> 
</body> 
</html> 

file1.js đã

FOO = { 
    init : function() { 
    var bar = BAR; 
    } 
} 

$(document).ready(FOO.init); 

file2.js đã

var BAR = { 
} 

Bởi vì thuộc tính Hoãn trên các yếu tố, là nó an toàn để giả định rằng khi các cuộc gọi .ready()FOO.init() rằng BAR có thể vẫn chưa được xác định tại thời điểm đó b/c mã số trong file2.js chưa được thực hiện do thực thi hoãn lại?

Điều này phù hợp với lỗi tôi đang cố gắng theo dõi (chỉ xảy ra không thường xuyên trong IE), nhưng tôi thực sự muốn hiểu lý do tại sao điều này xảy ra trước khi tôi làm việc trên một giải pháp. Tôi không biết tại sao nhà phát triển ban đầu sử dụng defer, ngoài lời khen khó hiểu về "anh ấy phải" làm theo cách này.

+0

Không có câu trả lời, nhưng tôi cảm thấy với bạn, con người. –

+0

Bạn có hiểu thuộc tính 'defer'attribute không? Bởi vì có vẻ như với tôi đó là điều rất phổ biến để làm ... –

+0

Tôi đoán nhà phát triển ban đầu muốn một tập lệnh khác được tải trước khi file1.js và file2.js (hoặc anh ta không biết về $ (tài liệu) .ready () ...) – jbl

Trả lời

2

Trì hoãn sẽ khiến tập lệnh được thêm vào hàng đợi được xử lý sau khi trang được tải hoàn toàn. Theo các kịch bản lệnh hoãn lại cần phải được thêm vào hàng đợi theo thứ tự chúng xuất hiện trên trang.

Tuy nhiên, các trình duyệt khác nhau đã thực hiện những việc hơi khác với thứ tự. IE dường như chạy tập lệnh trì hoãn theo thứ tự mà họ đã tải xong thay vì thứ tự chúng xuất hiện trên trang. Vì vậy, bạn thấy lỗi không thường xuyên vì đôi khi nó tải chúng theo thứ tự đúng và đôi khi không.

Xem this post trên hacks.mozilla.com để xem giải thích đầy đủ hơn và ví dụ về cách các trình duyệt khác nhau xử lý thứ tự của hàng đợi trì hoãn.

0

Deffering trong javascript cung cấp tùy chọn cho trình duyệt khi nào diễn giải tập lệnh, trong một số điều kiện tối ưu như chrome được tải xuống khi trang đang được tải, sau đó được phân tích cú pháp và diễn giải. Nếu bạn sử dụng trì hoãn như trên, bạn không bao giờ có thể chắc chắn tập lệnh nào được tải trước hoặc khi việc diễn giải hoàn tất.

BAR có thể không được xác định trên một lần tải trang và được xác định khi tải lại (được lưu vào bộ nhớ cache) hoặc tập lệnh thứ hai được tải trước.

Để kiểm tra điều này, hãy thử thay đổi một trong các tập lệnh để bắt buộc tải xuống và giải thích mới và xem điều kiện chủng tộc tồn tại.

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