javascript - Ajax 在 </body> 之前尽快请求,还是在文档准备好时?

标签 javascript jquery ajax optimization

我正在优化一个页面,但我无法分辨出它们之间的结果差异(第一个显然更快,但我不确定它是否稍微减慢了页面的呈现速度):

这将尽快启动请求,并在文档准备好时修改 DOM:

<script>
$.ajax({
    url: '/some-url',
    success: function() {
        $(document).ready(function() {
            // do something
        });
    }
});
</script>
</body>

这将在文件准备好时开始请求:

<script>
$(document).ready(function() {
    $.ajax({
        url: '/some-url',
        success: function() {
            // do something
        }
    });
});
</script>
</body>

推荐哪一个?

最佳答案

此处的最佳做法是尽快启动 Ajax 请求,但仅在文档准备就绪 (DOMContentLoaded) 时才开始修改 DOM。为此,您可以使用 jQuerys Deferred 对象,它们与 jQuerys 扩展的 jXHR 对象相连。

<script>
    var req      = $.ajax({}),
        docReady = jQuery.Deferred();

    $(function() {
        docReady.resolve();
    });

    $.when( req, docReady ).done(function( data ) {
        // read the returned data and modify the DOM
    });
</script>

在 DOM 准备好之前等待开始请求是浪费时间。 XHR 请求与 DOM 发生的事情无关,也不感兴趣。


将这两件事完全分离更有意义。如果由于某种原因 DOM 需要很长时间才能准备就绪,您就不会浪费时间让 HTTP 请求 运行并收集其数据。反之,如果请求 非常慢,您也会浪费时间。所以你当前的片段就像​​

DOM ready    
           -> XHR request    
                          -> Do something useful

而我的例子是这样的

DOM ready    
XHR request
            -> Do something useful as soon as the DOM and request are ready

关于javascript - Ajax 在 </body> 之前尽快请求,还是在文档准备好时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13635445/

相关文章:

javascript - 使用javascript捕获溢出文本高度

javascript - Firebase Web Storage - 上传文件而不指定其名称

jquery克隆似乎没有保留可拖动/可放置事件

javascript - 问题 刷新/清除 Jquery 中更改事件的选择列表?

javascript - Ajax 自动完成浏览器卡住/崩溃

javascript - JQuery 在 AJAX 查询后重新绑定(bind) vs 绑定(bind)

ruby-on-rails - 在 Rails 中使用回形针进行 ajax 上传的简单方法?

javascript - 在 safari 中设置阴影和渐变时,canvas arc 函数会闪烁

javascript - SortableJS - 禁用对特定元素的排序

javascript - jQuery 选择带有标签的复选框