Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax jQuery——作为一个单词打印的变量字符串_Ajax_Jquery - Fatal编程技术网

Ajax jQuery——作为一个单词打印的变量字符串

Ajax jQuery——作为一个单词打印的变量字符串,ajax,jquery,Ajax,Jquery,我正在编写一些jquery,它将获取一组xml文件。然后,它将循环遍历这些内容并解析它们,以便在页面上显示它们。我有这个工作,但有一件事我想做的,如果在它列出的内容,我希望它打印的文件名。这是我的密码 $.get('inc/getMenuFiles.php', function(data) { var catSplit = data.split(","); var menuitems = $('.menuitems'); menuitems.empty(); f

我正在编写一些jquery,它将获取一组xml文件。然后,它将循环遍历这些内容并解析它们,以便在页面上显示它们。我有这个工作,但有一件事我想做的,如果在它列出的内容,我希望它打印的文件名。这是我的密码

$.get('inc/getMenuFiles.php', function(data) {
    var catSplit = data.split(",");
    var menuitems = $('.menuitems');
    menuitems.empty();

    for (i=2; i<catSplit.length; i++) {

        url = "inc/menulists/" +catSplit[i].replace(/"/g, '').replace(/]/g, '');
        catName = catSplit[i].replace(/"/g, '').replace(/.xml/g, '').replace(/]/g, '');

        menuitems.append(catName);

        $.ajax({
            type: "GET",
            url: url,
            dataType: "xml",
            success: function(xml) {
                $(xml).find('item').each(function(){
                    var name =  $(this).find('name').text();
                    var price = $(this).find('price').text();
                    menuitems.append(name + " - $" +price + "<br />");
                });
            }
        });
    }
});
$.get('inc/getMenuFiles.php',函数(数据){
var catSplit=data.split(“,”);
变量menuitems=$('.menuitems');
menuitems.empty();

for(i=2;i发生这种情况是因为for循环比AJAX调用快。请记住AJAX中的第一个A代表异步。想象一下

您正处于for循环的开始。您获取第一个
catName
,并将其附加到
menuitems
。然后启动AJAX调用以获取
catName
中每个
项目的
名称和
价格。同时,AJAX请求尚未响应,因此我们将其移到第二个
catName
,启动另一个AJAX请求。第一个请求没有完成,我们刚刚启动了第二个请求;因此现在我们有两个AJAX响应等待处理。同时,我们继续第三个
catName

等等,等等

解决方案

  • 将内部AJAX调用中的属性设置为
    false
    。这将使for循环暂停,直到请求完成
  • **首选**在for循环之前进行AJAX调用,将响应存储在某个位置(可能是存储在一个数组中),然后使用此数组运行for循环

  • 发生这种情况的原因是,在当前执行路径完成之前,您的Ajax回调不会执行。要解决此问题,您可以等到Ajax回调内部追加catName。这应该可以:

    $.get('inc/getMenuFiles.php', function(data) {
        var catSplit = data.split(",");
        var menuitems = $('.menuitems');
        menuitems.empty();
    
        for (i=2; i<catSplit.length; i++) {
    
            url = "inc/menulists/" +catSplit[i].replace(/"/g, '').replace(/]/g, '');
            catName = catSplit[i].replace(/"/g, '').replace(/.xml/g, '').replace(/]/g, '');
    
            $.ajax({
                type: "GET",
                url: url,
                dataType: "xml",
                success: (function(catName){
                    return function(xml) {
                        menuitems.append(catName);
    
                        $(xml).find('item').each(function(){
                            var name =  $(this).find('name').text();
                            var price = $(this).find('price').text();
                            menuitems.append(name + " - $" +price + "<br />");
                        });
                    }
                })(catName)
            });
        }
    });
    
    $.get('inc/getMenuFiles.php',函数(数据){
    var catSplit=data.split(“,”);
    变量menuitems=$('.menuitems');
    menuitems.empty();
    
    对于(i=2;i您提到的文件名:它与
    catName
    有多大不同?您的问题是关于打印变量字符串,但您的要求是关于打印文件名。请澄清您的问题。基本上是menuitems.append(catName);正在工作,但它正在将所有文件名打印为一个字符串。下面是我所说内容的屏幕截图:@raina77ow-我只是删除了.xml并“从中删除,这就是变量所做的一切”你的意思是“在一行中”而不是字符串吗?我以为默认情况下async设置为true?我添加了它,但结果仍然相同。1)for循环的速度无关紧要。即使执行for循环需要10天时间,第一个请求的回调函数也不会执行,直到for循环完成。2)你的意思是将
    async
    设置为
    false
    ,这是一个非常糟糕的解决方案。这里演示了异步Javascript如何独立于for循环的速度:@这是半固定的。如果你删除了关于它发生的部分,因为for循环更快,并将其更改为类似以下内容的内容:for循环在第一个回调函数执行之前完成(即使AJAX请求已完成),我将删除我的否决票。@ascii lime,关于使用
    async:false
    是一个糟糕的解决方案,您可能是对的(这就是为什么我提供了另一种解决方案),但关于速度不是问题,您是错的。例如:
    $.get('inc/getMenuFiles.php', function(data) {
        var catSplit = data.split(",");
        var menuitems = $('.menuitems');
        menuitems.empty();
    
        for (i=2; i<catSplit.length; i++) {
    
            url = "inc/menulists/" +catSplit[i].replace(/"/g, '').replace(/]/g, '');
            catName = catSplit[i].replace(/"/g, '').replace(/.xml/g, '').replace(/]/g, '');
    
            $.ajax({
                type: "GET",
                url: url,
                dataType: "xml",
                success: (function(catName){
                    return function(xml) {
                        menuitems.append(catName);
    
                        $(xml).find('item').each(function(){
                            var name =  $(this).find('name').text();
                            var price = $(this).find('price').text();
                            menuitems.append(name + " - $" +price + "<br />");
                        });
                    }
                })(catName)
            });
        }
    });