2011-08-14 6 views
13

Używam jQuery do dynamicznego dodawania skryptu do mojej strony i działa, ale jQuery dołącza "_ = TIMESTAMP" do adresu URL, przez co przeglądarka nigdy nie używa pamięć podręczną. Z następującego kodu:Dynamiczne dodawanie skryptu do strony z jQuery nigdy nie używa pliku z pamięci podręcznej.

<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'> 
<html xmlns='http://www.w3.org/1999/xhtml'> 
<head> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script> 
</head> 
<body> 
    <script type="text/javascript"> 
     $("head").append('<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.15/jquery-ui.min.js"></scr' + 'ipt>'); 
    </script> 
</body> 
</html> 

widzę w Firebug, że żądany adres URL jest:

https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.15/jquery-ui.min.js?_=1313291978667 

Czy ktoś wie jak powiedzieć jQuery nie to zrobić?

Dzięki

+0

Zamiast dołączając tag skryptu można użyć 'metody getScript' jQuery uzyskać js skrypt na stronie – ShankarSangoli

+0

tylko jako wskazówka należy użyć adresów URL zaczynając od "//ajax.googleapis ..." zamiast "https: //ajax.googleapis ...". Ponieważ spowoduje to błąd, jeśli twoja strona nie będzie dostępna przez SSL. Pamiętaj, że adres URL, który otrzymujesz, musi obsługiwać ten hack (usługi google). Zapewni to, że twoja strona działa zarówno na SSL, jak i bez niego. – Hoffmann

Odpowiedz

23

Aby odpowiedzieć na oryginalne pytanie, pojawi się znacznik czasu dołączany ponieważ jQuery by default zestawy cache: false dla script i jsonp połączeń który dodaje znacznik czasu do adresu URL.

Aby uniknąć znacznik czasu, można to zrobić:

$.ajaxPrefilter(function(options, originalOptions, jqXHR) { 
    if (options.dataType == 'script' || originalOptions.dataType == 'script') { 
     options.cache = true; 
    } 
}); 

To ustawia globalny prefilter dla wszystkich $.ajax połączeń, w tym te, które wykonane przez jQuery jednocześnie wnioskiem o script.

Sprawdzamy numer , aby upewnić się, że nie jesteśmy nieumyślnie celujący w inne wywołania ajax i jawnie ustawiamy cache na true. Pozwoli to uniknąć problemu z dodawaniem znacznika czasu.

Możesz teraz użyć oryginalnego kodu, który odbierze go z pamięci podręcznej.

+0

Doskonała odpowiedź. Podczas gdy drugi pracował dla mojego konkretnego przypadku, jest to bardziej kompletna odpowiedź. –

+0

To mi pomogło, dzięki. Tylko ze względu na kompletność: to ':' musi być '='. –

+0

@ Chips_100: Naprawiono. Thx za wskazanie! :) – Mrchief

7

Można użyć $.ajax dostać skrypt zamiast dołączania tagu skrypt

$.ajax({ 
    url: "http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js", 
    dataType: "script", 
    cache: true,//This will decide whether to cache it or no so that it will not add the timestamp along with the request 
    success: function(){}//In the success handler you can write your code which uses resources from this js file ensuring the script has loaded successfully before using it 
}); 
+1

Myślę, że miałeś na myśli 'true', a nie' ture' na 'cache'. – OverZealous

+2

Tak @OverZealous, zredagowałem to dzięki. – ShankarSangoli

+0

Twoje rozwiązanie było dokładnie tym, czego potrzebowałem, ale nie oznaczyłem go jako odpowiedź, ponieważ nadal chciałbym wiedzieć, czy istnieje sposób naprawienia pierwotnego problemu. W tym konkretnym przypadku chciałem załadować skrypt, ale co by było, gdybym ładował HTML z żądania ajaxowego, które zawiera skrypt? Nadal chciałbym, aby użyć pamięci podręcznej. –

4

Oto coś, co działa na mnie

// Backup the jquery ajax cache setting 
var jQueryAjaxSettingsCache = jQuery.ajaxSettings.cache; 

// Disable the ?_=TIMESTAMP addition 
jQuery.ajaxSettings.cache = true; 

// Do the cached script inserting ... 
$("head").append('<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.15/jquery-ui.min.js"></scr' + 'ipt>'); 

// Restore the jquery ajax cache setting 
jQuery.ajaxSettings.cache = jQueryAjaxSettingsCache; 
+0

To wydaje się działać, dziękuję. –

Powiązane problemy