2010-10-14 30 views
30

Giả sử, tôi có một tập tin js mà trông như thế này:Trình tự thực hiện của tài liệu jquery sẵn sàng

$(document).ready(function() { // first task}); 
$(document).ready(function() { // second task }); 
$(document).ready(function() { // third task }); 

Sau khi tải tập tin về nhiệm vụ được thực hiện theo thứ tự. Tôi không hiểu tại sao? Tôi đoán rằng các phương thức gọi lại được kích hoạt khi sự kiện "sẵn sàng" xảy ra. Lệnh thực hiện được giữ lại như thế nào? Cuộc gọi liên tiếp có được xếp hàng đợi ở một nơi nào đó không?

Lưu ý: Tôi biết rằng đây là cách mã hóa rất ngây thơ. Tôi đã viết đoạn mã chỉ để hiểu rõ và không viết mã như vậy trong các dự án của tôi.

+0

Tôi sẽ không gửi câu trả lời vì tôi không chắc chắn, nhưng không. Đã thêm người nghe sự kiện và người nghe sự kiện được kích hoạt theo thứ tự hoặc được thêm vào ? – EMMERICH

+1

Bạn mong đợi điều gì sẽ xảy ra? – SLaks

Trả lời

31

Trình xử lý của bạn đang được pushed into an array (readyList) để thực hiện in order later, khi documentis ready.

They're queued like this:

readyList.push(fn); 

And executed when ready like this:

var fn, i = 0; 
while ((fn = readyList[ i++ ])) { 
    fn.call(document, jQuery); 
} 

Nếu tài liệu là đã đã sẵn sàng, sau đó họ sẽ thực hiện ngay lập tức, mà vẫn là theo thứ tự.

+0

@Nick: trong 1.4.3 bạn có thể kiểm soát thứ tự thực hiện, không? – jAndy

+1

@jAndy - Bạn không thể, mặc dù bạn có thể * trì hoãn * việc thực hiện tất cả các trình xử lý 'ready', về cơ bản nói" hey wait I'm creating more elements! ". –

+0

@Nick: Ah thú vị. Ngay cả khi tôi không thể tưởng tượng một quảng cáo đặc biệt. – jAndy

5

Các chức năng bạn chỉ định được thêm vào danh sách. Khi DOM đã sẵn sàng, jQuery lặp qua danh sách đó và gọi các hàm theo thứ tự đó.

Danh sách của bạn trở thành một cái gì đó giống như ..

handlers = [ function(){ alert('first') }, function() { alert('second')} ]; 

Sau đó, một lặp lặp qua ...

for (var i = 0, l = handlers.length; i<l; ++i) { 
    handlers.apply(document, arguments) 
} 

Và các chức năng này được gọi là trong bối cảnh của tài liệu.

+0

Chúng không được xử lý như thế này, chúng được thực hiện theo cách mà 'jQuery (funcition ($) {});' works :) –

+0

nó là một ví dụ giả, 'handlers' về cơ bản là' readyList'. –

+0

Tôi đã đề cập đến cách chúng được gọi là :) –

1

Đây không phải là tốt hơn, nhưng bên trong $ (cửa sổ) .load bạn có thể có nhiều quyền kiểm soát hơn. sau $ (tài liệu) .ready

$(window).load(fn); 
Các vấn đề liên quan