为什么在切换到 jQuery 3 后我的“加载”事件/函数没有被执行?

IT技术 javascript jquery jquery-plugins jquery-3
2021-02-25 20:23:45

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

使用/切换到jQuery 3. 这是因为所有ready statesjQuery 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,你永远不知道你的代码何时/是否被执行......

对不起,我不明白你的评论。你能解释一下你的意思吗?@CeylanMumunKocabaş
2021-04-20 20:23:45
我真的可以说它是新的。我有一个Lazy在 GitHub 上调用的插件,自从 jQuery 3 出来后,它成为了许多这些问题,因为我load在初始化中使用这是一个未解决的问题:github.com/eisbehr-/jquery.lazy/issues/55我什至与 jQuery 核心团队讨论了这个问题,他们说这是一个“真正的问题”并且是 jQuery 3 的新内容,因为发生了变化(甚至在发行说明中也有提到)。你可以在这里阅读:github.com/jquery/jquery/issues/3194稍后我可以为此创建一个示例,如果仍然需要...
2021-04-26 20:23:45
你解释得很好,这是可以理解的,即使我不想理解——我会的,我知道吗?
2021-04-30 20:23:45
您确定这是 jq3 中的新功能吗?因为它仍然使用内部准备好的延迟对象。您描述的行为可以在 jq1.x - 2.x 中复制。因此,为了更清楚,您能否提供一个在旧 jq 版本中工作的示例,该示例在 jq3.0 中会失败?您是否有任何有关 jq3.x 中此更改的链接?谢谢 编辑:我看到一些变化,在它使用Promise之前,现在在 jq3 中,它使用延迟对象,但我不确定是否有任何更深层次的变化
2021-05-01 20:23:45
这绝对是好链接。非常感谢,我很感激!
2021-05-10 20:23:45