jQuery:.ready()和.ajaxComplete()两者都可以用吗?

5

当文档准备好或ajax查询完成时,我希望我的JS的某些部分进行初始化
类似于这样:

if ($(document).ready() or $(document).ajaxComplete()) {
  // do something
}

是否有可能编写这样的条件?
我该如何使其正确?


1
那似乎并不太合理。这是两个完全独立的事件。通常你会把需要访问DOM的内容放在ready处理程序中。然而,Ajax回调可能会在DOM准备好之前执行,导致元素无法使用。请描述您试图解决的实际问题。 - Felix Kling
你是在 jQuery 加载之前进行 Ajax 请求吗?你是在 HTML 之前加载 jQuery 吗?如果不是,那么我建议你选择“不要这样做”,然后你的问题就变得无关紧要了。 - mikakun
2个回答

10

你可以使用bind函数。

 $(document).bind('ready ajaxComplete', function(){
  // Your code here
 })

虽然我同意评论中Felix的观点,即ready函数是一个单独的函数,主要用于在整个文档加载完成后执行特定操作。


.ready.ajaxComplete是特殊的函数。我认为你不能用.bind替代它们。 - Felix Kling
待测试:但是jQuery的文档提到“jQuery触发ajaxComplete事件”。 - LeGEC
我有点困惑并且不确定我的答案了。ready和ajaxComplete被认为是像click、change这样的事件吗? - Jigar Jain
1
从这个 fiddle: http://jsfiddle.net/m6E8y/1/ 来看,它可以工作(所有 jQuery 版本都可在 jsfiddle 上使用,两个事件都被触发)。然而,对于 ready 事件,文档表示“自 1.8 已弃用”(http://api.jquery.com/ready/)。 - LeGEC
似乎在从延迟的外部脚本调用时无法正常工作。 - Igor Mizak

4

您可以将常见代码放在一个函数中,并将其绑定到您想要的任意事件:

function doStuff(){
    // do something
}

$(document).ready(doStuff);
$(document).ajaxComplete(doStuff);

如Jigar所提到的:你也可以使用.bind('evtA evtB', func).on('evtA evtB', func)一次性将相同的回调绑定到多个事件上。
然而,ready回调函数的文档也指出:

还有$(document).on( "ready", handler ),自jQuery 1.8已被弃用。


1
在这种情况下,他将不得不设置一个标志,以防止代码重复运行,表明代码是否已经执行过。 - Kiruse
你的回答似乎比我的更好,而且争议较少 :p 是的,需要一个标志,就像@Derija93提到的那样。 - Jigar Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接