2009-05-26 23 views
122

Tôi có tệp javascript rất lớn tôi muốn tải chỉ khi người dùng nhấp vào một nút nhất định. Tôi đang sử dụng jQuery như khuôn khổ của tôi. Có phương pháp hoặc plugin tích hợp nào sẽ giúp tôi thực hiện việc này không?JQuery để tải tệp Javascript động

Một số chi tiết khác: Tôi có nút "Thêm nhận xét" cần tải tệp tin TinyMCE javascript (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 trang này khi tải trang ban đầu vì không phải ai cũng nhấp vào "Thêm nhận xét".

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

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

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

+0

câu hỏi của tôi nữa. –

+0

Đây là một nhánh tuyệt vời của máy nén TinyMCE, bổ sung thêm tải không đồng bộ TinyMCE thông qua plugin jQuery.tinyMCE, và bao gồm Gzip, nối và rút gọn: https: //github.com/bobbravo2/tinymce_compressor/blob/master/tiny_mce_gzip. php –

Trả lời

188

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

Bạn có thể muốn kiểm tra xem TinyMCE được xác định, tuy nhiên, trước khi đưa nó (cho cuộc gọi tiếp theo để 'Thêm nhận xét') để mã có thể trô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 init trên đó một lần, nghĩa là. Nếu không, bạn có thể tìm ra từ đây :)

+10

Bạn là guru jQuery +1 –

+5

Cảm ơn! Tôi không thể tin rằng tôi đã bỏ lỡ điều đó. Tôi là RTFM, tôi thề. –

+3

@Jose: Cảm ơn :), @Jeff: Không sao cả. Theo như jQuery awesomeness đi này là khá rõ. –

18

Tôi nhận ra mình 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(); 
      } 
     }); 
    } 
}); 

Chức năng getScript() thực sự ngăn bộ nhớ đệm của trình duyệt. Nếu bạn chạy một dấu vết bạn sẽ thấy những kịch bản được nạp với một URL bao gồm một tham số timestamp:

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

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

===

Ngoài ra, trong tài liệu getScript() có một mã số mẫu mà chứng minh làm thế nào để cho phép bộ nhớ đệm bằng cách tạo ra 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ể làm như vậy bằng cách sử dụng ajaxSetup() như sau:

$.ajaxSetup({ 
    cache: true 
}); 
+0

Điều này có thể không có sẵn khi bạn đã viết điều này, nhưng lưu ý rằng jQuery cho phép bạn (trên toàn cầu) vô hiệu hóa tính năng không lưu bộ nhớ cache này và cho phép lưu vào bộ nhớ cache một lần nữa. Xem http://api.jquery.com/jQuery.getScript/#caching-requests (Ồ, tôi thấy phương thức $ .ajax() mà bạn đề cập ở đây cũng được đề cập ở đây.) –

+0

@PeterHansen - Cảm ơn bạn đã biết mẹo. Tôi đã cập nhật câu trả lời của tôi với đề xuất của bạn. – dana

+0

jQuery 1.12.0 hoặc mới hơn hỗ trợ vô hiệu hóa nội dung anticache như sau: '$ .getScript ({url:" test.js ", cache: true})' – oriadam

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