你可以有多个$(document).ready(function(){…}); 部分?


240

如果我在启动时有很多功能,那么所有功能都必须在一个以下:

$(document).ready(function() {

还是我可以有多个这样的陈述?


1
主要在需要加载多个js文件(每个文件都包含$(document).ready();)时使用。功能
Abdillah 2015年

@leora采访中问了这个问题:D谢谢
eirenaios

Answers:


288

您可以有多个,但这并不总是最整洁的事情。尽量不要过度使用它们,因为这会严重影响可读性。除此之外,这是完全合法的。见下面:

http://www.learningjquery.com/2006/09/multiple-document-ready

试试看:

$(document).ready(function() {
    alert('Hello Tom!');
});

$(document).ready(function() {
    alert('Hello Jeff!');
});

$(document).ready(function() {
    alert('Hello Dexter!');
});

您会发现它与此等效,请注意执行顺序:

$(document).ready(function() {
    alert('Hello Tom!');
    alert('Hello Jeff!');
    alert('Hello Dexter!');
});

还值得注意的是,一个$(document).ready块中定义的函数不能从另一个$(document).ready块中调用,我只是运行了此测试:

$(document).ready(function() {
    alert('hello1');
    function saySomething() {
        alert('something');
    }
    saySomething();

});
$(document).ready(function() {
    alert('hello2');
    saySomething();
}); 

输出为:

hello1
something
hello2

25
当使用多个$(document).ready()语句时,依靠执行顺序是不明智的。每个人都需要独立于已经执行或没有执行的其他任何人来执行。
詹姆斯,

@AoP-我不知道这有多大意义,如果不按顺序执行它们,那么它们在应用程序上下文中将完全没有意义,因此使用多个$(document).ready(块将被完全破坏。
karim79,2009年

7
@ karim79可以肯定地(OP的问题)在编写带有多个启动问题的复杂代码时最适用-例如,某些代码在加载完成时始终运行,而某些代码仅在某些内容节点上需要?在这种情况下,应该隔离上下文,并且执行顺序应该不重要-能够将其分配给“ DOM ready”事件而不会覆盖前一个事件成为有用的功能,而与排序行为无关。
tehwrus12年

1
关于不能从另一个就绪块调用的一个就绪块中定义的函数,这是定义函数的方式,但这是正确的,但是如果将其定义为saySomething = function(){},则可以调用它。奇怪吧?jsfiddle.net/f56qsogm在这里进行测试。
ferr 2014年

2
我认为它的行为是这样的,因为它将功能添加到可全局访问的window对象中。否则,它是一个声明式函数,范围仅限于该就绪函数。
2014年

19

您可以使用多个。但是您也可以在一个文档中使用多种功能。

$(document).ready(function() {
    // Jquery
    $('.hide').hide();
    $('.test').each(function() {
       $(this).fadeIn();
    });

    // Reqular JS
    function test(word) {
       alert(word);
    }
    test('hello!');
});

如果您完全控制该页面所附的代码,则可以。如果有人已经将此内容写到该页面的另一个文件中,则可以这样声明。
詹姆斯·怀斯曼

不确定您要说什么。但是,如果将它放在脑海中,并包括15个其他外部JS,则所有其中的一个都包含一个(或多个document.load),它仍然可以正常工作,就好像只有一个。值得一提的是,每个函数/变量的代码都以$(document).ready-function的右括号结束。
米克尔(Mickel),2009年

2
只是想说有时,其他人会在页面上附加已声明了文档就绪功能的书面模块,因此您可能没有将所有代码都移到一个函数中的奢望(当然,这是理想的选择) )。但是,在这里我会担心太多的东西,因为我们会看到On Ready Bloating,这会使代码同样难以维护。
詹姆斯·怀斯曼

1
啊,现在我明白了。是的,我同意这一点。刚刚举了一个例子来证明这是可能的;)
Mickel

15

是的,您可以轻松拥有多个区块。请注意它们之间的依赖性,因为评估顺序可能不是您期望的。


11

是的,可以有多个$(document).ready()调用。但是,我认为您不知道将以哪种方式执行它们。(资源)


14
按添加的顺序调用
redsquare,

谢谢,这是很清楚的事情,因为-尽管对此有一般的理解-jQuery ready()页面实际上并没有说您是否可以(在撰写本文时:))。但是,如果您在一个句子的各行之间阅读,它确实意味着可以:Ready handlers bound this way are executed after any bound by the other three methods above.
Reg Edit


3

是的,完全可以,但是请避免无故这样做。例如,当动态生成我的javascript文件时,我用它来声明全局站点规则而不是单独页面来声明全局站点规则,但是如果您一遍又一遍地执行它,将很难阅读。

另外,您无法从另一个jQuery(function(){});调用访问某些方法, 所以这是您不想这样做的另一个原因。

window.onload尽管使用旧版本,但每次指定函数时都将替换旧版本。


2

是的你可以。

如果您有其他使用同一文档的模块不在同一页面上,则多个文档就绪部分特别有用。使用旧的window.onload=func声明,每次您指定要调用的函数时,它都会替换旧的。

现在,指定的所有功能都将排队/堆叠(有人可以确认吗?),而无论在哪个文档准备区中指定它们。


是的,的确如此,这些函数比替换以前的$(document).ready函数要排队得多了。
Deeksy,2009年

2

我认为最好的方法是将开关切换到命名函数(有关此主题的更多信息,请检查此溢出)。这样,您可以从单个事件中调用它们。

像这样:

function firstFunction() {
    console.log("first");
}

function secondFunction() {
    console.log("second");
}


function thirdFunction() {
    console.log("third");
}

这样,您可以在单个就绪函数中加载它们。

jQuery(document).on('ready', function(){
   firstFunction();
   secondFunction();
   thirdFunction();

});

这会将以下内容输出到您的console.log:

first
second
third

这样,您可以将功能重用于其他事件。

jQuery(window).on('resize',function(){
    secondFunction();
});

检查此小提琴的工作版本


0

这是合法的,但有时会导致不良行为。作为示例,我使用了MagicSuggest库,并在项目的页面中添加了两个MagicSuggest输入,并为每个输入的初始化使用了独立的文档就绪函数。第一个Input初始化有效,但第二个无效,也没有给出任何错误,Second Input未显示。因此,我始终建议使用一个“文档就绪”功能。


0

您甚至可以将文档就绪功能嵌套在随附的html文件中。这是使用jquery的示例:

档案:test_main.html

<!DOCTYPE html>
<html lang="en">
<head>
    <script src="jquery-1.10.2.min.js"></script>
</head>

<body>
    <div id="main-container">
        <h1>test_main.html</h1>
    </div>

<script>
    $(document).ready( function()
    {
        console.log( 'test_main.html READY' );
        $("#main-container").load("test_embed.html");
    } );
</script>

</body>
</html>

档案:test_embed.html

<h1>test_embed.html</h1>
<script>
    $(document).ready( function()
    {
        console.log( 'test_embed.html READY' );
    } );
</script>

控制台输出:

test_main.html READY                       test_main.html:15
test_embed.html READY                      (program):4

浏览器显示:

test_embed.html


0

您也可以通过以下方式进行操作:

<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
 $(document).ready(function(){
     $("#hide").click(function(){
     $("#test").hide();
     });
     $("#show").click(function(){
     $("#test").show();
     });
 });
</script>
</head>

<body>
<h2>This is a test of jQuery!</h2>
<p id="test">This is a hidden paragraph.</p>
<button id="hide">Click me to hide</button>
<button id="show">Click me to show</button>
</body>

先前的答案显示在单个.ready块中使用多个命名函数,或者在.ready块中使用单个未命名函数,而在.ready块之外使用另一个命名函数。我在研究.ready块中是否可以使用多个未命名函数的方法时发现了这个问题-我无法获得正确的语法。我终于想通了,并希望通过发布测试代码,我可以帮助其他人寻找我遇到的相同问题的答案


您能描述一下这与其他答案有何不同吗?
斯蒂芬·劳赫

确定:先前的答案显示在单个.ready块中使用多个命名函数,或者在.ready块中使用单个未命名函数,而在.ready块之外使用另一个命名函数。我在研究.ready块内是否有多个未命名函数的方法时发现了这个问题-我无法获得正确的语法。我终于想通了,并希望通过发布测试代码,我可以帮助其他人寻找与我同样的问题的答案。
JEPrice

抱歉,我的意思是。文本框的左下方有一个编辑按钮。描述您的解决方案为何与众不同/更好的原因,使它成为更好的答案,因为将来的读者可以更快地理解“为什么”。谢谢。
斯蒂芬·劳奇
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.