You need to enable JavaScript to run this app. 如何使用jQuery实现类似Facebook无需等待加载新内容的信息流
优惠活动
大模型
产品
解决方案
定价
更多

如何使用jQuery实现类似Facebook无需等待加载新内容的信息流

问题根因

你当前代码的阻塞问题完全来自await关键字:$.ajax本身默认是异步非阻塞的,加了await之后会强制阻塞$(document).ready的执行线程,直到请求完全返回、success逻辑执行完才会释放主线程,期间用户的所有点击、滚动操作都会无响应。

解决方法

1. 去掉await恢复异步执行

直接删除await即可让AJAX请求在后台独立运行,不会阻塞页面正常交互,数据返回后自动执行success回调更新DOM即可,修改后代码如下:

$(document).ready(function () {
    $.ajax({
        url: url,
        type: "GET",
        contentType: false,
        cache: false,
        processData: false,
        success: function (res) {
            // 原有DOM更新逻辑
        }
    });
    // 此处的其他初始化逻辑会直接执行,不需要等待AJAX返回
});

2. 优化DOM更新避免二次阻塞

就算请求不阻塞,1000条带图片的内容一次性插入DOM也会触发大量重绘重排导致页面卡顿,建议做分片插入:

success: function (res) {
    const allData = JSON.parse(res); // 按实际返回格式解析数据
    const container = document.querySelector('#内容容器的ID');
    const chunkSize = 20; // 每次插入20条,可自行调整
    let index = 0;

    function insertNextChunk() {
        if (index >= allData.length) return;
        // 用文档碎片减少DOM操作次数
        const fragment = document.createDocumentFragment();
        const end = Math.min(index + chunkSize, allData.length);
        for (let i = index; i < end; i++) {
            const item = allData[i];
            const itemNode = document.createElement('div');
            // 生成单条内容结构,图片加lazy属性懒加载
            itemNode.innerHTML = `<div class="item">
                <p>${item.text}</p>
                <img src="${item.img_src}" loading="lazy" alt="内容图">
            </div>`;
            fragment.appendChild(itemNode);
        }
        container.appendChild(fragment);
        index = end;
        // 下一帧再执行下一批插入,不阻塞主线程交互
        requestAnimationFrame(insertNextChunk);
    }
    insertNextChunk();
}

3. 额外优化建议

  • 后端可以拆分成分页接口,首次只拉前20条展示,剩余内容后台分批拉取或者滚动到对应位置再拉,进一步降低初始加载压力
  • 图片尽量提前做压缩、切不同尺寸的适配图,减少图片加载时的资源占用

内容的提问来源于stack exchange,提问作者Tushar Sureka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 10:06:04