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

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

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

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

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

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

这是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); line只是这样的简写:

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

试试这个:

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

我的版本是:

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

更新供参考(2015年):

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

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

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

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

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

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

用法:

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

它碰巧用$解决,所以这也很方便。

替代实施:

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