You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jQuery循环迭代中实时追加内容至元素的问题求助

解决AJAX循环中DOM更新不实时的问题

问题根源

你代码里用了async: false的同步AJAX请求,这会完全阻塞浏览器的主线程——包括负责页面渲染的线程。虽然每次循环都执行了append操作,但浏览器被同步请求占满了资源,根本没时间去更新DOM,只能等整个do/while循环跑完后,才会一次性处理所有渲染任务,这就是页面要等全部完成才显示进度的原因。

解决方案:改用异步AJAX+递归(或Promise链)

把同步请求改成异步,用递归的方式逐页处理,给浏览器留出渲染DOM的时间。

1. 改造AJAX函数为Promise风格

让get_page_of_products返回Promise,方便后续异步流程控制:

function get_page_of_products(pageToProcess) {
  return new Promise((resolve) => {
    jQuery.ajax({
      type: "POST",
      url: <?php echo json_encode(admin_url('admin-post.php')); ?>,
      data: "action=render_test&page=" + pageToProcess,
      dataType: 'json',
      // async默认就是true,可省略
      success: function(result) {
        resolve(result);
      }
    });
  });
}

2. 用async/await+递归实现逐页处理

用异步函数配合递归,每处理完一页就实时更新DOM,再继续下一页:

async function get_all_products(pageToProcess) {
  // 等待当前页请求完成
  const pageResult = await get_page_of_products(pageToProcess);
  const totalPages = pageResult.page_count;
  
  // 生成进度消息
  let updateMessage = `Page Processed = ${pageResult.page} of ${totalPages}.`;
  if (pageToProcess < totalPages) {
    updateMessage += ` Next page = ${pageResult.next_page}.`;
  }
  updateMessage += '<br />';
  
  // 实时更新控制台和页面DOM
  console.log(updateMessage);
  jQuery("#showResultsHere").append(updateMessage);
  
  // 递归处理下一页,直到所有页完成
  if (pageResult.next_page <= totalPages) {
    await get_all_products(pageResult.next_page);
  }
}

3. 调用方式不变

直接调用get_all_products(1)(假设从第1页开始)即可,现在页面会实时显示每一页的处理进度。

为什么之前移append到success没用?

哪怕把append放到同步AJAX的success回调里,同步请求还是会阻塞主线程——所有success回调都是在循环过程中同步执行的,但浏览器的渲染任务被排在了整个循环之后,DOM更新依然要等全部请求完成才会触发。只有改成异步请求,让主线程在两次请求之间有空隙处理渲染,才能实现实时更新。

内容的提问来源于stack exchange,提问作者Graphic Detail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:04:51