提取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 相关文章推荐
Prototype使用指南之form.js
Jan 10 Javascript
23个Javascript弹出窗口特效整理
Feb 25 Javascript
JS 打印功能代码可实现打印预览、打印设置等
Oct 31 Javascript
浅谈javascript中的instanceof和typeof
Feb 27 Javascript
你有必要知道的25个JavaScript面试题
Dec 29 Javascript
Vue原理剖析 实现双向绑定MVVM
May 03 Javascript
vue-resource拦截器设置头信息的实例
Oct 27 Javascript
五步轻松实现JavaScript HTML时钟效果
Mar 25 Javascript
React和Vue中监听变量变化的方法
Nov 14 Javascript
vuex页面刷新后数据丢失的方法
Jan 17 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
Mar 29 Javascript
jQuery实现影院选座订座效果
Apr 13 jQuery
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
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
PHP中读写文件实现代码
2011/10/20 PHP
laravel5.6实现数值转换
2019/10/23 PHP
用javascript为页面添加天气显示实现思路及代码
2013/12/02 Javascript
Jquery实现的一种常用高亮效果示例代码
2014/01/28 Javascript
javascript中Date对象的getDay方法使用指南
2014/12/22 Javascript
jQuery mobile 移动web(6)
2015/12/20 Javascript
在JavaScript中调用Java类和接口的方法
2016/09/07 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
2017/07/10 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
JS简单实现数组去重的方法分析
2017/10/14 Javascript
vue cli升级webapck4总结
2018/04/04 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
微信小程序实现多选功能
2018/11/04 Javascript
Node使用Selenium进行前端自动化操作的代码实现
2019/10/10 Javascript
[04:29]2016国际邀请赛中国区预选赛Ehome战队教练采访
2016/06/27 DOTA
Python下使用Psyco模块优化运行速度
2015/04/05 Python
python使用smtplib模块通过gmail实现邮件发送的方法
2015/05/08 Python
python 美化输出信息的实例
2018/10/15 Python
Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例
2019/01/23 Python
Python 运行.py文件和交互式运行代码的区别详解
2019/07/02 Python
Django中使用极验Geetest滑动验证码过程解析
2019/07/31 Python
python可视化篇之流式数据监控的实现
2019/08/07 Python
python的移位操作实现详解
2019/08/21 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
2019/11/08 Python
使用Python快速打开一个百万行级别的超大Excel文件的方法
2021/03/02 Python
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
2014年圣诞节倒计时网页的制作过程
2014/12/05 HTML / CSS
党员公开承诺书
2014/03/25 职场文书
交心谈心活动总结
2015/05/11 职场文书
行政处罚听证告知书
2015/07/01 职场文书
创业开店,这样方式更合理
2019/08/26 职场文书
Vue实现动态查询规则生成组件
2021/05/27 Vue.js
如何通过简单的代码描述Angular父组件、子组件传值
2022/04/07 Javascript