JQuery的 - 储存Ajax响应为全局变量
题
我还在上有所jQuery和ajax的场景一个新手,但我有一个$就请求,进行GET来获取一些XML文件(〜6KB或更少),但在这段时间里,用户花费在该网页上XML内容不应该/不会改变(这种设计我无法改变,我也用不上,因为我从别的地方读书就可以改变其XML文件)。因此,我有我的响应数据存储到一个全局变量,以及对数据的任何后续看UPS是在这个变量这样做多个请求不需要进行。
鉴于XML文件可以增加,林不知道这是最好的做法,也从Java背景的我对全球公共变量的想法通常是一个没有没有。
所以我的问题是,是否有可能是一个更好的方式来做到这一点,是否如果文件扩展出一些可笑的文件的大小这将导致内存问题一个问题吗?
我的数字数据可以传递到XML对象内部的一些的getter / setter类型的功能,这将解决我全球公共变量问题,但还是引起了我是否应该存储对象本身内部响应的问题。
例如,我目前做的是:
// 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');
解决方案
有没有办法解决它,除了储存。内存分页应该减少潜在的问题存在。
我会建议,而不是用一种叫做“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
请求。
您不必做任何这一点。我遇到了我的项目同样的问题。你要做的就是让上成功回调中的函数调用来重置全局变量。只要你有异步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;
}
希望这有助于你。
您可能会发现更容易存储的响应值在DOM元素,因为它们是全球访问:
<input type="hidden" id="your-hidden-control" value="replace-me" />
<script>
$.getJSON( '/uri/', function( data ) {
$('#your-hidden-control').val( data );
} );
</script>
这具有不需要对异步设置为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;
}
跑进这一点。答案很多,但只有一个简单正确的,我要去提供。最关键的是让你的$就call..sync!
$.ajax({
async: false, ...
我真的在努力与获得的jQuery AJAX的成果转化为我的变量在事件“的document.ready”阶段。
在用户的页面已加载后触发一个选择框的“的onchange”事件jQuery的阿贾克斯将加载到我的变量,但数据不会喂变量第一次加载页面时。
我试过很多,很多,很多不同的方法,但最终,它是查尔斯·吉尔伯特的方法,它的工作最适合我。
脱帽向查尔斯吉尔伯特!用他的回答,我能够将数据放入我的变量,甚至当我第一次加载页面。
这里的工作脚本的示例:
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");
IMO可以存储在全局变量此数据。但它会更好地使用一些比较独特的名称或使用命名空间:
MyCompany的= {};
...点击 MyCompany.cachedData =数据;
和也最好是使用JSON用于这些目的,JSON格式数据通常比在XML格式的相同数据小得多。
我建议从服务器获取大量的XML文件应该避免:变量“XML”应该使用像的缓存的,而不是作为数据存储本身
在大多数情况下,它可以检查高速缓存,看看是否需要对服务器的请求,以获得您想要的数据。这将使您的应用程序更轻,更快。
欢呼声,JRH。
。获得响应由默认缓存。因此,你真正需要做什么来得到想要的结果。
我知道线程是旧的,但我认为别人可能觉得这非常有用。根据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; 强>部分
类似于前面的答案:
<script type="text/javascript">
var wait = false;
$(function(){
console.log('Loaded...');
loadPost(5);
});
$(window).scroll(function(){
if($(window).scrollTop() >= $(document).height() - $(window).height()-100){
// Get last item
var last = $('.post_id:last-of-type').val();
loadPost(1,last);
}
});
function loadPost(qty,offset){
if(wait !== true){
wait = true;
var data = {
items:qty,
oset:offset
}
$.ajax({
url:"api.php",
type:"POST",
dataType:"json",
data:data,
success:function(data){
//var d = JSON.parse(data);
console.log(data);
$.each(data.content, function(index, value){
$('#content').append('<input class="post_id" type="hidden" value="'+value.id+'">')
$('#content').append('<h2>'+value.id+'</h2>');
$('#content').append(value.content+'<hr>');
$('#content').append('<h3>'+value.date+'</h3>');
});
wait = false;
}
});
}
}
</script>