使用Javascript/JQuery访问从外部XML文件构建的数组

使用Javascript/JQuery访问从外部XML文件构建的数组,javascript,jquery,xml,ajax,arrays,Javascript,Jquery,Xml,Ajax,Arrays,我希望这不是一个太多的新问题,但我已经有一段时间了,所以我想我会让步,在这里征求我的第一条建议 我试图使用javascript/jQuery/ajax读取一个外部xml文件,并将检索到的数据放入一个数组中,以便以后可以引用它 到目前为止,我似乎在做所有事情,直到我将数据放入数组为止,但是我很难在创建数据的函数内部以外的任何地方读取数据。为什么我不能从该函数以外的任何位置访问阵列 这是我的密码。。。 请帮忙 $.ajax({ type: "GET", url: "data.xml"

我希望这不是一个太多的新问题,但我已经有一段时间了,所以我想我会让步,在这里征求我的第一条建议

我试图使用javascript/jQuery/ajax读取一个外部xml文件,并将检索到的数据放入一个数组中,以便以后可以引用它

到目前为止,我似乎在做所有事情,直到我将数据放入数组为止,但是我很难在创建数据的函数内部以外的任何地方读取数据。为什么我不能从该函数以外的任何位置访问阵列

这是我的密码。。。 请帮忙

$.ajax({
    type: "GET",
    url: "data.xml",
    dataType: "xml",
    success: do_xmlParser
});

function do_xmlParser(xml)
{
    var myArray = new Array();

    $(xml).find("tag").each(function ()
    {
        myArray.push($(this).find("innerTag").text());
    });

    console.log("inside "+myArray); // This outputs the array I am expecting

    return myArray; // is this right???
}
console.log("outside: "+myArray); // This does NOT output the array but instead I get "myArray is not defined"

仔细看,你会发现。实际上,您正在发射一个不存在的阵列。您已经在函数中声明了myArray。试试这样做

console.lod("outside :"+do_xmlParser(xml)); // I think that when you merge a string and an array it will output only string, but I can be wrong.

您将
doxmlparser
定义为对异步函数的回调(jqueryajax调用的
success
)。在ajax调用成功后,您希望发生的任何事情都必须发生在该回调函数中,或者您必须从成功回调中链接函数

按照现在的方式,代码的实际执行将是:

ajax -> file being requested -> console.log -> 
        file transfer done -> success handler
如果您正在做一些关键的事情,并且希望调用是同步的,那么您可以提供
async:false

设置为ajax调用。然后,您应该能够执行以下操作:

var myArray = [],
do_xmlParser = function (xml)
{
    $(xml).find("tag").each(function ()
    {
        myArray.push($(this).find("innerTag").text());
    });
};

$.ajax({
    type: "GET",
    url: "data.xml",
    dataType: "xml",
    success: do_xmlParser,
    async: false
});

console.log("outside: " + myArray);
但是,
async
选项不适用于跨域请求


我不建议这样做。AJAX调用应该是异步的,我总是使用
success
回调对返回的数据执行所有处理

编辑:


还有,如果你喜欢阅读。。。我建议使用and(由David Flanagan编写)。

那么我应该在哪里声明数组,以便能够在函数中添加到数组中,然后稍后从中读取?实际上。这不可能是正确的,因为在函数中,我得到了后跟数组内容的字符串。像这样:“里面:4,5,4,3,4,5,4,4,3”等等…太棒了!!真不敢相信这么小的变化就治好了这个头痛!顺便说一句,(很抱歉偏离了一个稍微不同的观点,但是)这样做有什么风险,或者只是出于个人喜好,而您不这么做?AJAX应该使所有内容都异步或无阻塞。通过强制同步请求,页面上的所有其他脚本都将被阻止,即在完成之前不会运行。如果在DOM准备就绪时运行此命令,甚至可能会导致图像在完成加载之前等待此代码完成。如果xml文件很大,或者需要很长时间才能完成传输,则可能会看到关于无响应脚本的错误(取决于浏览器)。至少,我会把这段代码放在dom就绪回调的末尾。谢谢。我现在累了,要睡觉了,但我会看看明天是否能在考虑到这一点的情况下重写代码。你有什么建议可以让我写得更好吗?或者我应该一起远离“xml到数组”的想法吗?(这也许可以解释为什么在搜索谷歌时,似乎完全没有关于该方法的教程!)例如,请查看我编写的地震跟踪器的源代码:您将看到所有需要从xml加载数据的操作都是通过成功回调来执行的(例如,在该处理程序中,我调用
addMarker
)。