jQuery-多个$(document).ready ...?


358

题:

如果我链接两个都带有$(document).ready函数的JavaScript文件,会发生什么?一个会覆盖另一个吗?还是两个都$(document).ready被叫?

例如,

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>

<script type="text/javascript" src="http://.../jquery1.js"></script>

<script type="text/javascript" src="http://.../jquery2.js"></script>

jquery1.js:

$(document).ready(function(){
    $("#page-title").html("Document-ready was called!");
});

jquery2.js:

$(document).ready(function(){
    $("#page-subtitle").html("Document-ready was called!");
});


我相信最好的方法是将两个调用简单地合并为一个,$(document).ready但是在我的情况下这是不可能的。


Answers:


349

所有人都会被执行,并且在首次调用的基础上运行!!

<div id="target"></div>

<script>
  $(document).ready(function(){
    jQuery('#target').append('target edit 1<br>');
  });
  $(document).ready(function(){
    jQuery('#target').append('target edit 2<br>');
  });
  $(document).ready(function(){
    jQuery('#target').append('target edit 3<br>');
  });
</script>

演示如您所见,它们不会互相替换

我还要提一件事

代替这个

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

您可以使用此快捷方式

jQuery(function(){
   //dom ready codes
});

66
甚至更短的$(function(){// dom就绪代码}); api.jquery.com/ready
davehale23'5

217
记得看到$(function(){//做事}); 第一次,对Google的解释有多困难?$(document).ready能以少得多的价格传达更多信息……
Matt Montag

56
投票赞成简洁而不易读的代码,就是投票反对恐怖主义。
FreeAsInBeer 2015年

10
快捷方式没有任何好处,但会引起混淆。如果您的目标是缩短代码的阅读,理解和维护时间,那么这些快捷方式将为您带来长足的发展。
jononomo

3
如果使用快捷方式是邪恶的,则应该使用jQuery(document).ready(function(){ });
Memet Olsen

76

重要的是要注意,每个jQuery()调用实际上必须返回。如果抛出一个异常,则后续(无关)调用将永远不会执行。

这与语法无关。您可以使用jQuery()jQuery(function() {})$(document).ready(),任何你喜欢的,行为是一样的。如果早期模块失败,则后续的模块将永远不会运行。

使用第三方库时,这对我来说是个问题。一个库引发异常,随后的库从未初始化任何东西。


2
这个。我刚刚花了一个小时来将问题缩小到这一点。我的一个$(document).ready调用引发了错误,因此$(document).ready从未调用过另一个函数。它让我发疯。
向上滚动2015年

10
这已不再是这种情况。从jQuery 3.0开始,jQuery确保在一个处理程序中发生的异常不会阻止随后添加的处理程序执行。api.jquery.com/ready
Ravi Teja

31

$(document).ready(); 与任何其他功能相同。一旦文档准备就绪(即加载),它将触发。问题是关于在触发多个$(document).ready()时会发生什么,而不是在多个$(document).ready()内触发相同的函数时会发生什么

//this
<div id="target"></div>

$(document).ready(function(){
   jQuery('#target').append('target edit 1<br>');
});
$(document).ready(function(){
   jQuery('#target').append('target edit 2<br>');
});
$(document).ready(function(){
   jQuery('#target').append('target edit 3<br>');
});

//is the same as
<div id="target"></div>

$(document).ready(function(){

    jQuery('#target').append('target edit 1<br>');

    jQuery('#target').append('target edit 2<br>');

    jQuery('#target').append('target edit 3<br>');

});

两者的行为完全相同。唯一的区别是,尽管前者将获得相同的结果。后者将运行几分之一秒,并且需要更少的键入。:)

最后,在任何可能的情况下,仅使用1 $(document).ready();

//旧答案

他们都会被依次召唤。最佳实践是将它们结合起来。但不要担心,如果不可能。该页面不会爆炸。


^^编辑了我的,因为我认为人们可能会混淆多次运行同一功能和在多个$(document).ready中运行不同的功能。^^希望对您有所帮助。
艾德·弗莱德


9

两者都会被叫,先到先得。在这里看看。

$(document).ready(function(){
    $("#page-title").html("Document-ready was called!");
  });

$(document).ready(function(){
    $("#page-title").html("Document-ready 2 was called!");
  });

输出:

准备好文档2!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.