【发布时间】:2009-11-07 20:40:10
【问题描述】:
我正在使用 window.onload 来调用我的JavaScript 代码,该代码必须在页面完全加载后执行。根据我的阅读,这是调用此类脚本的推荐方法。
但是,它不适用于某些 Ajax 网站,例如 www.bing.com - 在页面完全呈现之前调用 window.onload。
有什么建议吗?
【问题讨论】:
标签: javascript ajax onload
我正在使用 window.onload 来调用我的JavaScript 代码,该代码必须在页面完全加载后执行。根据我的阅读,这是调用此类脚本的推荐方法。
但是,它不适用于某些 Ajax 网站,例如 www.bing.com - 在页面完全呈现之前调用 window.onload。
有什么建议吗?
【问题讨论】:
标签: javascript ajax onload
简短的回答是没有通用的方法来解决这个问题(现在)。
当 AJAX 发挥作用时,“页面”的定义是相当可替代的 - 很难区分旨在成为初始页面加载的一部分的 AJAX 与可能不是的 AJAX 之间的区别。因此,浏览器可以自行决定何时应该触发 window.onload(),并且它并不总是最终到达您想要的位置。
幸运的是,大多数人不需要通用解决方案,而是需要特定的解决方案。如果您关心 bing.com,那么您可能可以查看 bing.com 的工作原理,并设计您的代码以在网站达到您认为可以接受的状态时触发。
【讨论】:
我已经为此苦苦挣扎了几次,我需要某种 onload 事件触发的通常原因是能够与 HTML DOM 交互并让 getElementById、getElementsByTagName 或各种其他 DOM 选择器返回一些东西除了没有。
再说一次,我不确定您要解决的确切问题,但如果您必须使用某种 onload,而且这是由于某种 DOM 遍历,您可以使用以下代码作弊:
window.onload = pageChecker;
function pageChecker() {
// Onload has fired, but we don't trust it.
// Check to see if our deepest nested element can be found
var testElement = document.getElementById("importantElement");
if ( !testElement ) {
// Try again in a bit, adjust timeout to what your users
// can tolerate
setTimeout(pageChecker, 50);
}
else {
//
// ... the element exists, run important code below ...
//
}
}
【讨论】:
您可以通过全局侦听DOMSubtreeModified 和readystatechange 事件来侦听更改和请求,并使用这些事件而不是load 事件来执行您尝试执行的任何操作。
【讨论】:
我推荐使用 jQuerys $(...).ready() 方法。
【讨论】:
除了answer from Rasmus Kaj,如果你使用jQuery,我会指导你看看Global Ajax Event Handlers。
jQuery.fn.ajaxComplete (http://api.jquery.com/ajaxcomplete/)jQuery.fn.ajaxStop (http://api.jquery.com/ajaxstop/)请注意,这与本机 onload 事件无关。
【讨论】: