JQuery để tải tệp Javascript động


134

Tôi có một tệp javascript rất lớn tôi chỉ muốn tải nếu người dùng nhấp vào một nút nhất định. Tôi đang sử dụng jQuery làm khung. Có một phương pháp hoặc plugin tích hợp nào sẽ giúp tôi làm điều này không?

Một số chi tiết khác: Tôi có nút "Thêm nhận xét" sẽ tải tệp javascript TinyMCE (Tôi đã luộc tất cả các công cụ TinyMCE xuống một tệp JS), sau đó gọi tinyMCE.init (...).

Tôi không muốn tải cái này khi tải trang ban đầu vì không phải ai cũng nhấp vào "Thêm bình luận".

Tôi hiểu tôi chỉ có thể làm:

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

Nhưng có một cách tốt hơn / đóng gói?


Đây là một ngã ba vĩ đại của máy nén TinyMCE, có thêm tải không đồng bộ của TinyMCE qua plugin jQuery.tinyMCE, và bao gồm Gzip, nối và việc rút gọn: github.com/bobbravo2/tinymce_compressor/blob/master/...
Bob Gregor

Câu trả lời:


200

Có, sử dụng getScript thay vì document.write - thậm chí nó sẽ cho phép gọi lại sau khi tải tệp.

Tuy nhiên, bạn có thể muốn kiểm tra xem TinyMCE có được xác định hay không, trước khi bao gồm nó (đối với các cuộc gọi tiếp theo đến 'Thêm nhận xét') để mã có thể trông giống như thế này:

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

Giả sử bạn chỉ phải gọi initnó một lần, đó là. Nếu không, bạn có thể tìm ra nó từ đây :)


3
@Jose: Cảm ơn :), @Jeff: Không vấn đề gì. Theo như jQuery tuyệt vời thì cái này còn khá xa lạ.
Paolo Bergantino

1
TLDR; chỉ làm điều này nếu các tập lệnh nằm trong cùng thư mục. Phiên bản dài hơn: getScript thực sự đưa javascript vào các đoạn mã hiện tại thay vì trang. điều này có nghĩa là bất kỳ đường dẫn nào trên javascript đi kèm sẽ liên quan đến tài liệu hiện tại.
Tom Carchrae

23

Tôi nhận ra mình đến hơi muộn ở đây, (5 năm hoặc lâu hơn), nhưng tôi nghĩ có một câu trả lời tốt hơn câu trả lời như sau:

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

Các getScript()chức năng thực sự ngăn chặn bộ nhớ đệm trình duyệt . Nếu bạn chạy theo dõi, bạn sẽ thấy tập lệnh được tải với một URL bao gồm tham số dấu thời gian:

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

Nếu người dùng nhấp vào #addCommentliên kết nhiều lần, tinymce.jssẽ được tải lại từ một URL được đánh dấu thời gian khác nhau. Điều này đánh bại mục đích của bộ nhớ đệm trình duyệt.

===

Ngoài ra, trong getScript() tài liệu có một số mã mẫu trình bày cách bật bộ đệm ẩn bằng cách tạo một cachedScript()chức năng tùy chỉnh như sau:

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 );
});

===

Hoặc, nếu bạn muốn tắt bộ nhớ đệm trên toàn cầu, bạn có thể sử dụng ajaxSetup()như sau:

$.ajaxSetup({
    cache: true
});

Điều này có thể không có sẵn khi bạn viết bài này, nhưng lưu ý rằng jQuery cho phép bạn (trên toàn cầu) tắt tính năng không lưu bộ đệm này và cho phép lưu lại bộ đệm. Xem api.jquery.com/jQuery.getScript/#caching-requests (Ồ, tôi thấy cách tiếp cận $ .ajax () mà bạn đề cập ở đây cũng được đề cập ở đó.)
Peter Hansen

@PeterHansen - Cảm ơn vì tiền boa. Tôi cập nhật câu trả lời của tôi với đề nghị của bạn.
dana

3
jQuery 1.12.0 trở lên hỗ trợ vô hiệu hóa nội tuyến chống trộm như thế này:$.getScript({url: "test.js",cache:true})
oriadam
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.