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

时间:2016-07-26 08:58:33

标签: javascript jquery jquery-plugins jquery-3

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

1 个答案:

答案 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,你永远不知道你的代码何时被执行...