使用/切换到jQuery 3. 这是因为所有ready states新jQuery 3的现在都完全asynchron. 这意味着,没有给定的代码执行顺序。
因此,它可能会发生,即在您的执行之前load被触发。当您的函数现在最终被触发时,您的侦听器为时已晚,不会被执行。ready statereadyload
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);
如果开发人员/用户现在将插件初始化包装在一个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,你永远不知道你的代码何时/是否被执行......