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

如何在jQuery执行其他操作时显示loader.gif加载动画?

问题分析

浏览器的UI渲染与JavaScript执行共享主线程,同步代码会阻塞渲染流程。你的代码中,$('.loader').show()触发后立刻执行大量DOM隐藏操作,浏览器需等待所有同步代码执行完毕才会重绘页面,导致加载动画要等到列隐藏完成后才显示。

解决方案

方案1:将DOM延迟操作放入下一个事件循环

利用setTimeout把列隐藏逻辑放到下一个事件队列,让浏览器先完成加载动画的渲染,再执行后续操作:

$(".removeButton").eq(i).click(function() {
  $('.loader').show(); // 先触发加载动画显示

  // 延迟执行列隐藏逻辑,给浏览器留足渲染时间
  setTimeout(() => {
    let tbodyTrLength = $(".table-hideable tbody tr").length;
    
    for (let t = 0; t < tbodyTrLength; t++) {
      $(".table-hideable tbody tr").eq(t).find("td").eq(i).hide();
      $(".table-hideable thead tr:nth-child(2) th").eq(i).hide();
    }
    $(".footer-restore-columns").removeClass("d-none");
  }, 0);
});

方案2:优化DOM操作减少阻塞

你当前的循环存在重复DOM查询问题,会延长代码执行时间、加重阻塞。可以提前缓存目标节点,简化操作:

$(".removeButton").eq(i).click(function() {
  $('.loader').show();

  // 提前缓存所有需要隐藏的单元格,避免循环内重复查询DOM
  const targetTds = $(".table-hideable tbody tr td:nth-child(" + (i+1) + ")");
  const targetTh = $(".table-hideable thead tr:nth-child(2) th").eq(i);
  
  setTimeout(() => {
    targetTds.hide();
    targetTh.hide();
    $(".footer-restore-columns").removeClass("d-none");
  }, 0);
});

直接通过选择器匹配所有目标列的单元格,无需逐行遍历,代码更简洁且执行效率更高,能进一步缩短阻塞时长。

补充说明

  • setTimeout(..., 0)并非真的等待0毫秒,而是让回调函数进入下一个事件队列,确保当前同步代码执行完毕、浏览器完成渲染后再执行后续逻辑。
  • 若表格行数较多,优化DOM操作能显著降低用户感知到的延迟。

内容的提问来源于stack exchange,提问作者Shane S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:35:21