我可以在document.ready()上获得一个延迟的jQuery吗?

时间:2011-05-30 13:52:38

标签: jquery ajax jquery-deferred

我的脚本加载后,我正在发出Ajax请求以获得一些翻译。这应该始终在文档准备好后返回,因为我在页面底部加载脚本,但我仍然很好奇是否可以在文档就绪状态下获得Deferred Object

这样就可以确保文档准备就绪并且Ajax调用在执行任何其他操作之前成功返回,例如像这样:

$.when( $.ajax('translations'), document.ready())
.then(function(){
    // Start doing stuff here
});

6 个答案:

答案 0 :(得分:23)

您可以使用data()将延迟对象与文档相关联,并在ready处理程序中将resolve()与之关联。这样,您应该能够将存储的延迟对象与$.when()

一起使用
$(document).data("readyDeferred", $.Deferred()).ready(function() {
    $(document).data("readyDeferred").resolve();
});

$.when($.ajax("translations"), $(document).data("readyDeferred"))
 .then(function() {
    // Start doing stuff here.
});

答案 1 :(得分:19)

这是ircmaxell评论的清理版本:

(function() {
  var doc_ready = $.Deferred();
  $(doc_ready.resolve);
  $.when(doc_ready, $.ajax('translations')).then(function() {
    console.log("done");
  });
})();

修改

停止错误修改的一些说明:

将函数传递给jquery对象(例如$(some_func))与$(document).ready(some_func)相同。

因此,$(doc_ready.resolve);行只是这样的简写:

$(document).ready(function() {
  doc_ready.resolve()
});

答案 2 :(得分:9)

试试这个:

$.when($.ajax('translations'), $.ready).then(function() {
    // Start doing stuff here
});

答案 3 :(得分:6)

我的版本是:

$.when(
  $.Deferred(function() { $(this.resolve); }), 
  $.ajax('translations')).
  then(function() { console.log("done"); });

答案 4 :(得分:2)

参考更新(2015年):

这在当前版本的jQuery中可用:

$.when($.ready).then(...);

使用highlandjs转换为流也很简单:

_($.when($.ready)).map(transform).pipe(output) // etc.

答案 5 :(得分:0)

jQuery' when不是一个正确的承诺。你可以把它强制成这样一个:

function documentReady() {
    return Promise.resolve($.when($.ready));
}

用法:

documentReady().then(function($) { ... });

恰好用$来解决这个问题,这样也很方便。

替代实施:

function documentReady() {
    return new Promise(r => $(r));
}