2011-05-17 34 views
5

tôi thấy một số mã jquery trên Net nơi nào đó, mà mất dạng này:

<script>    
function doSomething(message) 
{ 
    $(document).ready(function(){  
     alert(message); 
     }); 
}; 
</script> 

ví dụ: một chức năng bên ngoài ("doSomething") trong đó có $ (document) .ready bên trong nó. Tôi bối rối vì không phải là mã dưới $ (tài liệu). Đã được kích hoạt khi DOM được tải? Nó giống như có một trình xử lý sự kiện bên trong một hàm (?). Hình thức mã này có hợp lý với bất kỳ ai không? Cảm ơn.

Trả lời

4

Đó có lẽ là lỗi trên bộ mã gốc. Bạn có thể làm điều đó, nhưng bạn muốn gọi số doSomething khá sớm. Lưu ý rằng nếu DOM đã sẵn sàng khi bạn gọi ready, jQuery sẽ gọi mã, do đó, nó sẽ xảy ra theo cách, nhưng nó sẽ không xảy ra cho đến khi ai đó, ở đâu đó, gọi doSomething. Tôi không thể thấy nhiều mục đích cho mô hình, vì vậy trừ khi bạn có một số tranh luận mạnh mẽ để sử dụng nó   — và đưa ra câu hỏi, tôi nghi ngờ bạn không :-)   — bạn có thể bỏ qua nó một cách an toàn.

+0

Tôi biết điều này là cũ nhưng tôi Cho phép nói rằng bạn muốn gọi một tệp XML/JSON ngay khi trang được kích hoạt, và khi hoàn thành chức năng đó, hãy cập nhật một số phần tử DOM với phản hồi nhận được.Nếu phản hồi đó nhanh hơn tải trang và các phần tử DOM chưa được tải, chúng không được cập nhật. Có thể doSomething() được gọi lại thành công và làm việc trong thời trang này? Vì vậy, nếu nó hoàn thành sớm, mọi thứ vẫn sẽ hoạt động? – iLLin

+2

@iLLin: Đó là một trường hợp sử dụng hoàn toàn hợp lý, tôi nghĩ vậy. Vì vậy, bạn kích hoạt yêu cầu ajax với một kịch bản rất cao trong tài liệu (trong 'đầu', tôi nghĩ), bằng cách sử dụng' ready' trong callback thành công. Hoàn toàn hợp lý. Tôi không chắc rằng yêu cầu ajax sẽ xảy ra * nhiều * sớm hơn nếu bạn đặt tập lệnh ở cuối thẻ 'body' (và sau đó bạn sẽ không phải bận tâm với' ready'), nhưng không gây hại trong việc cho phép trình duyệt biết sớm những gì bạn muốn. –

+0

Đó là chính xác trường hợp của tôi. – miguelsan

3

Biểu mẫu mã này có hợp lý với bất kỳ ai không?

Không, không.

8

Điều đó có ý nghĩa. $ (document) .ready đăng ký một trình xử lý sự kiện được kích hoạt khi DOM được nạp đầy đủ. Hàm ẩn danh được truyền cho nó, đó là trình xử lý. Nếu bạn đăng ký trình xử lý đó sau khi DOM được tải, nó sẽ được kích hoạt ngay lập tức.

Javascript có thể được thực hiện trước khi DOM được tải đầy đủ, vì vậy chức năng này thực hiện, nó thực sự đăng ký các thông điệp không được hiển thị trước khi DOM được tải. Bạn có thể sử dụng cấu trúc này nếu bạn không muốn thông báo được hiển thị trước khi DOM được tải đầy đủ.

+1

+1 để tìm ra * lý do * nào đó cho nó. :-) –

+0

Vâng, tôi không chắc chắn về lý do.Có thể, người lập trình gốc đã tìm thấy trình duyệt ngừng hiển thị trang khi thông báo được hiển thị. Nếu điều đó xảy ra, người dùng sẽ xem một số trang được hiển thị một nửa icky cho đến khi các tin nhắn được đóng lại. Đã thử nếu điều này thực sự có thể xảy ra. – GolezTrol

1

$ (tài liệu) .ready(); về cơ bản đăng ký chức năng được thực hiện khi DOM sẵn sàng. Tuy nhiên trong trường hợp này, lập trình viên đã lồng nhau trong hàm này. Điều này có nghĩa là nó sẽ không được thêm vào .ready() cho đến khi anh ta gọi một hàm doSomething();

Bạn có thể thử nó ra như sau:

<script type="text/javascript"> 
    function doSomething(){ 
     $(document).ready(function(){ 
      alert('here'); 

     }); 
    } 
    doSomething(); 
</script> 

Nơi này ở các phần khác nhau của HTML của bạn và kiểm tra xem nó ra (:

Cheers

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