2009-06-18 27 views

Trả lời

1

Nó chỉ ra rằng vì một hỗn hợp đặc biệt của javascript framework mà tôi cần để bắt đầu kịch bản bằng cách sử dụng trình nghe sự kiện được cung cấp bởi một trong các khung công tác khác.

1

Bạn đã thử tải tất cả các chức năng khởi tạo bằng cách sử dụng $().ready, chạy hàm jQuery bạn muốn kéo dài chưa?

Có lẽ bạn có thể sử dụng setTimeout() trên chức năng $().ready bạn muốn chạy, gọi chức năng 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 biến boolean). Khi đ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.

+0

Tôi không chắc chắn những gì bạn có nghĩa là bằng cách này. Bạn có đề xuất 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ỉ cần đặt kịch bản của tôi cuối cùng? Nếu như vậy sẽ như thế nào (Tôi là một nhà thiết kế thương mại, vì vậy đừng dùng những từ lớn :)) – chrism

+0

$ (tài liệu).ready (function() { callLoadFunction1(); callLoadFunction2(); calljQueryLoadFunction(); }); –

+0

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

188

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

Bạn có thể sử dụng sự kiện $(window).load() 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 trình xử lý $(document).ready() khác nhau đã kết thúc chạy.

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

tôi có thể nhập 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 $ (tài liệu) .ready(), điều này sẽ không khác nhau. –

+7

Câu trả lời này rất hữu ích đối với tôi bởi vì tôi không nhận ra rằng mã jquery được chạy theo thứ tự – Sevenearths

3

Từ here:

// 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  
} 

này sẽ đợi cho đến jQuery được nạp để sử dụng nó, nhưng bạn có thể sử dụng các khái niệm tương tự, thiết lập các biến trong các kịch bản khác của bạn (hoặc kiểm tra họ nếu họ không phải kịch bản của bạn) để chờ 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 này cho đồng bộ JS tải và chờ đợi cho đến khi họ đã hoàn tất trước khi làm bất cứ điều gì với họ sử dụ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> 
+0

Đ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 có gì hơn là một hack cho các phiên bản cũ của greasemonkey mà không hỗ trợ chỉ thị @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. –

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. Trong số $(document).ready() cuối cùng, bạn có thể kích hoạ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 ..

Quấn mã của bạn trong bộ 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> 
5

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>

+0

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

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