【问题标题】:Using Javascript / JQuery to access an array built from an external XML file使用 Javascript/JQuery 访问从外部 XML 文件构建的数组
【发布时间】:2011-11-05 06:52:48
【问题描述】:

我希望这不是一个太新的问题,但我已经把头发拉出来有一段时间了,所以我想我会屈服并在这里寻求我的第一条建议。

我正在尝试使用 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"

【问题讨论】:

    标签: javascript jquery xml ajax arrays


    【解决方案1】:

    您将do_xmlParser 定义为异步函数的回调(jquery ajax 调用的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 回调来对返回的数据执行所有处理。

    编辑:

    另外,如果您喜欢阅读...我会推荐 jQuery Pocket ReferenceJavaScript: The Definitive Guide(均由 David Flanagan 撰写)。

    【讨论】:

    • 太棒了!我不敢相信这么小的变化解决了这个头痛!顺便说一句,(很抱歉跑题了一点,但是)这样做有什么风险,或者只是出于个人喜好而不这样做?
    • AJAX 应该使一切异步或非阻塞。通过强制请求同步,页面上的所有其他脚本将被阻塞,即在完成之前不会运行。如果你在 DOM 准备好时运行它,它甚至可能导致图像在完成加载之前等到这段代码完成。如果您的 xml 文件很大,或者需要很长时间才能完成传输,您可能会看到关于无响应脚本的错误(取决于您的浏览器)。至少,我会把这段代码放在你的 dom 就绪回调的末尾。
    • 谢谢。我累了,现在要睡觉了,明天看看能不能重写代码
    • 考虑到这一点。你对我如何写得更好有什么建议吗?还是我应该完全摆脱“xml 到数组”的想法? (这可以解释为什么在搜索 Google 时似乎完全没有关于该方法的教程!)
    • 例如,查看我写的地震跟踪器的源代码:github.com/jimschubert/quaketracker/blob/master/src/js/… 你会看到所有需要从 xml 加载数据的操作都由成功回调执行(例如,在该处理程序中,我打电话给addMarker)。
    【解决方案2】:

    仔细看,你会看到。您实际上正在启动一个不存在的数组。您已经在函数内部声明了 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.
    

    【讨论】:

    • 那么我应该在哪里声明 Array 以便能够在函数中添加到它,然后再从中读取呢?
    • 其实。这不可能是正确的,因为在函数内部我得到了字符串后跟数组内容。像这样:“内部:4、5、4、3、4、5、4、4、3”等......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2011-02-25
    • 2018-11-09
    • 2018-03-13
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多