使用/切换到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插件:
另一种情况是 jQuery 插件,它也使用该load
事件。例如:
(function($, window) {
$.fn.myPlugin = function() {
$(window).on("load", start);
function start() {
console.log("plugin initialized and window loaded");
}
};
})(jQuery, window);
如果开发人员/用户现在将插件初始化包装在 aready 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
,你永远不知道你的代码何时/是否被执行......