Trì hoãn tập lệnh jquery cho đến khi mọi thứ khác được tải xong


111

Tôi có một tập lệnh jquery mà tôi chỉ cần chạy khi mọi thứ khác trên trang, bao gồm cả một số javascrip khác (mà tôi không có quyền kiểm soát) đã hoàn thành công việc của chúng.

Tôi mặc dù có lẽ đã có một giải pháp thay thế cho $ (tài liệu). Rồi nhưng tôi không thể tìm thấy nó.

Câu trả lời:


217

Bạn có thể có $(document).ready()nhiều lần trong một trang. Mã được chạy theo trình tự mà nó xuất hiện.

Bạn có thể sử dụng $(window).load()sự kiện cho mã của mình vì điều này xảy ra sau khi trang được tải đầy đủ và tất cả mã trong các $(document).ready()trình xử lý khác nhau đã chạy xong.

$(window).load(function(){
  //your code here
});

1
Tôi có thể nhập các tập lệnh bên ngoài bằng phương pháp này không?
chrism

1
Chắc chắn, nếu bạn đã làm điều này bên trong $ (document) .ready (), thì điều này sẽ không khác.
Jose Basilio

7
Câu trả lời này hữu ích cho tôi vì tôi không nhận ra rằng mã jquery được chạy theo trình tự
Sevenearths

1
Cảm ơn bạn rất nhiều! Điều này đã khắc phục sự cố .height () của tôi trong đó nó không nhận được chiều cao chính xác vì trang (dường như) chưa được tải.
Jon

6
Trong JQuery 3.0, bạn nên sử dụng cú pháp $(window).on('load', function() { });vì $ (window) .load () không được dùng nữa.
Alex H

13

Khối mã này giải quyết vấn đề của tôi,

<script type="text/javascript">
  $(window).bind("load", function () {
    // Code here
  });
</script>


Làm cách nào bạn có thể chạy một hàm jQuery để xem jQuery đã được tải chưa? Điều này sẽ chỉ hoạt động khi jQuery đã được tải trước khi kiểm tra.
HelpNeeder

11

Nhiều $(document).ready()sẽ kích hoạt theo thứ tự từ trên xuống trên trang. Cuối cùng $(document).ready()sẽ kích hoạt cuối cùng trên trang. Bên trong cuối cùng $(document).ready(), bạn có thể kích hoạt một sự kiện tùy chỉnh mới để kích hoạt sau tất cả các sự kiện khác ..

Gói mã của bạn trong một trình xử lý sự kiện cho sự kiện tùy chỉnh mới.

<html>
<head>
<script>
    $(document).on("my-event-afterLastDocumentReady", function () {
        // Fires LAST
    });
    $(document).ready(function() {
        // Fires FIRST
    });
    $(document).ready(function() {
        // Fires SECOND
    });
    $(document).ready(function() {
        // Fires THIRD
    });
</script>
<body>
... other code, scripts, etc....
</body>
</html>

<script>
    $(document).ready(function() {
        // Fires FOURTH
        // This event will fire after all the other $(document).ready() functions have completed.
        // Usefull when your script is at the top of the page, but you need it run last
        $(document).trigger("my-event-afterLastDocumentReady");
    });
</script>

3

Từ đây :

// Add jQuery 
var GM_JQ = document.createElement('script'); 
GM_JQ.src = 'http://jquery.com/src/jquery-latest.js';
GM_JQ.type = 'text/javascript'; 
document.getElementsByTagName('head')[0].appendChild(GM_JQ); 

// Check if jQuery's loaded 
function GM_wait() 
{ 
    if(typeof unsafeWindow.jQuery == 'undefined') 
    { 
        window.setTimeout(GM_wait,100); 
    } 
    else 
    { 
        $ = unsafeWindow.jQuery; 
        letsJQuery(); 
    } 
} 

GM_wait(); 

// All your GM code must be inside this function 
function letsJQuery() 
{
    // Do your jQuery stuff in here    
} 

Điều này sẽ đợi cho đến khi jQuery được tải để sử dụng nó, nhưng bạn có thể sử dụng cùng một khái niệm, đặt các biến trong các tập lệnh khác của bạn (hoặc kiểm tra chúng nếu chúng không phải là tập lệnh của bạn) để đợi cho đến khi chúng được tải để sử dụng chúng.

Ví dụ: trên trang web của tôi, tôi sử dụng điều này để tải JS không đồng bộ và đợi cho đến khi chúng hoàn tất trước khi làm bất kỳ điều gì với chúng bằng jQuery:

<script type="text/javascript" language="JavaScript"> 
    function js(url){
        s = document.createElement("script");
        s.type = "text/javascript";
        s.src = url;
        document.getElementsByTagName("head")[0].appendChild(s);
    }       

    js("/js/jquery-ui.js");
    js("/js/jrails.js");
    js("/js/jquery.jgrowl-min.js");
    js("/js/jquery.scrollTo-min.js");
    js("/js/jquery.corner-min.js");
    js("/js/jquery.cookie-min.js");
    js("/js/application-min.js");

    function JS_wait() {
        if (typeof $.cookie == 'undefined' || // set in jquery.cookie-min.js
            typeof getLastViewedAnchor == 'undefined' || // set in application-min.js
            typeof getLastViewedArchive == 'undefined' || // set in application-min.js 
            typeof getAntiSpamValue == 'undefined') // set in application-min.js
        { 
            window.setTimeout(JS_wait, 100); 
        }
        else 
        { 
            JS_ready(); 
        }
    }

    function JS_ready() {
        // snipped
    };

    $(document).ready(JS_wait);
</script> 

Điều này sẽ chỉ đợi cho đến khi jQuery được tải và bỏ qua các khía cạnh khác của trang. Nó không khác gì một bản hack dành cho các phiên bản Greasemonkey cũ hơn không hỗ trợ lệnh @require.
Cheekysoft

1
Tôi đã thêm mã của mình làm ví dụ về cách tôi sử dụng cùng một khái niệm với jQuery để đợi cho đến khi mã khác được tải.
Chris Doggett

1

Hóa ra là do sự pha trộn đặc biệt của các khuôn khổ javascript mà tôi cần phải bắt đầu tập lệnh bằng cách sử dụng trình xử lý sự kiện do một trong các khuôn khổ khác cung cấp.


3
Hạnh phúc mà bạn tìm thấy một giải pháp nhưng câu trả lời của bạn không phải là hữu ích cho người khác mà không biết thêm chi tiết ...
Andrew

1

Bạn đã thử tải tất cả các hàm khởi tạo bằng cách sử dụng $().readyhàm jQuery mà bạn muốn sau cùng chưa?

Có lẽ bạn có thể sử dụng setTimeout()trên các $().readychức năng bạn muốn chạy, kêu gọi các chức năng mà bạn muốn tải.

Hoặc, sử dụng setInterval()và kiểm tra khoảng thời gian để xem liệu tất cả các hàm tải khác đã hoàn thành chưa (lưu trữ trạng thái trong một biến boolean). Khi các điều kiện được đáp ứng, bạn có thể hủy bỏ khoảng thời gian và chạy chức năng tải.


Tôi không chắc ý của bạn về điều này. Bạn có gợi ý rằng tôi nhập tất cả các tập lệnh thông qua một tập lệnh jquery và chỉ đặt tập lệnh của tôi sau cùng không? Nếu có điều gì sẽ có cái nhìn tương tự (Tôi là một nhà thiết kế bởi thương mại, do đó, không sử dụng từ ngữ lớn :))
dầu thánh

$ (document) .ready (function () {callLoadFunction1 (); callLoadFunction2 (); calljQueryLoadFunction ();});
Richard Clayton

các tập lệnh khác đều là tệp bên ngoài nên tôi không chắc điều này sẽ hoạt động đúng không?
chrism

@chrism: Hãy xem ví dụ thứ hai của tôi. Nó đợi cho đến khi các biến được đặt cho biết các tệp JS bên ngoài khác đã được tải trước khi nó thực hiện bất cứ điều gì. Bạn chỉ cần đặt mã bạn muốn chạy cuối cùng trong phương thức JS_ready () của tôi. Nó thực hiện chính xác những gì bạn đang tìm kiếm.
Chris Doggett

2
Chỉ cần sử dụng$(window).load(function(){...})
Ryan Taylor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.