【问题标题】:How to call a function after "Complete page load" and "after all external script execution"?如何在“完成页面加载”和“所有外部脚本执行后”调用函数?
【发布时间】:2015-09-28 18:02:10
【问题描述】:

“完成页面加载”和“所有外部脚本执行后”如何调用函数?

我尝试了以下所有 4 个选项,但没有运气!!!

$(document).ready..
$(window).load...
window.onload = ...
$(document).ready(function()...

执行 setTimeout 对我有用,但不确定这是否 100% 有效!!!

setTimeout(function(){
//your code here
}, 3000);

请指教和帮助!!!

【问题讨论】:

  • 我认为你的外部脚本应该在某个地方包含一个回调来保存你的函数。这些外部脚本可能会在$(document).ready.. 时执行
  • 是的,但我无权更新那些要更新的外部脚本。

标签: javascript jquery html


【解决方案1】:

我对你的问题非常感兴趣,并深入到 jQuery 来源我想出了一个疯狂的黑客 :)
但关键是你应该把这段代码放在最开始,就在你插入jQuery之后:

$.statesNum = 0;
$.fn.ready = function ( fn ) {
    $.statesNum++;
    jQuery.ready.promise().done( fn ).then(function () {
        $.statesNum--;
        if ($.statesNum == 0) {
            $(document).trigger("afterReady");
        }
    });

    return this;
};

现在,当你想在所有 .ready 函数完成后执行某些操作时,你可以这样做:

$(document).on("afterReady", function () {
    alert("Hey, the ready functions are executed");
});

【讨论】:

  • 感谢您的解决方案,但这是什么“$.statesNum++;”做?你能解释一下你的逻辑吗..
  • @Sandeep jQuery 承诺背后的逻辑。我正在更改 jQuery 就绪函数实现,因此当一个函数传递给它时,它会增加一个计数器并添加一个回调函数,该函数会减少计数器,如果计数器变为 0,它将触发 afterReady 事件。
【解决方案2】:

脚本按照它们在 HTML 中出现的顺序加载和执行。如果您有简单的脚本,只需将您想要稍后运行的内容放在底部即可。

但是,如果您有异步运行的复杂脚本(意味着它们并行运行),那么如果不实际查看它们的工作,就不可能知道它们是否已完成执行。例如。他们(或他们是否可以)触发您可以收听的事件?或者,也许您可​​以使用“承诺”模式。

【讨论】:

  • 哦,好的……是的,我的外部脚本是“异步并并行运行的……对不起,我不在 JS 中,什么是“做。例如。他们(或他们是否可以)触发您可以收听的事件?或者,也许您可​​以使用“承诺”模式。”
  • 我们真的不能告诉你细节,除非你告诉我们你到底在运行什么,因为每个脚本都是不同的。
猜你喜欢
  • 1970-01-01
  • 2015-04-25
  • 2019-07-29
  • 2011-09-02
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多