jQuery версии 1.5 - ajax - проблема с временной меткой тега ‹script›

Если я загружаю некоторый контент с помощью ajax (jQuery), в котором есть тег скрипта, jQuery 1.5 добавляет метку времени к URL-адресу src тега скрипта. См. пример ниже.

Пример: контент, который я загружаю с помощью ajax:

<div>text1</div>
<script type="text/javascript" src="/js/abc-xyz.js?r=1.1"></script>

Это URL-адрес src, откуда он загружает код скрипта после того, как я вставляю предыдущий контент на страницу:

.../js/abc-xyz.js?r=1.1&_=1297892228466

Кто-нибудь знает, почему это происходит? Это происходит только с jQuery 1.5. Этого не происходит с jQuery 1.4.4.

Пример кода:

$.ajax({
    url: content.html,
    type: 'GET',
    data: someDataObject,
    success: function(data) {
        // some code here

    },
    error: function(data) {
        // some code here
    }
});

Спасибо.


person Norbert Tamas    schedule 16.02.2011    source источник
comment
Если бы мне пришлось рискнуть, я бы сказал, что он добавляет параметр get, чтобы предотвратить загрузку файла js из кеша. Не могу придумать никакой другой причины. Но это не должно нарушать никакой функциональности.   -  person Michael    schedule 17.02.2011
comment
Не могли бы вы показать свой Javascript?   -  person lonesomeday    schedule 17.02.2011
comment
Я добавил пример кода JavaScript.   -  person Norbert Tamas    schedule 17.02.2011


Ответы (2)


Ниже приведен ответ, который я получил от команды jQuery. Билет № 8298: http://bugs.jquery.com/ticket/8298.

Отвечать:

После проверки вашего отчета и ваших примеров кода я пришел к выводу, что это не ошибка. Я также сделал этот тестовый пример. не использовать значение по умолчанию false для запросов сценариев. Эта ошибка (см. #7578) была исправлена ​​в версии 1.5. Теперь вы можете знать или не знать, что jQuery специально обрабатывает теги script при выполнении манипуляций с DOM (для предотвращения определенных ошибок в IE). Он отфильтровывает их и запрашивает через ajax. Это объясняет, почему даже «обычный» тег встроенного скрипта внезапно запрашивается с дополнительными параметрами URL. Есть способы обойти это, если это имеет нежелательные побочные эффекты для вас.

  1. используйте $.ajaxSetup({ cache: true }), когда это уместно

  2. используйте предварительный фильтр для запросов сценариев и, например, проверьте URL-адреса, где вы не хотите добавлять случайный параметр, и установите cache: true в предварительном фильтре для тех

  3. в т.ч. успешный обратный вызов обрабатывает теги script самостоятельно, делая что-то вместе с ними.

..строки:

var elems = $(htmlwithscripttags);
elems.filter("script") //now do whatever with the scripts
elems.filter(":not(script)").appendTo("body"); //e.g.
person Norbert Tamas    schedule 17.02.2011
comment
2 у меня хорошо работает: $.ajaxPrefilter('script', function(options) { options.cache = true; }); - person Blaise; 29.01.2013

Майкл прав в своем комментарии, и если вы хотите отключить его, используйте: cache: true в запросе ajax. Чтобы включить, используйте cache: false (я считаю, что это значение по умолчанию).

Чтобы отключить отметку времени:

$.ajax({
    url: content.html,
    cache: true,
    type: 'GET',
    data: someDataObject,
    success: function(data) {
        // some code here

    },
    error: function(data) {
        // some code here
    }
});
person Shaz    schedule 16.02.2011
comment
Я знаю, как управлять кэшированием. Моя проблема в том, что метка времени добавляется к URL-адресу src сценария, который был загружен с помощью ajax. - person Norbert Tamas; 17.02.2011
comment
Эта проблема в нашем проекте на работе была вызвана тем, что $.ajaxSetup({cache:false}) был добавлен к подключаемому модулю, который вызывался. - person theblang; 15.02.2013
comment
Этот подход не самый лучший, поскольку $.ajaxSetup действителен для всех запросов. - person lmcarreiro; 18.11.2016