提取jquery的ready()方法单独使用示例


Posted in Javascript onMarch 25, 2014

大家可以使用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(){
 //这里是逻辑代码
});
Javascript 相关文章推荐
ExtJS 下拉多选框lovcombo
May 19 Javascript
JS异常处理的一个想法(sofish)
Mar 14 Javascript
IE8对JS通过属性和数组遍历解析不一样的地方探讨
May 06 Javascript
JS日期格式化之javascript Date format
Oct 01 Javascript
js实现密码强度检测【附示例】
Mar 30 Javascript
如何使用jquery修改css中带有!important的样式属性
Apr 28 Javascript
分享10个优化代码的CSS和JavaScript工具
May 11 Javascript
JS实现的跨浏览器解析XML文件实例
Jun 21 Javascript
JavaScript设计模式之策略模式详解
Jun 09 Javascript
JS去掉字符串中所有的逗号
Oct 18 Javascript
基于JavaScript获取base64图片大小
Oct 18 Javascript
Vue 实现分页与输入框关键字筛选功能
Jan 02 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
Mar 25 #Javascript
jquery解析xml字符串示例分享
Mar 25 #Javascript
jquery数组封装使用方法分享(jquery数组遍历)
Mar 25 #Javascript
jquery选择器原理介绍($()使用方法)
Mar 25 #Javascript
Jquery插件编写简明教程
Mar 25 #Javascript
jquery自动填充勾选框即把勾选框打上true
Mar 24 #Javascript
jquery默认校验规则整理
Mar 24 #Javascript
You might like
如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量的
2007/03/06 PHP
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
2015/03/26 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
javascript类继承机制的原理分析
2009/09/12 Javascript
几个比较实用的JavaScript 测试及效验工具
2010/04/18 Javascript
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
2015/03/18 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
2016/03/09 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
2016/12/19 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
2017/01/04 Javascript
Vue数据驱动模拟实现4
2017/01/12 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
2017/01/14 Javascript
xmlplus组件设计系列之分隔框(DividedBox)(8)
2017/05/02 Javascript
浅谈JavaScript的innerWidth与innerHeight
2017/10/12 Javascript
说说Vue.js中的functional函数化组件的使用
2019/02/12 Javascript
vue中封装axios并实现api接口的统一管理
2020/12/25 Vue.js
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
Python的高级Git库 Gittle
2014/09/22 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
2016/05/05 Python
Python中enumerate函数代码解析
2017/10/31 Python
python使用mysql的两种使用方式
2018/03/07 Python
利用python如何处理百万条数据(适用java新手)
2018/06/06 Python
python实现吃苹果小游戏
2020/03/21 Python
pyqt5中动画的使用详解
2020/04/01 Python
Python实现异步IO的示例
2020/11/05 Python
Python xlwings插入Excel图片的实现方法
2021/02/26 Python
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
写出二分查找算法的两种实现
2013/05/13 面试题
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
中学生班主任评语
2014/01/30 职场文书
小学清明节活动方案
2014/03/08 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
小学生综合素质评语
2014/04/23 职场文书
捐款倡议书怎么写
2014/05/13 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书