我是一个js / jquery noob并且一直在努力让匿名函数作为常规函数工作。有人能指出我做错了什么吗?
以下是我花了几个小时的时间:
var tracklist = new Array();
function stuffXML(xml) {
$(xml).find('track').each(function(){
var logo = $(this).find('logo').text();
var location = $(this).find('location').text();
var id = $(this).find('identifier').text();
var info = $(this).find('info').text();
var title = $(this).find('title').text();
var creator = $(this).find('creator').text();
tracklist.push(logo,location,id,info,title,creator);
});
console.log('mid' + tracklist); //works here
}
$(document).ready(function(){
$.ajax({
type: "GET",
url: "real.xml",
dataType: "xml",
success: stuffXML
});
console.log(tracklist); //but not here - empty array
});
我正在尝试将列表(一组图像和幻灯片的文本)解析成一个数组(在那里成功),然后让它们可用,但我的范围显然太局限了。我看不出我做错了什么...
任何帮助将不胜感激......
答案 0 :(得分:2)
那里的数组是空的,因为该代码在DOM准备好后立即运行,但在XHR完成后不一定(并且极不可能)。
为了能够使用tracklist
,您需要在stuffXML()
函数内或在堆栈跟踪具有stuffXML()
祖先的另一个函数中引用它。
答案 1 :(得分:2)
你的问题只是你忘记了AJAX中的A代表什么。异步。当您运行
命令时$.ajax({
type: "GET",
url: "real.xml",
dataType: "xml",
success: stuffXML
});
它会毫不犹豫地立即运行它,并立即使用您的console.log跟踪 。在后台,浏览器正忙于请求数据,然后将其添加到tracklist变量中。所以,你想要做的是将那个console.log放在stuffXML中。当然,您可能希望执行除console.log之外的其他操作。因此,让'stuffXML'触发您需要触发的任何其他事件,以使其余代码执行它需要执行的操作。请记住,Web服务器不会更快地向您的页面提供请求,而不是javascript将要执行下一行代码。
答案 2 :(得分:1)
当您在文档就绪函数中调用console.log()
时,Ajax请求不太可能完成:回调发生在Ajax请求结束时;文件就绪呼叫将在请求发出后立即发生。