jquery-向'ready()'添加函数,或者如果已经'ready()'则调用`

jquery-向'ready()'添加函数,或者如果已经'ready()'则调用`,jquery,Jquery,我不知道如何做到这一点,jquery文档也没有什么帮助 在代码中的某一点上,我需要运行函数foo() 通常,文档准备就绪后将调用foo(): $(document).ready(function(){foo();}) 但有可能需要在事后调用: foo(); 当我需要运行foo时,有没有一种方法可以测试文档是否准备就绪,或者将其添加到jqueryreadypromise中 如果jqueryready中的包装foo() 更新 根据KevinB的评论,我尝试在不同的jquery版本上运行测试——加

我不知道如何做到这一点,jquery文档也没有什么帮助

在代码中的某一点上,我需要运行函数
foo()

通常,文档准备就绪后将调用
foo()

$(document).ready(function(){foo();})
但有可能需要在事后调用:

foo();
当我需要运行foo时,有没有一种方法可以测试文档是否准备就绪,或者将其添加到jquery
ready
promise中

如果jquery
ready
中的包装
foo()

更新

根据KevinB的评论,我尝试在不同的jquery版本上运行测试——加载后

$(document).ready(function(){alert('ok');});
我得到了每个版本的警告。包括我使用的(1.11.1)

我尝试将代码包装在一个try/catch块中;没什么

$.ready显示了正确的函数


似乎我安装的东西破坏了ready功能。我会检查我所有的插件,并试图找出哪一个

您可以使用以下代码执行此操作:
$(document).ready(foo}),,
$(document).ready(函数(){foo();}),,
$(document).on('ready',foo),或
$(document).on('ready',function(){foo();})


即使之前已经发布了
'ready'
,jQuery也会小心处理并在之后运行代码。

如果您的其余代码被包装在
ready()
中,那么DOM肯定已经准备好了

$(document).ready(function(){
   foo();

   // other code
   $otherElt.change(foo); // this is guaranteed to be called after ready event has fired
});

您可以将其包装在一个
.ready()
调用中

如果文档还没有准备好,那么jQuery将对函数进行排队,以便在文档按预期准备好后运行

如果文档已经准备好,那么jQuery将立即运行该函数

所以,你可以这样做:

$(document).ready(foo);
随时都可以
foo()
将立即运行(如果文档已准备就绪),或者稍后在文档准备就绪时运行

工作演示:


如果出于某种原因,您不愿意让jQuery为您处理此问题,您也可以这样做:

function runWhenSafe(fn) {
    if (document.readyState === "complete") {
        fn();
    } else {
        $(document).ready(fn);
    }
}

runWhenSafe(foo);
不过,我不得不说,当
.ready()
几乎已经为您完成这项工作时,没有什么理由编写额外的代码

如果ready()已经运行,那么在jquery ready承诺中包装foo()将不会运行它

这是完全错误的。将另一个函数添加到
$(document).ready
将在文档已准备就绪时立即触发该函数。您可以随时使用
$(document).ready
任意次数;它应该会起作用


“如果ready()已经运行,那么jquery ready承诺中的Wrapping foo()将不会运行它。”这绝对是错误的@KevinB这似乎对我有效,但对我的本地测试无效。你知道jquery最近有没有变化吗?我将更新我的版本。至少从1.2.6(我使用过的最早版本)开始,它在这方面没有改变@KevinB谢谢。我测试了几个版本的jquery,所有功能都如您所说(以及我最初的预期)——包括我的版本。似乎我安装的东西破坏了jquery。现在我得把它修好。如果你把你的评论改成一个问题,我会给你评分。这是最正确的回答。或者,您可以简单地编写
$(foo)来代替冗长的版本
@dfsq-我更喜欢使用
$(document).ready()
,因为我认为代码更具可读性和描述性,这对我来说比使用更少的字符更重要。在我的优先顺序中,可读性和清晰性优先于简洁性。欢迎你有不同的意见。但是,一旦你花时间使用你不熟悉的库编写了很多其他人的代码,你就会感激那些使代码可读的开发人员。谢谢你的回答。这是伟大和正确的,但凯文布明确指出,我所看到的是不应该发生的。。。这导致我搜索破坏javascript的bug。
function runWhenSafe(fn) {
    if (document.readyState === "complete") {
        fn();
    } else {
        $(document).ready(fn);
    }
}

runWhenSafe(foo);