JQuery – 将ajax响应存储到全局variables中

我仍然是jQuery和ajax场景的新手,但我有一个$ .ajax请求执行一个GET来检索一些XML文件(〜6KB或更less),但是在用户花费在该页面的XML内容应该不会/不会改变(这个devise我不能改变,我也没有改变XML文件,因为我正在从别的地方读取它)。 因此,我有一个全局variables,它将响应数据存储到数据中,并且对数据的任何后续查找都在这个variables上完成,因此不需要进行多个请求。

鉴于XML文件可以增加的事实,我不知道这是最好的做法,也来自java背景,我对全球公共variables的想法通常是一个禁忌。

所以我的问题是,是否有更好的方法来做到这一点,以及如果文件扩展到一些荒谬的文件大小是否会导致任何内存问题的问题?

我认为数据可以传递给xml对象中的一些getter / settertypes的函数,这将解决我的全局公共variables问题,但仍然提出了是否应该将响应存储在对象本身中的问题。

例如,我现在做的是:

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

除了存储外,没有办法。 内存分页可以减less潜在的问题。

我build议不要使用名为“xml”的全局variables,而应该更像这样:

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

然后访问它,像这样创buildvariables:

 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: falseasync:false ,最后responseText链接到$.ajax请求。

你不必这样做。 我遇到了与我的项目相同的问题。 你所做的是在成功callback中进行函数调用来重置全局variables。 只要你将asynchronousJavaScript设置为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; } 

希望这可以帮助你。

你的问题可能不会涉及任何本地或全球范围的事情,只是执行“成功”函数和你试图从variables中取出数据的时间之间的服务器延迟。

很可能你正试图在ajax“success”函数触发之前打印variables的内容。

您可能更容易将响应值存储在DOM元素中,因为它们可以在全局访问:

 <input type="hidden" id="your-hidden-control" value="replace-me" /> <script> $.getJSON( '/uri/', function( data ) { $('#your-hidden-control').val( data ); } ); </script> 

这具有不需要将asynchronous设置为假的优点。 显然,这是否合适取决于你想要达到的目标。

  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的结果放到我的variables的“document.ready”事件阶段。

jQuery的ajax会加载到我的variables,当用户在页面已经加载之后触发了一个select框的“onchange”事件,但是当页面第一次加载时,数据不会提供variables。

我尝试了很多很多不同的方法,但最终,查尔斯·吉尔伯特(Charles Guilbert)的方法最适合我。

帽子给查尔斯·吉尔伯特! 使用他的答案,我能够获得数据到我的variables,即使我的网页第一次加载。

这是一个工作脚本的例子:

  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, ... 

国际海事组织,你可以存储这个数据在全局变 但是使用更多的唯一名称或使用名称空间会更好:

MyCompany = {};


MyCompany.cachedData = data;

而且为了这些目的,最好使用json,json格式的数据通常比xml格式的数据小得多。

我build议应该避免从服务器中获取大的XML文件:variables“xml”应该像caching一样使用,而不是数据存储本身。

在大多数情况下,可以检查caching并查看是否需要向服务器请求获取所需的数据。 这将使您的应用更轻,更快。

欢呼声,jrh。

.get响应默认被caching。 所以你真的不需要做任何事情就可以得到想要的结果。

我知道线程已经老了,但是我想其他人可能会觉得这很有用。 根据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; 

将有助于直接得到结果的string。 注意.responseText; 部分。