Как мне прекратить jquery добавлять уникальный идентификатор в скрипты, вызываемые через ajax? - PullRequest
6 голосов
/ 08 октября 2009

Я использую ajax-функции jquery для захвата фрагмента страницы и отображения в разделе страницы - этот фрагмент включает html и ссылки на внешние js-файлы.

Ход программы выглядит следующим образом:

Вызовы главной страницы -> Фрагмент страницы, которая вызывает -> различные большие js-файлы с помощью тегов скрипта.

Я включил параметр кэширования при первом вызове ajax, чтобы страница кэширования кэшировалась (без уникальных идентификаторов, добавляемых к URL), однако при загрузке фрагмента создается впечатление, что jquery перезаписывает URL-адреса сценария, чтобы включить метка времени Unix, чтобы браузер каждый раз загружал новую копию скриптов. Сценарии, которые я вызываю, минимизированы на 250 Кбайт, и это действительно вредит пользовательскому интерфейсу, поскольку браузер блокируется при каждом вызове. Это желаемое поведение jquery? Есть ли способ отключить перезапись URL-адреса?

Большое спасибо за вашу помощь

Ответы [ 3 ]

11 голосов
/ 29 января 2013

Это решение менее взломано, чем решение Мердока:

$.ajaxPrefilter('script', function(options) {
    options.cache = true;
});

См. http://api.jquery.com/jQuery.ajaxPrefilter/

4 голосов
/ 09 октября 2009

Похоже, что функция evalScript в jQuerys вас не устраивает ...

Строка 543 из jQuery:

function evalScript( i, elem ) {
    if ( elem.src )
        jQuery.ajax({
            url: elem.src,
            async: false,
            dataType: "script"
        });

   else
        jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );

   if ( elem.parentNode )
       elem.parentNode.removeChild( elem );
}

Вот описание того, что происходит: JS на главной странице звонит:

$.ajax({
    url:"frag.htm",
    type:"GET",
    success:callBackFunction
})

и GETs frag.htm, который содержит что-то вроде этого:

<html><head><script src="test.js"></script></head><body>Content</body></html>

тогда вызывается ваша функция обратного вызова, которая, вероятно, выглядит следующим образом:

function callBackFunction(data){
    $("#ajaxContent").html(data); // <- this is the beginning of your problems...
}

Когда вызывается html (data) функция jQuery, она «очищает» HTML, удаляя любые теги скрипта, а затем вызывает evalScript для каждого из них. evalScript, как вы можете видеть, не указывает «cache: true», поэтому, когда он проходит через $ .ajax, кеш равен нулю. Когда кеш равен нулю, а dataType имеет значение «script», jQuery устанавливает cache = false.

Итак, чтобы обойти эту проблему, попробуйте следующее:

function callBackFunction(data){
    var tempAJAX = $.ajax; // save the original $.ajax
        $.ajax=function(s){ // wrap the old $.ajax so set cache to true...
            s.cache=true;
            tempAJAX(s); // call old $.ajax
        }
        $("#ajaxContent").html(data); // insert the HTML and download the <script>s
        $.ajax = tempAJAX; // reset $.ajax to the original.
    }
}

Прежде чем вставить новый HTML-код из «frag.htm» на главную страницу, мы перехватываем все вызовы $ .ajax, модифицируем объект, чтобы включить cache = true, а затем после загрузки сценария вставляем HTML.

Дайте мне знать, если у вас есть какие-либо вопросы.

0 голосов
/ 08 октября 2009
  1. Заставить веб-сервер обслуживать сценарий с датой истечения в будущем.

  2. Если вы используете dataType = "script" в качестве опции для jquery ajax, кэширование будет отключено по умолчанию, см. http://docs.jquery.com/Ajax/jQuery.ajax#options,, попробуйте вручную установить его в "html".

$.ajax({
  type: "GET",
  url: "test.js",
  dataType: "html" // if not set jquery will guess what type it is and disables caching when matching "script"
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...