複数の$(document).ready(function(){…});を使用できますか?セクション?


240

起動時に多くの機能がある場合、それらはすべて1つにまとめる必要があります。

$(document).ready(function() {

または、そのようなステートメントを複数持つことができますか?


1
主に、それぞれに$(document).ready();が含まれている複数のjsファイルをロードする必要がある場合に必要です。関数
Abdillah

@leoraこの質問はインタビューで尋ねられました:Dありがとう
eirenaios

回答:


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」イベントに割り当てることができると便利な機能になります。
tehwalrus 2012

1
あるレディブロックで定義された関数が別のレディブロックから呼び出すことができない場合-これは関数を定義する方法と同じですが、代わりにsaySomething = function(){}として定義すると、それを呼び出すことができます。変だよね?jsfiddle.net/f56qsogmでテストしてください。
FERR

2
グローバルにアクセス可能なウィンドウオブジェクトに関数を追加しているため、このように動作すると思います。それ以外の場合は、ローカルでその準備が整った関数にスコープされた宣言関数です。
FERR

19

複数使用できます。ただし、1つのdocument.ready内で複数の関数を使用することもできます。

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

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

これは、ページに添付されたコードを完全に制御できる場合は問題ありません。誰かがすでにページに添付された別のファイルにこれを書き込んでいる場合は、このように宣言してもかまいません。
ジェームズ・ワイズマン

何を言っているのかわからない。しかし、これを頭の中に入れ、他の15個の外部JSを含めると、すべてに1つ(または複数のdocument.load)が含まれ、1つだけであるかのように機能します。言及する価値があるのは、各関数/変数のスクープが$(document).ready-functionの閉じ括弧で終わることです。
ミケル

2
時には、他の人がドキュメントの準備ができた関数がすでに宣言されているページに添付されたモジュールを作成することがあります。そのため、すべてのコードを1つの関数に移動する贅沢がない場合があります(当然のことながら、 )。ただし、ここではコードを維持するのと同じくらい難しくすることができるOn Ready Bloatingを取得するので、ここに多すぎるものがあることに注意します。
James Wiseman、

1
ああ、今あなたを手に入れます。ええ、私はそれに同意します。それが可能であることを証明するための例を示しただけです;)
ミケル

15

はい、簡単に複数のブロックを持つことができます。評価順序が期待と異なる場合があるので、それらの間の依存関係に注意してください。


11

はい、複数の$(document).ready()呼び出しを持つことが可能です。ただし、どのように実行されるかはわかりません。(ソース)


14
追加された順序で呼び出される
redsquare 2009

おかげで、この点を明確にするのは良いことです。なぜなら、件名に関する一般的な知識にもかかわらず、jQuery ready()ページは、実際に(書いている時点では)書けるかどうかを示していないからです。しかし一種のない暗示:あなたは一つの文章の行間を読むならば、それのOKをReady handlers bound this way are executed after any bound by the other three methods above.
レッグ編集

5

はい、可能ですが、div #mydivを使用して両方を使用することをお勧めします

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

//and

$("#mydiv").ready(function(){});

2
面白いアイデアですが、なぜそれが優れているのですか?
Tim

3
divの使用はサポートされていません。何らかの理由でこれを行う場合は、自己責任で行ってください。.ready()メソッドは、現在のドキュメントに一致するjQueryオブジェクトでのみ呼び出すことができます
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ライブラリを使用して、プロジェクトのページに2つのMagicSuggest入力を追加し、入力の初期化ごとに個別のドキュメント対応関数を使用しました。最初の入力の初期化は機能しましたが、2番目の初期化は機能せず、エラーも発生しませんでした。第2の入力は表示されませんでした。したがって、常に1つのドキュメント準備機能を使用することをお勧めします。


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

申し訳ありませんが、私は質問で意味しました。テキストボックスの左下に編集ボタンがあります。ソリューションが異なる/優れている理由を説明すると、将来の読者が「なぜ」をより早く理解できるようになるため、より良い答えになります。ありがとう。
スティーブンラウフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.