4

由于我已经从jQuery 1.x/升级jQuery 2.xjQuery 3.x,我现有的代码将不再正确执行。一切正常,但load事件监听器不再被触发,或者只是有时:

$(function() {
    $(window).on("load", function() {
        // this line will never/occasionally be executed
        console.log("window is loaded!");
    });
});
4

1 回答 1

5

使用/切换到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);

如果开发人员/用户现在将插件初始化包装在 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,你永远不知道你的代码何时/是否被执行......

于 2016-07-26T08:58:32.850 回答