有一些功能需求,需要在DOM载入时马上执行一些函数,但又不愿意仅为了这一个需求而引入整个JQuery库,于是就把jQuery的方法提取出来,单独使用了。

大家可以使用windows.onload事件,但onload在看来,就是页面上的东西(img,iframe等资源)全部都加载完毕后才能发生,如果页面内有大的图片的话,会在页面展现后好久时间后才执行。

如果只需要对DOM进行操作,那么这时就没必要等到页面全部加载了。我们需要更快的方法。Firefox有DOMContentLoaded事件可以轻松解决,可惜的就是IE没有。

MSDN关于JSCRIPT的一个方法有段不起眼的话,当页面DOM未加载完成时,调用doScroll方法时,会产生异常。那么我们反过来用,如果不异常,那么就是页面DOM加载完毕了。所以 对于Mozilla & Opera 浏览器,在dom树载入后有现成的 DOMContentLoaded 事件。对于Safari 浏览器,有document.onreadystatechange事件,当该触发时,如果 document.readyState=complete时,可视为dom树已经载入。

对于ie,当在iframe内时,同样有document.onreadystatechange事件,对于ie在非iframe内时,只有不断地通过能否执行doScroll判断dom是否加载完毕。

在本例中每间隔5毫秒尝试去执行 document.documentElement.doScroll('left')。在ie8下,貌视非iframe窗口也会有document.onreadystatechange事件,另外你也可以在构建自己的框架时使用此函数。

(function(){
var isReady=false; //判断onDOMReady方法是否已经被执行过
var readyList= [];//把需要执行的方法先暂存在这个数组里
var timer;//定时器句柄 ready=function(fn)
{
if (isReady )
fn.call( document);
else
readyList.push( function() { return fn.call(this);});
return this;
}
var onDOMReady=function(){
for(var i=0;i< readyList.length;i++)
{
readyList[i].apply(document);
}
readyList = null;
}
var bindReady = function(evt)
{
if(isReady) return;
isReady=true;
onDOMReady.call(window);
if(document.removeEventListener)
{
document.removeEventListener("DOMContentLoaded", bindReady, false);
}
else if(document.attachEvent)
{
document.detachEvent("onreadystatechange", bindReady);
if(window == window.top){
clearInterval(timer);
timer = null;
}
}
};
if(document.addEventListener){
document.addEventListener("DOMContentLoaded", bindReady, false);
}
else if(document.attachEvent)
{
document.attachEvent("onreadystatechange", function(){
if((/loaded|complete/).test(document.readyState))
bindReady();
});
if(window == window.top)
{
timer = setInterval(function(){
try
{
isReady||document.documentElement.doScroll('left');//在IE下用能否执行doScroll判断 dom是否加载完毕
}
catch(e)
{
return;
}
bindReady();
},5);
}
}
})();

使用方法如下:

ready(dosomething);//dosomething为已存在的函数
//也可以通过闭包来使用
ready(function(){
//这里是逻辑代码
});

最新文章

  1. Laravel与Repository Pattern(仓库模式)
  2. BI项目记笔记索引
  3. (转) Awesome - Most Cited Deep Learning Papers
  4. 【Mail】邮件的基础知识和原理
  5. Tomcat:bio nio 的设计
  6. 将kindeditor在线编辑器制作成smarty插件
  7. 如何在weka中连接数据库(转)
  8. poj 3177 Redundant Paths
  9. hdu 4607 树的直径
  10. HDU 2553 n皇后问题(回溯法)
  11. WebBrowser.ExecWB方法
  12. 2017-2-28 C#基础 数组
  13. redhat系列linux系统 修改主机名的正确方法
  14. request.getParameter和request.setAttribute/request.getAttribute
  15. tp引入header文件~
  16. IDEAL 中配置Tomcat的内存值
  17. Future、FutureTask实现原理浅析(源码解读)
  18. vue 使用font-awesome
  19. (玩起来)DAX/PowerBI系列 - 参数表(Parameter Table) - 多时间段数值对比
  20. 覆盖的面积 HDU - 1255(扫描线求面积交)

热门文章

  1. 003---socket介绍
  2. ccf201703-2 STLlist
  3. 动态规划(DP)算法
  4. 长沙Uber优步司机奖励政策(3月28日)
  5. Linq工具篇(1)&mdash;&mdash;使用LinqPad
  6. Deep Learning 之 最优化方法
  7. jmeter多用户登录跨线程组操作传值
  8. Fiddler安卓抓包详细教程
  9. Qt Charts实践
  10. Qt 实现在隐藏标题栏情况下,窗口的缩放(未成功)