我可以在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)); }