Добавляется _=TIMESTAMP или подгрузка скриптов (script) ajax-ом в JQuery

При использовании ajax-запроса приходилось наблюдать ситуацию, когда вместе с текстовым контентом подгружаются и скрипты (т.е. грузится не только код вроде <div class=…></div>, но и тэги <script ..>

Всё бы ничего, но при вставке данных, к примеру функцией  .html(content) скрипты (тэг script), если они были получены ajax-ом в виде JSON (последний параметр в JQuery функциях, работающих с .ajax)  полученный с сервера результат преобразуется в библиотеке Jquery, приводя к повторной загрузке javascript. Даже если он ранее был загружен и закэширован.

В частности, речь о функции dataFilter,
Function( String data, String type ) которая в зависимости от значения type (см dataType) преобразует данные.

dataFilter callback option is invoked immediately upon successful receipt of response data. It receives the returned data and the value of dataType, and must return the (possibly altered) data to pass on to success.

Если при запросе указан тип данных json/jsonp - к атрибуту src скрипта добавляется переменная _ (нижнее подчёркивание) со значением равным текущему времени Timestamp, если не задано кэширование.

“json”: Evaluates the response as JSON and returns a JavaScript object. The JSON data is parsed in a strict manner; any malformed JSON is rejected and a parse error is thrown. As of jQuery 1.9, an empty response is also rejected; the server should return a response of null or {} instead. (See json.org for more information on proper JSON formatting.)

“jsonp”: Loads in a JSON block using JSONP. Adds an extra “?callback=?” to the end of your URL to specify the callback. Disables caching by appending a query string parameter, “_=[TIMESTAMP]”, to the URL unless the cache option is set to true.

Чтобы избежать повторной загрузки скриптов можно задав ajaxSettings, если переопределить dataFilter, либо указать cache=true примерно так:
$.ajaxSetup({
global: true,
dataFilter: function(data,type) { return data;},
cache:true
});

Конечно, гораздо лучше не использовать тэг script с атрибутом src (да и inline-скрипт тоже желательно вынести в основной контент) в подгружаемом содержимом.

http://api.jquery.com/jQuery.ajax/

Метки:

Автор будет признателен, если Вы поделитесь ссылкой на статью, которая Вам помогла:
BB-код (для вставки на форум)

html-код (для вставки в ЖЖ, WP, blogger и на страницы сайта)

ссылка (для отправки по почте)

Добавить комментарий