JQuery เพื่อโหลดไฟล์ Javascript แบบไดนามิก


135

ฉันมีไฟล์จาวาสคริปต์ขนาดใหญ่มากฉันต้องการโหลดเฉพาะเมื่อผู้ใช้คลิกที่ปุ่มใดปุ่มหนึ่ง ฉันใช้ jQuery เป็นกรอบงานของฉัน มีวิธีการหรือปลั๊กอินในตัวที่จะช่วยฉันทำสิ่งนี้หรือไม่?

รายละเอียดเพิ่มเติม: ฉันมีปุ่ม "เพิ่มความคิดเห็น" ที่ควรโหลดไฟล์จาวาสคริปต์ TinyMCE (ฉันได้ต้มไฟล์ TinyMCE ทั้งหมดลงในไฟล์ JS ไฟล์เดียว) จากนั้นเรียก tinyMCE.init (... )

ฉันไม่ต้องการโหลดสิ่งนี้ในการโหลดหน้าเริ่มต้นเพราะไม่ใช่ทุกคนที่จะคลิก "เพิ่มความคิดเห็น"

ฉันเข้าใจว่าฉันทำได้:

$("#addComment").click(function(e) { document.write("<script...") });

แต่มีวิธีที่ดีกว่า / ห่อหุ้มหรือไม่?


นี่เป็นทางแยกที่ยอดเยี่ยมของคอมเพรสเซอร์ TinyMCE ซึ่งเพิ่มการโหลด TinyMCE แบบอะซิงโครนัสผ่านปลั๊กอิน jQuery.tinyMCE และรวมถึง Gzip การต่อและการย่อขนาด: github.com/bobbravo2/tinymce_compressor/blob/master/…
Bob Gregor

คำตอบ:


200

ใช่ใช้getScriptแทน document.write ซึ่งจะอนุญาตให้เรียกกลับได้เมื่อโหลดไฟล์

คุณอาจต้องการตรวจสอบว่ามีการกำหนด TinyMCE หรือไม่ก่อนที่จะรวม (สำหรับการเรียก 'เพิ่มความคิดเห็น' ในภายหลัง) ดังนั้นรหัสอาจมีลักษณะดังนี้:

$('#add_comment').click(function() {
    if(typeof TinyMCE == "undefined") {
        $.getScript('tinymce.js', function() {
            TinyMCE.init();
        });
    }
});

สมมติว่าคุณต้องโทรinitเพียงครั้งเดียวนั่นคือ ถ้าไม่คุณสามารถหาได้จากที่นี่ :)


3
@Jose: ขอบคุณ :), @ เจฟฟ์: ไม่มีปัญหา เท่าที่ jQuery สุดยอดไปอันนี้ยังไม่เป็นที่รู้จัก
Paolo Bergantino

1
TLDR; ทำได้ก็ต่อเมื่อสคริปต์อยู่ในไดเร็กทอรีเดียวกัน เวอร์ชันที่ยาวขึ้น: getScript จะฉีดจาวาสคริปต์ลงใน scrips ปัจจุบันแทนที่จะเป็นเพจ สิ่งนี้หมายความว่าเส้นทางใด ๆ บนจาวาสคริปต์ที่รวมอยู่จะสัมพันธ์กับเอกสารปัจจุบัน
Tom Carchrae

23

ฉันรู้ว่าฉันมาสายเล็กน้อยที่นี่ (ประมาณ 5 ปี) แต่ฉันคิดว่ามีคำตอบที่ดีกว่าคำตอบที่ได้รับการยอมรับดังนี้:

$("#addComment").click(function() {
    if(typeof TinyMCE === "undefined") {
        $.ajax({
            url: "tinymce.js",
            dataType: "script",
            cache: true,
            success: function() {
                TinyMCE.init();
            }
        });
    }
});

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

http://www.yoursite.com/js/tinymce.js?_=1399055841840

หากผู้ใช้คลิก#addCommentลิงก์หลายครั้งระบบtinymce.jsจะโหลดซ้ำจาก URL ที่กำหนดเวลาที่แตกต่างกัน สิ่งนี้เอาชนะวัตถุประสงค์ของการแคชเบราว์เซอร์

===

อีกวิธีหนึ่งในgetScript()เอกสารประกอบมีโค้ดตัวอย่างที่สาธิตวิธีการเปิดใช้งานการแคชโดยสร้างcachedScript()ฟังก์ชันแบบกำหนดเองดังนี้:

jQuery.cachedScript = function( url, options ) {

    // Allow user to set any option except for dataType, cache, and url
    options = $.extend( options || {}, {
        dataType: "script",
        cache: true,
        url: url
    });

    // Use $.ajax() since it is more flexible than $.getScript
    // Return the jqXHR object so we can chain callbacks
    return jQuery.ajax( options );
};

// Usage
$.cachedScript( "ajax/test.js" ).done(function( script, textStatus ) {
    console.log( textStatus );
});

===

หรือหากคุณต้องการปิดการใช้งานการแคชทั่วโลกคุณสามารถทำได้โดยใช้ajaxSetup()ดังนี้:

$.ajaxSetup({
    cache: true
});

สิ่งนี้อาจไม่พร้อมใช้งานเมื่อคุณเขียนสิ่งนี้ แต่โปรดทราบว่า jQuery อนุญาตให้คุณ (ทั่วโลก) ปิดใช้งานคุณสมบัติไม่แคชนี้และอนุญาตให้ทำการแคชอีกครั้ง ดูapi.jquery.com/jQuery.getScript/#caching-requests (โอ้ฉันเห็นวิธี $ .ajax () ที่คุณกล่าวถึงที่นี่เช่นกัน)
Peter Hansen

@PeterHansen - ขอบคุณสำหรับเคล็ดลับ ฉันอัปเดตคำตอบพร้อมคำแนะนำของคุณ
dana

3
jQuery 1.12.0 หรือใหม่กว่ารองรับการปิดใช้งานแอนติแคชอินไลน์ดังนี้$.getScript({url: "test.js",cache:true})
oriadam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.