この問題は、 を使用/切り替えたときに発生する可能性がありますjQuery 3
。それready states
は、新しいjQuery 3
ものすべてが完全にasynchron
. つまり、コードの実行順序は決まっていません。
このため、あなたが実行される前にそれload
が引き起こされる可能性があります。関数が最終的にトリガーされると、リスナーは遅すぎて実行されません。ready state
ready
load
jQuery の使用法:
この動作を変更するには、イベント リスナーの初期化のready state
周りを削除するだけです。これを関数load
でカプセル化する必要はありません。ready
なくても初期化できます。
// $(function() {
$(window).on("load", function() {
// this line will now be executed again
console.log("window is loaded!");
});
// });
両方のイベントを登録する必要がある、または登録したい場合は、自分でイベントを登録し、次に何をするかをload
内部で決定できます。ready state
// track the loading state by yourself
var windowLoaded = false;
$(window).on("load", function() {
windowLoaded = true;
});
$(function() {
function afterLoad() {
console.log("loaded");
}
// decide inside your ready state what to do
if( !windowLoaded ) {
$(window).on("load", afterLoad);
}
else {
afterLoad();
}
});
jQuery プラグイン:
load
もう 1 つのケースは、イベントも使用する jQuery プラグインです。例えば:
(function($, window) {
$.fn.myPlugin = function() {
$(window).on("load", start);
function start() {
console.log("plugin initialized and window loaded");
}
};
})(jQuery, window);
開発者/ユーザーがプラグインの初期化をラップすると、ready state
前に説明したように、問題が再び発生する可能性があります。
$(function() {
$("#element").myPlugin();
});
load
解決策は、プラグインのイベントを独自に追跡して、ready state
.
(function($, window) {
// track the loading state beside the plugin initialization
var windowLoaded = false;
$(window).on("load", function() {
windowLoaded = true;
});
$.fn.myPlugin = function() {
// decide inside your plugin how to start
if( !windowLoaded ) {
$(window).on("load", start);
}
else {
start();
}
function start() {
console.log("plugin initialized and window loaded");
}
};
})(jQuery, window);
結論:
この問題が発生しない場合でも、jQuery 3
他のユーザーや別のブラウザでこの問題が発生する可能性があるため、テストで を使用する場合は、これらのコードをすぐに変更する必要があります。他の人が問題を抱えている可能性があります。なぜならasynchron
、コードがいつ/実行されるかを知ることができないからです...