JQuery-хранение ответа ajax в глобальной переменной
Я все еще немного новичок в jQuery и сцене ajax, но у меня есть $.ajax-запрос, выполняющий GET для получения некоторых XML-файлов (~6KB или меньше), однако в течение времени, которое пользователь тратит на эту страницу, содержимое XML не должно / не изменится (этот дизайн я не могу изменить, у меня также нет доступа к изменению XML-файла, поскольку я читаю его откуда-то еще). Поэтому у меня есть глобальная переменная, в которую я храню данные ответа, и любые последующие поиски данных сделано на этой переменной, поэтому несколько запросов не нужно делать.
учитывая тот факт, что XML-файл может увеличиваться, я не уверен, что это лучшая практика, а также исходя из фона java мои мысли о глобальных публичных переменных, как правило, нет-нет.
Итак, у меня есть вопрос, Может ли быть лучший способ сделать это, и вопрос о том, вызывает ли это какие-либо проблемы с памятью, если файл расширяется до какого-то смешного размера файла?
Я рис. данные могут быть переданы в некоторые функции типа getter / setter внутри объекта xml, что решит мои проблемы с глобальными общедоступными переменными, но все же поднимает вопрос о том, следует ли хранить ответ внутри самого объекта.
например, то, что я сейчас делаю:
// top of code
var xml;
// get the file
$.ajax({
type: "GET",
url: "test.xml",
dataType: "xml",
success : function(data) {
xml = data;
}
});
// at a later stage do something with the 'xml' object
var foo = $(xml).find('something').attr('somethingElse');
14 ответов:
нет никакого пути обойти это, кроме как хранить его. Подкачка памяти должна уменьшить потенциальные проблемы там.
Я бы предложил вместо использования глобальной переменной под названием 'xml', сделать что-то вроде этого:
var dataStore = (function(){ var xml; $.ajax({ type: "GET", url: "test.xml", dataType: "xml", success : function(data) { xml = data; } }); return {getXml : function() { if (xml) return xml; // else show some error that it isn't loaded yet; }}; })();
затем получить к нему доступ с помощью:
$(dataStore.getXml()).find('something').attr('somethingElse');
вот функция, которая делает эту работу довольно хорошо. Я не мог получить лучший ответ выше, чтобы работать.
jQuery.extend({ getValues: function(url) { var result = null; $.ajax({ url: url, type: 'get', dataType: 'xml', async: false, success: function(data) { result = data; } }); return result; } });
затем, чтобы получить к нему доступ, создайте переменную следующим образом:
var results = $.getValues("url string");
это сработало для меня:
var jqxhr = $.ajax({ type: 'POST', url: "processMe.php", data: queryParams, dataType: 'html', context: document.body, global: false, async:false, success: function(data) { return data; } }).responseText; alert(jqxhr); // or... return jqxhr;
важно:
global: false
,async:false
и наконецresponseText
прикован к$.ajax
запрос.
вы не должны делать ничего из этого. Я столкнулся с той же проблемой с моим проектом. то, что вы делаете, - это вызов функции внутри обратного вызова on success для сброса глобальной переменной. Пока вы установили асинхронный javascript в false, он будет работать правильно. Вот мой код. Надеюсь, это поможет.
var exists; //function to call inside ajax callback function set_exists(x){ exists = x; } $.ajax({ url: "check_entity_name.php", type: "POST", async: false, // set to false so order of operations is correct data: {entity_name : entity}, success: function(data){ if(data == true){ set_exists(true); } else{ set_exists(false); } } }); if(exists == true){ return true; } else{ return false; }
надеюсь, что это поможет вам .
ваша проблема может быть не связана с какой-либо локальной или глобальной областью, если на то пошло, просто задержка сервера между выполнением функции "успех" и временем, когда вы пытаетесь извлечь данные из своей переменной.
скорее всего, вы пытаетесь распечатать содержимое переменной до срабатывания функции ajax "success".
возможно, Вам будет проще хранить значения ответа в элементе DOM, поскольку они доступны глобально:
<input type="hidden" id="your-hidden-control" value="replace-me" /> <script> $.getJSON( '/uri/', function( data ) { $('#your-hidden-control').val( data ); } ); </script>
это имеет то преимущество, что не нужно устанавливать async в false. Очевидно, что это уместно зависит от того, чего вы пытаетесь достичь.
function getJson(url) { return JSON.parse($.ajax({ type: 'GET', url: url, dataType: 'json', global: false, async: false, success: function (data) { return data; } }).responseText); } var myJsonObj = getJson('/api/current');
это работает!!!
function get(a){ bodyContent = $.ajax({ url: "/rpc.php", global: false, type: "POST", data: a, dataType: "html", async:false } ).responseText; return bodyContent; }
Я действительно боролся с получением результатов jQuery ajax в мои переменные в " документе.готовый " этап мероприятий.
ajax jQuery загружается в мои переменные, когда пользователь запускает событие "onchange" в поле выбора после того, как страница уже загружена, но данные не будут подавать переменные при первой загрузке страницы.
снимаю шляпу перед Чарльзом Гильбертом! Используя его ответ, я могу получить данные в свои переменные, даже когда моя страница загружается впервые.
вот пример работы скрипта:
jQuery.extend ( { getValues: function(url) { var result = null; $.ajax( { url: url, type: 'get', dataType: 'html', async: false, cache: false, success: function(data) { result = data; } } ); return result; } } ); // Option List 1, when "Cats" is selected elsewhere optList1_Cats += $.getValues("/MyData.aspx?iListNum=1&sVal=cats"); // Option List 1, when "Dogs" is selected elsewhere optList1_Dogs += $.getValues("/MyData.aspx?iListNum=1&sVal=dogs"); // Option List 2, when "Cats" is selected elsewhere optList2_Cats += $.getValues("/MyData.aspx?iListNum=2&sVal=cats"); // Option List 2, when "Dogs" is selected elsewhere optList2_Dogs += $.getValues("/MyData.aspx?iListNum=2&sVal=dogs");
тоже столкнулся с этим. Много ответов, но только один простой правильный, который я собираюсь предоставить. Ключ в том, чтобы сделать ваш $.AJAX-вызов..синхронизация!
$.ajax({ async: false, ...
IMO вы можете хранить эти данные в глобальной переменной. Но лучше будет использовать какое-то более уникальное имя или использовать пространство имен:
Название_компании = {};
...
Название_компании.cachedData = данные;а также лучше использовать json для этих целей, данные в формате json обычно намного меньше, чем те же данные в формате xml.
Я бы предложил избегать извлечения больших XML-файлов с сервера: переменная " xml " должна использоваться как кэш, а не как само хранилище данных.
в большинстве сценариев можно проверить кэш и посмотреть, нужно ли сделать запрос на сервер, чтобы получить данные, которые вы хотите. Это сделает ваше приложение легче и быстрее.
ура, экспертную.
.получить ответы кэшируются по умолчанию. Поэтому вам действительно ничего не нужно делать, чтобы получить желаемые результаты.
Я знаю, что нить старое, но я думал, что кто-то может найти это полезным. По данным jquey.com
var bodyContent = $.ajax({ url: "script.php", global: false, type: "POST", data: "name=value", dataType: "html", async:false, success: function(msg){ alert(msg); } }).responseText;
позволит получить результат в строку напрямую. Обратите внимание на .responseText; часть.