我正在尝试使用jquery和ajax从几个url中收集数据,然后从中创建内容。但是,我必须遗漏一些东西,因为它似乎不起作用。
我有这样的事情:
var html = "";
function loadByUrl(url) {
$.ajax({
url: url,
dataType: 'json',
async: false,
success: function(json) {
$.each(json.data.children, function(i,item){
if( someCondition ) {
$(item.data).appendTo("#content");
} else {
html += "<div>" + item.data + "</div>";
}
}
}
});
}
loadByUrl("http://fake1.com");
loadByUrl("http://fake2.com");
loadByUrl("http://fake3.com");
$(html).appendTo("#content");
基本上,如果满足某些条件,我会立即添加内容,否则我想在内容的末尾添加所有其他“已保存”的内容。
我正在尝试做什么?如果是这样,怎么样?
答案 0 :(得分:5)
新答案:
我会以不同的方式处理这个问题。而不是使用async: false
,这通常是不赞成的(它甚至在最新版本的jQuery中被弃用),我会使用$.when
来实现相同的效果。
// return a promise
function loadByUrl(url) {
return $.ajax({
url: url,
dataType: 'json'
});
}
// handle processing the data in a separate function
function processData(data) {
var result = '';
$.each(data.children, function(i,item){
if( someCondition ) {
$(item.data).appendTo("#content");
} else {
result += "<div>" + item.data + "</div>";
}
}
return result;
}
// use when to ensure all of the AJAX requests execute before
// doing anything with their results
$.when(loadByUrl("http://fake1.com"), loadByUrl("http://fake2.com"), loadByUrl("http://fake3.com")).done(function(fake1, fake2, fake3) {
// this function is called after all three AJAX promises are resolved
var html = '';
html += processData(fake1[0]);
html += processData(fake2[0]);
html += processData(fake3[0]);
$(html).appendTo("#content");
});
原始答案:
问题是$.ajax
是异步的。尝试替换此行:
html += "<div>" + item.data + "</div>";
有了这个:
$("<div>" + item.data + "</div>").appendTo("#content");
答案 1 :(得分:0)
您尝试将此内容附加到页面有两个位置。首先,有第10行:
$(item.data).appendTo("#content");
这应该可以正常工作,假设你按自己喜欢的方式写下自己喜欢的条件。第二位是最后一行:
$(html).appendTo("#content");
这将在加载内容之前触发,将空白的html字符串附加到文档。诀窍是理解AJAX请求和第二个附件立即执行,但是在服务器发回所请求的信息之前,success
函数将结果加载到变量html
中。 / p>
我对如何解决这个问题的答案取决于第9行中检查的条件类型。如果它可以通过事件监听器检测到,我会重写success
除了存储结果之外什么都不做在全局html
变量中,然后编写第二个事件侦听器,在满足条件时触发,将html
的内容附加到目标然后清除它。但是,如果使用事件监听器无法检测到该条件,我会将您的代码更改为以下内容:
var html = "";
function loadByUrl(url) {
$.ajax({
url: url,
dataType: 'json',
success: function(json) {
$.each(json.data.children, function(i,item){
html += "<div>" + item.data + "</div>";
if( someCondition ) {
$(html).appendTo("#content");
}
});
});
}
loadByUrl("http://fake1.com");
loadByUrl("http://fake2.com");
loadByUrl("http://fake3.com");
如果您想在加载完fake3.com
之后强行添加,请使用闭包执行以下操作:
var html = "";
function successFunction(force)
{
return function(json) {
$.each(json.data.children, function(i,item)
{
html += "<div>" + item.data + "</div>";
if (force || someCondition)
{
$(html).appendTo("#content");
}
});
};
}
function loadByUrl(url,force) {
$.ajax({
url: url,
dataType: 'json',
success: successFunction(force)});
}
loadByUrl("http://fake1.com",false);
loadByUrl("http://fake2.com",false);
loadByUrl("http://fake3.com",true); // true => force appension.
答案 2 :(得分:0)
如果它不是Nir指出的跨域调用,请尝试在您的ajax调用中使用“.done”并在那里的回调函数中进行追加。
有点像
$.ajax({
your call setup and call
}).done(function(data) {
console.log('Data:',data);
//your code to append the data
}
这可以使用“.done”,因为jQuery 1.5中$ .ajax()返回的jqXHR对象实现了Promise模式。您可以查看http://api.jquery.com/jQuery.ajax/
上的文档