web-dev-qa-db-ja.com

jQuery:document.ready()呼び出しの実行順序を強制する

Document.ready()(jQuery)にいくつかの動作を設定する複数のコードブロックを持つコードベースに取り組んでいます。特定のブロックが他のブロックの前に呼び出されることを強制する方法はありますか?

背景:自動テスト環境でJSエラーを検出する必要があるため、他のJSコードが実行される前に実行するJSエラーのロギングを開始するコードが必要です。

30
Ankit Soni

document.ready()コールバックは、登録された順に呼び出されます。テストコールバックを最初に登録すると、最初に呼び出されます。

また、テストコードが実際にDOMを操作する必要がない場合は、コードが解析され、他のdocument.ready()コールバックが取得される前に実行されるDOMの準備ができるまで待機しないで、コードを実行できる場合があります。呼ばれた。または、テストコードの一部をすぐに実行し、DOMを使用する部分のみをdocument.ready()まで延期することもできます。

別のアイデアは(テスト目的のみ)document.ready()にフラグを追加したjQueryの少し変更されたバージョンで実行することができ、それが渡されてtrueに設定されると、最初にその関数を呼び出すことを示します。最初に関数を呼び出す新しいメソッドdocument.readyFirst()を追加できます。これには、jQueryのdocument.ready()処理コードへの小さな変更が含まれます。

27
jfriend00

@ jfriend00がready callbacks are called in the order they were registered.

したがって、このコードブロックが最初に呼び出されたとしても、その中に別のコールバックを設定して、最後に実行されるようにすることができます。

jQuery(document).ready(function(){
    jQuery(document).ready(function(){
        // This block will be executed after all ready calls.
    });
});
12
ecabuk

これを行うには holdReady を使用できるはずです。準備完了イベントの前に含まれている限り、独自のコードを実行してから、他の準備完了イベントをトリガーできます。

7
jncraton

私は同様のことをやろうとしていました、.ready()関数を持つ一連のポリフィルをロードしていましたが、ページに独自の.ready()があり、最初に実行する必要がありましたが、ポリフィルはヘッダーにロードされていました。

配列の関数を実行する.ready()を非常に早い段階(jQueryのロード直後)に設定することで、それを回避する方法を見つけました。ソースコードの非常に早い段階なので、.ready()が最初に実行されます。ページのさらに下の方で、配列に関数を追加して、他の.ready()よりも前に実行することができます。

私はそれを.beforeReady()関数でラップし、興味のある人のためにjQuery-Before-ReadyとしてGitHubに配置しました。 https://github.com/aim12340/jQuery-Before-Ready

1
EamonnM

ロギングの開始コードをDOMReadyで実行し、その他の初期化をロードで実行できます。または、最初にロギング開始コードを呼び出し、次に他のすべての初期化コールバックを呼び出す独自の初期化マネージャーを作成することもできます(jQueryをハックしてそこから抽出したくない場合を除き、jQueryではなくマネージャーに登録されている場合)。 tアドバイス)。

1
Mr. TA