2009-05-26 23 views
122

Çok büyük bir javascript dosyası var Sadece yüklemek istediğim kullanıcı belirli bir düğmeye basıyor. JQuery'yi çerçevem ​​olarak kullanıyorum. Bunu yapmama yardımcı olacak yerleşik bir yöntem mi yoksa eklenti mi var?JQuery Javascript dosyasını dinamik olarak yüklemek için

Biraz daha ayrıntı: TinyMCE javascript dosyasını yüklemesi gereken bir "Yorum Ekle" düğmesi (tüm TinyMCE öğelerini tek bir JS dosyasına indirdim) ve ardından tinyMCE.init (...).

Bunu ilk sayfa yüküne yüklemek istemiyorum çünkü herkes "Yorum Ekle" ye tıklayamaz.

Yaptığım sadece olabileceğini anlıyoruz:

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

ama daha iyi/kapsüllü yol var?

+0

sorum da benim. –

+0

Bu, TinyMCE kompresörünün harika bir çatalıdır, bu da TinyMCE'nin jQuery.tinyMCE eklentisi aracılığıyla asenkron yüklemesini ekler ve Gzip, birleştirme ve minification içerir: https: //github.com/bobbravo2/tinymce_compressor/blob/master/tiny_mce_gzip. php –

cevap

188

Evet, document.write yerine getScript kullanın - dosya yüklendikten sonra bir geri arama için bile izin verecektir.

Sen TinyMCE tanımlanması durumunda ('Yorum Ekle' sonraki çağrılar için) dahil etmeden önce olsa da, kontrol etmek isteyebilirsiniz böylece kodu şöyle görünebilir: Yalnızca zorunda varsayarsak

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

Bir kez init arayın, yani. Değilse, (5 yıl ya da öylesine), Ben geç burada küçük olduğumu fark :) buradan

+10

Siz jQuery gurusu +1 –

+5

Teşekkür ederiz! Bunu özlediğime inanamıyorum. RTFM yendim, yemin ederim. –

+3

@Jose: Thanks :), @Jeff: Sorun değil. JQuery awesomeness kadar gider bu oldukça bilinmemektedir. –

18

onu anlamaya, ancak aşağıdaki gibi kabul ettim olandan daha iyi bir yanıt olduğunu düşünüyorum:

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

getScript() işlevi aslında tarayıcının önbelleğe önler. Bir izlemesi çalıştırırsanız komut dosyası bir zaman damgası parametresi içeren bir URL ile yüklenir göreceksiniz: Bir kullanıcı #addComment bağlantısı, birden çok kez, tinymce.js bir farklı timestampped URL'den yeniden yüklenecek tıkladığında

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

edin. Bu, tarayıcı önbelleklemenin amacını ortadan kaldırır.

=== Alternatif

, getScript() belgelerinde aşağıdaki gibi özel bir cachedScript() işlev oluşturarak önbelleğe etkinleştirme gösteren bir örnek kod vardır:

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

===

Veya, tüm dünyada önbelleğe almayı devre dışı bırakmak isterseniz, ajaxSetup() kullanarak aşağıdaki gibi yapabilirsiniz:

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

Bu, siz bunu yazdığınızda mevcut olmayabilir, ancak jQuery öğesinin bu önbelleğe alma özelliğini devre dışı bırakmanıza ve önbelleğe almayı yeniden başlamasına izin verdiğine dikkat edin. Bkz. Http://api.jquery.com/jQuery.getScript/#caching-requests (Oh, burada gördüğünüz $ .ajax() yaklaşımının burada da belirtildiğini görüyorum.) –

+0

@PeterHansen - Teşekkürler. Cevabımı önerinizle güncelledim. – dana

+0

jQuery 1.12.0 veya üstü antikodu satır içi şu şekilde devre dışı bırakmayı destekler: $ .getScript ({url: "test.js", önbellek: true}) ' – oriadam