document.ready()(jQuery)でいくつかの動作を設定するコードの複数のブロックを持つコードベースに取り組んでいます。ある特定のブロックが他のブロックの前に呼び出されるように強制する方法はありますか?
背景:自動テスト環境でJSエラーを検出する必要があるため、他のJSコードを実行する前に、JSエラーのログ記録を開始するコードを実行する必要があります。
document.ready()(jQuery)でいくつかの動作を設定するコードの複数のブロックを持つコードベースに取り組んでいます。ある特定のブロックが他のブロックの前に呼び出されるように強制する方法はありますか?
背景:自動テスト環境でJSエラーを検出する必要があるため、他のJSコードを実行する前に、JSエラーのログ記録を開始するコードを実行する必要があります。
document.ready()
コールバックは、登録された順序で呼び出されます。テストコールバックを最初に登録すると、最初に呼び出されます。
また、テストコードが実際にDOMを操作する必要がない場合は、コードが解析されるときにそれを実行でき、他のdocument.ready()
コールバックが呼び出される前に実行されるDOMの準備ができるまで待たない場合があります。または、テストコードの一部をすぐに実行し、DOMを使用する部分のみを。まで延期することもできますdocument.ready()
。
もう1つのアイデアは、(テスト目的でのみ)わずかに変更されたバージョンのjQueryを使用して実行し、document.ready()
渡されたときにフラグを追加してtrue
、その関数を最初に呼び出すように指示するように設定するか、関数を最初に呼び出す新しいメソッドdocument.readyFirst()
を追加することです。document.ready()
これには、jQueryの処理コードへの小さな変更が含まれます。
@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.
});
});
これを行うには、 holdReadyを使用できるはずです。準備完了イベントの前に含まれている限り、独自のコードを実行してから、他の準備完了イベントをトリガーできます。
私は似たようなことをしようとしていました。.ready()関数を持つポリフィルの束をロードしていましたが、ポリフィルはヘッダーにロードされていましたが、最初に実行する必要のある独自の.ready()もページにありました。 。
配列から関数を実行する.ready()を非常に早い段階(jQueryのロード直後)に用意することで、この問題を回避する良い方法を見つけました。ソースコードの非常に早い段階であるため、.ready()が最初に実行されます。ページのさらに下にある配列に関数を追加できるので、それらはすべて他の.ready()の前に実行されます。
.beforeReady()関数でラップし、興味のある人のためにjQuery-Before-ReadyとしてGitHubに配置しました。 https://github.com/aim12340/jQuery-Before-Ready
ロギング開始コードはDOMReadyで実行でき、その他の初期化はロードで実行できます。または、最初にロギング開始コードを呼び出し、次に他のすべての初期化コールバックを呼び出す独自の初期化マネージャーを作成することもできます(ただし、jQueryをハックしてそこから抽出する場合を除き、jQueryではなくマネージャーに登録されている必要があります。 tアドバイス)。