การหน่วงเวลาสคริปต์ jquery จนกว่าทุกอย่างจะโหลดขึ้น


112

ฉันมีสคริปต์ jquery ซึ่งฉันต้องการเรียกใช้เพียงครั้งเดียวทุกอย่างในหน้ารวมถึงจาวาสคริปต์อื่น ๆ (ซึ่งฉันไม่สามารถควบคุมได้) ทำสิ่งนั้นเสร็จแล้ว

แม้ว่าบางทีอาจจะมีทางเลือกอื่นแทน $ (document) แต่ก็หาไม่เจอ

คำตอบ:


217

คุณสามารถมีได้$(document).ready()หลายครั้งในหนึ่งหน้า โค้ดจะทำงานตามลำดับที่ปรากฏ

คุณสามารถใช้$(window).load()เหตุการณ์สำหรับโค้ดของคุณได้เนื่องจากเหตุการณ์นี้เกิดขึ้นหลังจากโหลดเพจจนเต็มและโค้ดทั้งหมดในตัว$(document).ready()จัดการต่างๆทำงานเสร็จแล้ว

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

1
ฉันสามารถนำเข้าสคริปต์ภายนอกโดยใช้วิธีนี้ได้หรือไม่
chrism

1
แน่นอนว่าหากคุณทำสิ่งนี้ภายใน $ (document) เรียบร้อยแล้ว () สิ่งนี้จะไม่แตกต่างกัน
Jose Basilio

7
คำตอบนี้มีประโยชน์สำหรับฉันเพราะฉันไม่รู้ว่าโค้ด jquery ทำงานตามลำดับ
Robert Johnstone

1
ขอบคุณมาก! สิ่งนี้ได้แก้ไขปัญหา .height () ของฉันที่ไม่ได้รับความสูงที่ถูกต้องเนื่องจากยังไม่ได้โหลดหน้า (เห็นได้ชัด)
จอน

6
ใน JQuery 3.0 คุณควรใช้ไวยากรณ์$(window).on('load', function() { });เนื่องจาก $ (window) .load () เลิกใช้แล้ว
Alex H

13

บล็อกรหัสนี้ช่วยแก้ปัญหาของฉัน

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


คุณจะเรียกใช้ฟังก์ชัน jQuery เพื่อดูว่า jQuery โหลดแล้วได้อย่างไร สิ่งนี้จะใช้ได้เฉพาะเมื่อ jQuery โหลดก่อนการตรวจสอบ
HelpNeeder

11

หลายรายการ$(document).ready()จะเริ่มทำงานตามลำดับจากบนลงล่างของหน้า สุดท้าย$(document).ready()จะเริ่มทำงานครั้งสุดท้ายบนหน้า ในช่วงสุดท้าย$(document).ready()คุณสามารถทริกเกอร์เหตุการณ์ที่กำหนดเองใหม่ให้เริ่มทำงานหลังจากเหตุการณ์อื่น ๆ ทั้งหมด ..

รวมโค้ดของคุณไว้ในตัวจัดการเหตุการณ์สำหรับเหตุการณ์ที่กำหนดเองใหม่

<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

จากที่นี่ :

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

สิ่งนี้จะรอจนกว่า jQuery จะถูกโหลดเพื่อใช้งาน แต่คุณสามารถใช้แนวคิดเดียวกันตั้งค่าตัวแปรในสคริปต์อื่น ๆ ของคุณ (หรือตรวจสอบว่าไม่ใช่สคริปต์ของคุณหรือไม่) เพื่อรอจนกว่าจะโหลดเพื่อใช้งาน

ตัวอย่างเช่นในไซต์ของฉันฉันใช้สิ่งนี้สำหรับการโหลด JS แบบอะซิงโครนัสและรอจนกว่าจะเสร็จสิ้นก่อนที่จะทำอะไรกับพวกเขาโดยใช้ 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> 

การดำเนินการนี้จะรอจนกว่า jQuery จะถูกโหลดและไม่สนใจส่วนอื่น ๆ ของเพจ ไม่มีอะไรมากไปกว่าการแฮ็กสำหรับ greasemonkey เวอร์ชันเก่าที่ไม่รองรับ @require directive
Cheekysoft

1
ฉันได้เพิ่มโค้ดของฉันเป็นตัวอย่างวิธีที่ฉันใช้แนวคิดเดียวกันกับ jQuery เพื่อรอจนกว่าโค้ดอื่นจะโหลด
Chris Doggett

1

ปรากฎว่าเป็นเพราะส่วนผสมที่แปลกประหลาดของเฟรมเวิร์กจาวาสคริปต์ที่ฉันต้องเริ่มต้นสคริปต์โดยใช้ตัวฟังเหตุการณ์ที่จัดเตรียมโดยหนึ่งในเฟรมเวิร์กอื่น ๆ


4
มีความสุขที่คุณพบวิธีแก้ปัญหา แต่คำตอบของคุณไม่เป็นประโยชน์สำหรับผู้อื่นหากไม่มีรายละเอียดเพิ่มเติม ...
แอนดรู

1

คุณได้ลองโหลดฟังก์ชันการเริ่มต้นทั้งหมดโดยใช้$().readyฟังก์ชัน jQuery ที่คุณต้องการเป็นครั้งสุดท้ายหรือไม่?

บางทีคุณอาจใช้setTimeout()กับ$().readyฟังก์ชันที่คุณต้องการเรียกใช้โดยเรียกใช้ฟังก์ชันที่คุณต้องการโหลด

หรือใช้setInterval()และตรวจสอบช่วงเวลาเพื่อดูว่าฟังก์ชันโหลดอื่น ๆ ทั้งหมดเสร็จสมบูรณ์หรือไม่ (เก็บสถานะไว้ในตัวแปรบูลีน) เมื่อตรงตามเงื่อนไขคุณสามารถยกเลิกช่วงเวลาและเรียกใช้ฟังก์ชันโหลด


ฉันไม่แน่ใจว่าคุณหมายถึงอะไร คุณกำลังแนะนำให้ฉันนำเข้าสคริปต์ทั้งหมดผ่านสคริปต์ jquery และวางสคริปต์ของฉันไว้ล่าสุดหรือไม่? ถ้าเป็นเช่นนั้นจะเป็นอย่างไร (ฉันเป็นนักออกแบบโดยการค้าดังนั้นอย่าใช้คำใหญ่ :))
chrism

$ (เอกสาร) .ready (function () {callLoadFunction1 (); callLoadFunction2 (); calljQueryLoadFunction ();});
Richard Clayton

สคริปต์อื่น ๆ เป็นไฟล์ภายนอกทั้งหมดดังนั้นฉันไม่แน่ใจว่าจะใช้งานได้หรือไม่
chrism

@chrism: ดูตัวอย่างที่สองของฉัน รอจนกว่าจะมีการตั้งค่าตัวแปรที่ระบุว่ามีการโหลดไฟล์ JS ภายนอกอื่น ๆ ก่อนที่จะดำเนินการใด ๆ คุณเพียงแค่ใส่รหัสที่คุณต้องการเรียกใช้ครั้งสุดท้ายในวิธี JS_ready () ของฉัน มันทำในสิ่งที่คุณกำลังมองหา
Chris Doggett

2
เพียงแค่ใช้$(window).load(function(){...})
Ryan Taylor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.