11

複数のファイルの複数の関数を$(document).readyに添付しましたが、$(document).readyが最初に処理する関数として、または$(document)の前に個別にトリガーする関数として、それらの前に単一の関数を添付したいと思います。 .readyハンドラー。

jQueryがjQuery.fn.readyの一部として内部的にトリガーする関数の順序を処理する方法、またはjQuery.fn.readyの直前に呼び出す関数をフックする方法はありますか?

サードパーティのスクリプトでjQuery.fn.readyを編集しても安全ですか、それとも他のサードパーティのプラグイン(jQuery.fn.ready自体を編集するプラグインを除く)でひどいノックオン効果が発生しますか?

[編集]:

例として

$(document).ready(function b() {});
....
$(document).ready(function a() {/* optional setup*/});
....
$(document).ready(function c() {});

関数aは、順序に関係なく最初に発生する必要がありますが、数ページでのみ呼び出されます。bまたはcの順序を保証できないため、bまたはcの開始時にカスタムイベントをトリガーしてaをトリガーすることはできません。

したがって、jQueryの内部readyListの先頭に強制的に配置するか、jQueryのready関数にフックして安全に編集し、readyListの他の関数の前に呼び出すことができる汎用ソリューションが必要です。

[さらに編集]

可能であれば、JavaScriptコードの実行順序を再設計したり、関数a()以外の他のコードに触れたりする必要はありません。リストラによってこの問題を回避できることは承知していますが、次のような単一の関数を記述したいだけです。

$.beforeReady(function a() {});
4

3 に答える 3

16

これは、他のすべてのファイルが行うカスタムイベントをトリガーするときであり、ハンドラーbindは1つだけで、それが処理を実行してから、カスタムイベントをトリガーします。ready

したがって、コード内のどこかで、を使用する代わりに$(document).ready

$(window).bind('setup', function() {
   //code here...
});

および/または

$(window).bind('loaded', function() {
   //some other code here...
});

そして、あなたの唯一のreadyハンドラーでは、次のようなことをします:

$(document).ready(function() {
   $(window).trigger('setup');
   $(window).trigger('loaded'):
});
于 2010-11-04T15:54:33.617 に答える
0

$(document).ready()または、単に実装$(function(){})にすぎ.addEventListenerません(正確ではありませんが、近いです)。つまり、前後にリスナーを追加できます。

$(document).ready(listener); // goes off first.
$(document).ready(otherListener); // goes off 2nd.

など、機能をサンドイッチすることは難しくありません。imoをハックする必要はありません.ready()

于 2010-11-04T15:55:50.377 に答える
0

私はまったく同じ問題を抱えていました。$ .beforeReady()関数を追加する小さなスクリプトをGitHubに配置しました。面白い :)

https://github.com/aim12340/jQuery-Before-Ready

この例のように、jQueryの直後にスクリプトをロードするだけです。

<html>
    <head>
        <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
        <script src="jquery-before-ready.js"></script>
    </head>
    <body>
        <script>
            $(document).ready({
                alert("This function is declared first!")
            })
        </script>
        <script>
            $.beforeReady(function(){
                alert("This function is declared second but executes first!")
            })
        </script>        
    </body>
</html>
于 2017-04-21T11:50:37.750 に答える