javascript - js加载 - window.onload



为什么切换到jQuery 3后我的'load'事件/函数没有被执行? (1)

使用/切换到 jQuery 3 时可能会出现此问题。 这是因为新 jQuery 3 中的所有 ready states 现在都是完全 asynchron 。 这意味着,没有给定代码执行的命令。

因此,可能会发生,在执行 ready state 之前 已触发 load 。 当你的 ready 函数现在最终被触发时,你的 load 监听器太晚了,不会被执行。

jQuery用法:

要更改此行为,只需删除 load 事件侦听器初始化周围的 ready state 。 没有必要用 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 ,你永远不知道你的代码何时被执行...

由于我已经从 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!");
    });
});




jquery-3