Подтвердить что ты не робот

Добавление script на страницу динамически с помощью jQuery никогда не использует кешированный файл

Я использую jQuery для динамического добавления script на мою страницу, и он работает, но jQuery добавляет "_ = TIMESTAMP" к URL-адресу, заставляя браузер никогда не использовать кеш. Со следующим кодом:

<!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>

Я вижу в firebug, что запрошенный URL:

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

Кто-нибудь знает, как сказать jQuery не делать этого?

Спасибо

4b9b3361

Ответ 1

Чтобы ответить на ваш исходный вопрос, вы видите временную метку, добавленную, поскольку jQuery по умолчанию устанавливает cache: false для script и jsonp вызовов который добавляет метку времени к URL-адресу.

Чтобы избежать отметки времени, вы можете сделать это:

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

Это устанавливает глобальный prefilter для всех вызовов $.ajax, включая те, которые выполняются jQuery при запросе script.

Мы проверяем dataType, чтобы убедиться, что мы не пытаемся атаковать другие вызовы ajax и явно устанавливаем cache на true. Это позволит избежать проблемы с добавлением метки времени.

Теперь вы можете использовать свой исходный код, и он выберет его из кеша.

Ответ 2

Вы можете использовать $.ajax, чтобы получить script вместо добавления тега script

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

Ответ 3

Вот что-то, что работает для меня

// 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;