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

jQuery中DOMContentLoaded后执行异步AJAX请求的正确方式

解决AJAX广告请求阻塞DOM渲染的问题

嘿,我来帮你理清这个问题!你想要的是让广告AJAX请求在页面DOM渲染完成后再发起,而且是低优先级不阻塞页面加载,但现在发现请求好像提前触发了,对吧?

首先得搞清楚为什么$.when()没起作用——你写$.when($.getJSON(...))的时候,$.getJSON()已经立刻发起请求了!$.when()只是用来监听这个请求的完成状态,然后执行后续的then()回调,它根本没改变请求发起的时机,这就是为什么你觉得请求还是提前跑了。

那怎么解决呢?给你两个靠谱的方案:

方案一:用setTimeout把请求放到事件队列末尾

把广告请求包裹在setTimeout里,哪怕延迟0毫秒也行。这会让浏览器先把当前的DOM渲染任务处理完,再去执行这个AJAX请求:

$(document).ready(function() {
    // 先处理你的其他DOM相关逻辑
    setTimeout(function() {
        $.getJSON("/cgi-bin/links/spots_load_new.cgi", { 
            catid: category_id, 
            linkid: link_id, 
            t: temp_set 
        }, function(results) { 
            showSpots(results); 
        });
    }, 0);
});

这里的0毫秒不是真的等0秒,而是告诉浏览器:“先把手里的渲染活干完,再来处理这个请求”,完美避开DOM渲染的阻塞。

方案二:用requestIdleCallback做真正的低优先级任务(推荐)

这个API是专门为低优先级任务设计的,只有当浏览器彻底空闲下来,没有渲染、布局等任务的时候,才会执行回调里的请求,完全不会影响页面加载速度:

$(document).ready(function() {
    // 先处理你的其他DOM相关逻辑
    if ('requestIdleCallback' in window) {
        requestIdleCallback(function() {
            $.getJSON("/cgi-bin/links/spots_load_new.cgi", { 
                catid: category_id, 
                linkid: link_id, 
                t: temp_set 
            }, function(results) { 
                showSpots(results); 
            });
        });
    } else {
        // 给不支持这个API的旧浏览器做降级处理
        setTimeout(function() {
            $.getJSON("/cgi-bin/links/spots_load_new.cgi", { 
                catid: category_id, 
                linkid: link_id, 
                t: temp_set 
            }, function(results) { 
                showSpots(results); 
            });
        }, 100);
    }
});

这样调整后,广告请求就会乖乖等DOM渲染完成、浏览器空闲的时候再发起,完全符合你要的低优先级需求啦!

内容的提问来源于stack exchange,提问作者Andrew Newby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:19:35