提取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 相关文章推荐
JS DOM 操作实现代码
Aug 01 Javascript
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
Feb 03 Javascript
用jquery模仿的a的title属性(兼容ie6/7)
Jan 21 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
Mar 04 Javascript
js由下向上不断上升冒气泡效果实例
May 07 Javascript
解析javascript瀑布流原理实现图片滚动加载
Mar 10 Javascript
jQuery图片左右滚动代码 有左右按钮实例
Jun 20 Javascript
微信小程序 css使用技巧总结
Jan 09 Javascript
vue2.0 + ele的循环表单及验证字段方法
Sep 18 Javascript
详解json串反转义(消除反斜杠)
Aug 12 Javascript
websocket4.0+typescript 实现热更新的方法
Aug 14 Javascript
JavaScript 去重和重复次数统计
Mar 31 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中操作ini配置文件的方法
2013/04/25 PHP
php实现简单洗牌算法
2013/06/18 PHP
php数组键值用法实例分析
2015/02/27 PHP
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
2016/03/03 PHP
php ajax实现文件上传进度条
2016/03/29 PHP
PHP实现Google plus的好友拖拽分组效果
2016/10/21 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
jQuery 处理表单元素的代码
2010/02/15 Javascript
js操作select控件的几种方法
2010/06/02 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
jquery异步跨域访问代码
2013/06/28 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
2016/12/08 Javascript
nodejs的压缩文件模块archiver用法示例
2017/01/18 NodeJs
Vue.js 60分钟快速入门教程
2017/03/28 Javascript
angularjs指令之绑定策略(@、=、&amp;)
2017/04/13 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
nodejs基于express实现文件上传的方法
2018/03/19 NodeJs
Vue 使用计时器实现跑马灯效果的实例代码
2019/07/11 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
2019/07/16 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
vue实现数字动态翻牌的效果(开箱即用)
2019/12/08 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
python通过shutil实现快速文件复制的方法
2015/03/14 Python
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
Python图形绘制操作之正弦曲线实现方法分析
2017/12/25 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
python thrift 实现 单端口多服务的过程
2020/06/08 Python
Python函数递归调用实现原理实例解析
2020/08/11 Python
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
出纳岗位职责
2013/11/09 职场文书
大学生思想汇报范文
2013/12/31 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
2022/04/24 Vue.js