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

为何我的JavaScript代码导致网页卡顿?新手技术求助

解决网页冻结与性能问题的思路

嘿,作为JS新手遇到这种问题很正常,咱们一步步拆解下你的问题:

先排查内存泄漏的可能原因

你的网页20秒后变慢冻结,大概率和轮询方式、DOM操作不当有关,先从这两点入手:

1. setInterval 导致的请求堆积

setInterval 是不管前一次请求有没有完成,到点就发起新请求。如果网络偶尔延迟(哪怕几毫秒),5秒内前一次请求还没返回,新请求又发出去了,久而久之就会有一堆pending的请求和排队执行的回调函数,内存占用直接飙升,浏览器自然变慢。

解决办法:把setInterval换成递归的setTimeout,只有当前一次请求完成(成功/失败),再发起下一次请求,避免堆积:

function refreshInplayData() {
  $.getJSON("/Assets/inplay.json", function(data) {
    // 注意:$.getJSON已经自动帮你解析JSON了,不用再调用JSON.parse(data)!这步多余还可能浪费资源
    const j_data = data;
    const Curr = [];
    
    // 这里是你的DOM操作逻辑,重点注意:
    // 👉 一定要先清理旧的DOM节点,比如用.empty()清空容器再添加新内容,而不是一直append
    // 示例:假设你要更新id为"inplay-container"的元素
    const $container = $("#inplay-container");
    $container.empty(); // 先清空旧内容,避免DOM节点越积越多
    
    // 然后执行你的新内容插入逻辑
    // ...你的代码...
    
    // 当前请求+DOM操作完成后,再设置下一次刷新
    setTimeout(refreshInplayData, 5000);
  }).fail(function() {
    // 请求失败也要继续轮询,避免中断
    setTimeout(refreshInplayData, 5000);
  });
}

// 启动第一次刷新
refreshInplayData();

2. DOM操作引发的内存泄漏

如果每次刷新你都是往页面里追加元素而不是替换,DOM节点会越来越多,浏览器需要渲染的元素暴增,不仅内存占用高,样式渲染也会出问题(比如旧节点的样式干扰新节点,或者浏览器渲染队列过载)。

优化点:

  • 用.html(newContent)直接替换容器内容,或者先.empty()再追加新元素
  • 如果需要给元素绑定事件,用事件委托(比如把事件绑定在父容器上,而不是每次给新节点单独绑定),避免事件监听堆积:
    // 事件委托示例:给父容器绑定点击事件,监听子元素
    $("#inplay-container").on("click", ".item", function() {
      // 处理点击逻辑
    });
    

关于服务器主动推送的建议

如果你的JSON数据不是每5秒都会变化,轮询其实是在浪费资源。这种情况下,服务器主动推送确实是更好的方案:

  • SSE(Server-Sent Events):适合单向推送(服务器→客户端),实现起来比WebSocket简单,不需要额外的库,原生JS就能支持
  • WebSocket:适合双向通信,如果你的场景需要客户端给服务器发消息,或者实时性要求极高,可以用它

先把轮询的问题解决,网页不冻结了,再考虑切换到服务器推送来进一步优化性能。

内容的提问来源于stack exchange,提问作者Chris Harrod

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:23:51