window.onload 加载完毕的问题及解决方案(下)

在IE中还可以在onreadystatechange事件里进行判断等方法。

接上篇,其它方法: 
一、在IE中还可以在onreadystatechange事件里进行判断 
http://www.thefutureoftheweb.com/blog/adddomloadevent 
这里有Jesse Skinner写了一段独立的脚本函数来解决各种浏览器的onload问题,。 
http://img.jb51.net/jslib/adddomloadevent.js

复制代码代码如下:

/* 
* (c)2006 Jesse Skinner/Dean Edwards/Matthias Miller/John Resig 
* Special thanks to Dan Webb's domready.js Prototype extension 
* and Simon Willison's addLoadEvent 

* For more info, see: 
* http://www.thefutureoftheweb.com/blog/adddomloadevent 
* http://dean.edwards.name/weblog/2006/06/again/ 
* http://www.vivabit.com/bollocks/2006/06/21/a-dom-ready-extension-for-prototype 
* http://simon.incutio.com/archive/2004/05/26/addLoadEvent 


* To use: call addDOMLoadEvent one or more times with functions, ie: 

* function something() { 
* // do something 
* } 
* addDOMLoadEvent(something); 

* addDOMLoadEvent(function() { 
* // do other stuff 
* }); 

*/ 

addDOMLoadEvent = (function(){ 
// create event function stack 
var load_events = [], 
load_timer, 
script, 
done, 
exec, 
old_onload, 
init = function () { 
done = true; 

// kill the timer 
clearInterval(load_timer); 

// execute each function in the stack in the order they were added 
while (exec = load_events.shift()) 
exec(); 

if (script) script.onreadystatechange = ''; 
}; 

return function (func) { 
// if the init function was already ran, just run this function now and stop 
if (done) return func(); 

if (!load_events[0]) { 
// for Mozilla/Opera9 
if (document.addEventListener) 
document.addEventListener("DOMContentLoaded", init, false); 

// for Internet Explorer 
/*@cc_on @*/ 
/*@if (@_win32) 
document.write("<script id=__ie_onload defer src="//0" src="http://0"><\/scr"+"ipt>"); 
script = document.getElementById("__ie_onload"); 
script.onreadystatechange = function() { 
if (this.readyState == "complete") 
init(); // call the onload handler 
}; 
/*@end @*/ 

// for Safari 
if (/WebKit/i.test(navigator.userAgent)) { // sniff 
load_timer = setInterval(function() { 
if (/loaded|complete/.test(document.readyState)) 
init(); // call the onload handler 
}, 10); 


// for other browsers set the window.onload, but also execute the old window.onload 
old_onload = window.onload; 
window.onload = function() { 
init(); 
if (old_onload) old_onload(); 
}; 


load_events.push(func); 

})();

二、另外还有在IE中的doScroll的,这是种方法只对IE有作用,而且它是一种hack方法。 

在MSDN:About Element Behaviors 我们可以看到 
复制代码代码如下:

When the ondocumentready event fires, the document has been completely parsed and built. Initialization code should be placed here if the component needs to navigate the primary document structure. The ondocumentready event notifies the component that the entire page is loaded, and it fires immediately before the onload event fires in the primary document. 
A few methods, such as doScroll, require the primary document to be completely loaded. If these methods are part of an initialization function, they should be handled when the ondocumentready event fires. 

http://javascript.nwbox.com/IEContentLoaded/ 
复制代码代码如下:

/* 

* 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 reference 
function 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(); 

}; 


在jQuery的源码中,针对Mozilla, Opera 和webkit用的是DOMContentLoaded,也就是上一篇中第一种; 

而对IE用的是doScroll的方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值