我需要确保页面中的某个脚本最后执行。我想到了使用 JQuery
$(document).ready( ... )
但是如果有更多这种类型的函数,实际上是最后执行的呢?
我需要确保页面中的某个脚本最后执行。我想到了使用 JQuery
$(document).ready( ... )
但是如果有更多这种类型的函数,实际上是最后执行的呢?
这取决于您注册它们的顺序。
例如:
$(document).ready( function() { alert("first"); });
$(document).ready( function() { alert("second"); });
$(document).ready( function() { alert("third"); });
会提醒“第一”然后是“第二”然后是“第三”
因此<script>
,在页面底部添加 a$(document).ready( yourfunction );
就足够了。
有很多方法可以延迟脚本的执行。
没有办法以编程方式检测所有这些。
为了获得可靠的解决方案,您必须对您关心的每个页面的代码进行反向引擎,弄清楚它在做什么(以及何时)并专门为该页面编写延迟脚本。(对于“可靠”的值等于“直到他们更改页面”)。
理论上你可以这样做:
// Form array of functions which sould be called with according order
$.readyArray = [function () { ... }, function () { ... }, function () { ... }, ...];
// just execute them in this order when onready event
$(document).ready(function() {
for (var i = 0; i < $.readyArray.length; i++) {
//apply, calls function in current context and pass arguments object
$.readyArray[i].apply(this,[arguments]);
}
});
$(document).ready( ... )
不是最后执行的。最后执行的函数(因此,在 document ready 之后)是 from 的函数<body onload>
。
例子 :<body onload="myJSfunction();">
在这里,javascriptmyJSfunction
在 $(document).ready( ... ) 之后最后执行。
如果重构(如Quentin建议的那样)不是一种选择(例如,您正在更新框架或产品的一部分),您可以使用四种方法,这应该会给您一个很好的机会来实现您所需要的。使用 jQuery 查看以下代码段:
(1) 等到“文档”准备好
文档是指可见的 DOM。该脚本将在它应该被渲染的所有内容真正渲染时触发。
$(document).ready(function() {
console.log('Document is ready.');
});
(2) 等到顶层 JS (Root) 'window' 对象准备好
完整的根对象可以(将)在 DOM 准备好后的某个时间准备好。
$(window).ready(function() {
console.log('Window is ready.');
});
(3) 等到 'window' 使用 .bind 完全加载
这会在“窗口”准备好后立即触发,因此您的脚本可以作用于$(window).ready()
上面渲染的对象(元素)。
$(window).bind("load", function() {
console.log('Window bind is ready.');
});
(4)等到Ajax调用完成
这是你所能做到的——脚本将在“窗口”准备好、加载、所有代码运行和所有 Ajax 操作完成时触发。不幸的是,由于一个 Ajax 可以调用另一个 Ajax,因此它可以在页面加载期间触发多次。
$(window).ajaxComplete(function() {
console.log('Window bind is ready, Ajax finished.');
}
在简单的 Javascript 解决方案中,您可以在脚本标记内的 HTML 文档末尾调用 javascript 函数。这在您不使用 jQuery 时效果很好。
在 jQuery 的情况下,您可以使用 load 方法。当元素和所有子元素都已完全加载时,将加载事件发送到元素。
有关更多信息,请查看
试试这个,
$(window).bind("load", function() {
//code here
});