Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.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
jqueryeach/ajax在循环时不更新元素_Jquery_Ajax_Dom_Each - Fatal编程技术网

jqueryeach/ajax在循环时不更新元素

jqueryeach/ajax在循环时不更新元素,jquery,ajax,dom,each,Jquery,Ajax,Dom,Each,在从ajax调用中获取一些数据之后,我正在尝试更新一个列表。它是这样工作的 $.ajaxSetup({ async: false }); $.ajax(jsonUrl, { dataType: "json", success: function(data) { $.each(data.list, function(k,v) { addOutput("doing something with "+v);

在从ajax调用中获取一些数据之后,我正在尝试更新一个列表。它是这样工作的

$.ajaxSetup({
  async: false
});

$.ajax(jsonUrl, {
        dataType: "json",
        success: function(data) {
          $.each(data.list, function(k,v) {
            addOutput("doing something with "+v);
            (...)
          }
        },
        (...)
});

$.ajaxSetup({
  async: true
});
添加输出:

function addOutput(text, color) {
color = typeof color !== 'undefined' ? color : '#fff';

var date = new Date();
var h = ("0"+date.getHours()).slice(-2);
var m = ("0"+date.getMinutes()).slice(-2);
var s = ("0"+date.getSeconds()).slice(-2);

var li = "<li style='background-color: "+color+"; padding: 2px; pading-left: 3px;'>"+h+":"+m+":"+s+" - "+text+"</li>"
$("#output_list").prepend(li);
函数addOutput(文本、颜色){
颜色=颜色类型!=“未定义”?颜色:“#fff”;
变量日期=新日期();
var h=(“0”+date.getHours()).slice(-2);
var m=(“0”+date.getMinutes()).slice(-2);
var s=(“0”+date.getSeconds()).slice(-2);
var li=“
  • “+h+”:“+m+”:“+s+”-“+text+”
  • ” $(“#输出列表”)。前置字符(li);
    }

    addOutput(text)正在向输出控制台添加一个新的
  • 元素,但这就是我的问题所在。输出控制台不会立即更新,而是在jQuery.each完成后更新

    我在这里停止async是因为循环中有另一个ajax调用,根据列表发送一些请求,但我想这不是问题所在,因为我已经测试了没有它的输出。所以我认为它与jQuery.each有关


    更新:添加了addOutput

    您可能希望执行此操作

    $.ajax(jsonUrl, {
            dataType: "json",
            success: function(data) {
              $.each(data.list, function(k,v) {
                addOutput(v); // instead of text, you want to output v. k is index and v is the actual result element
              }
            },
            ...
    });
    

    例:

    
    var结果=[1,2,3,4,5,6,7,8,9];
    var指数=0;
    $。每个(结果、函数(){
    show();
    调试器;
    });
    函数show(){
    $('.add')。追加(“+index+”);
    指数+=1;
    }
    

    您将发现调试器在删除每个元素并将其添加到DOM中时停止。

    如果我没有错,则只有在请求具有完整响应时才会调用success,因此这不是问题,因此,如果您想在加载列表中留下印象,您可能必须使用waits for each.each执行一些代码

    为什么要禁用异步?这使得浏览器执行请求时不会让用户看到卡住的屏幕


    关于这一点,

    看不到此处设置的“text”变量在哪里
    async
    是一个可以通过
    .ajax()
    方法传递的选项,无需执行
    $。ajaxSetup()
    这只是一个示例,显示addOutput获取一些文本以在某些分区中显示为列表元素。类似于控制台窗口。元素添加得很好,但我的问题是,它们都在$之后立即显示,而不是在$之后。每个元素仍在运行。您是否找到解决方案?我现在面临着同样的问题。也许我应该更详细地解释我的问题。addOutput不是这里的问题。该函数正在向div窗口中添加元素,但不是在循环通过$。each时添加元素。它正在等待$。每个完成,然后添加所有元素,但这不是我想要的。我想让他们一个接一个地列出,而它仍然是循环。console.log输出工作正常。正在调用btwSuccess,我将进入该$。每个循环中,但在循环时未添加元素。console.log输出打印得很好。我禁用async是因为我想在该$中执行更多的请求。每个请求都可以让我一个接一个地看到发生了什么。我只是在为自己构建/测试一些后端选项,所以用户不会被卡住。哦,我有一些函数,可以在以后取消循环。
    <div class="add"></div>
    
    var result = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    var index = 0;
    
    $.each(result, function () {
        show();
        debugger;
    });
    
    function show() {
        $('.add').append("<h1>" + index + "</h1>");
        index += 1;
    }