由于我已从jQuery 1.x
/ jQuery 2.x
升级到jQuery 3.x
,我的现有代码将不再正确执行。一切正常,但load
事件监听器不再被触发或仅被触发:
$(function() {
$(window).on("load", function() {
// this line will never/occasionally be executed
console.log("window is loaded!");
});
});
答案 0 :(得分:5)
使用/切换到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);
如果开发人员/用户现在将插件初始化包含在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
,你永远不知道你的代码何时被执行...