| 由于 window.onload 事件需要在页面所有内容(包括图片等)加载完后,才执行,但往往我们更希望在 DOM 一加载完就执行脚本。其实在现在大部分主流浏览器上(Firefox 3+,Opera 9+,Safari 3+,Chrome 2+)都提供了这一事件方法:addDOMLoadEvent。 document.addEventListener("DOMContentLoaded", init, false); 那对于 IE 我们如何模拟 addDOMLoadEvent 事件呢? Matthias Miller 最早提供了如下的解决方案: // for Internet Explorer (using conditional comments)/*@cc_on @*/
 /*@if (@_win32)
 document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
 var script = document.getElementById("__ie_onload");
 script.onreadystatechange = function() {
 if (this.readyState == "complete") {
 init(); // call the onload handler
 }
 };
 /*@end @*/
 而 Diego Perini 在其后提供了一种利用 doScroll() 方法来模拟 addDOMLoadEvent 事件的方案,且现在主流的 JavaScript 框架(JQuery、YUI等)基本都采用的这一解决方案。 原理基本如下: 当 ondocumentready 事件触发,文档( document )已经完全解析和建立。如果组件需要操作最初的文档结构,初始化代码需被安置在这之后。ondocumentready 事件告知组件,整个页面已被加载,且在 初始文档的 onload 事件触发之前立即触发。 一些方法,例如 doScroll,要求最初的文档被完全加载。如果这些方法是初始化函数的一部分,当ondocumentready 事件触发,他们将被执行。 /**
 * IEContentLoaded.js
 *
 * Author: Diego Perini (diego.perini at gmail.com) NWBOX S.r.l.
 * Summary: DOMContentLoaded emulation for IE browsers
 * Updated: 05/10/2007
 * License: GPL/CC
 * Version: TBD
 *
 */
 // @w    window reference
 // @fn
 function referencefunction IEContentLoaded (w, fn) {
 var d = w.document, done = false,
 // only fire once
 init = function () {
 if (!done) {
 done = true;
 fn();
 }
 };
 // polling for no errors
 (function () {
 try {
 // throws errors until after ondocumentready
 d.documentElement.doScroll('left');
 } catch (e) {
 setTimeout(arguments.callee, 50);
 return;
 }
 // no errors, fire
 init();
 })();
 // trying to always fire before onload
 d.onreadystatechange = function() {
 if (d.readyState == 'complete') {
 d.onreadystatechange = null;
 init();
 }
 };
 }
 出处:蓝色理想
责任编辑:bluehearts
 上一页 下一页 模拟兼容性的addDOMLoadEvent事件 [1] ◎进入论坛网页制作、WEB标准化版块参加讨论,我还想发表评论。
	      |