提取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 相关文章推荐
JQuery 常用方法基础教程
Feb 06 Javascript
IE浏览器打印的页眉页脚设置解决方法
Dec 08 Javascript
javascript new一个对象的实质
Jan 07 Javascript
javascript中encodeURI和decodeURI方法使用介绍
May 06 Javascript
javaScript实现滚动新闻的方法
Jul 30 Javascript
一篇文章掌握RequireJS常用知识
Jan 26 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
Jun 12 Javascript
Mvc提交表单的四种方法全程详解
Aug 10 Javascript
微信开发 js实现tabs选项卡效果
Oct 28 Javascript
Angular2使用Angular-CLI快速搭建工程(二)
May 21 Javascript
vue.js项目中实用的小技巧汇总
Nov 29 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
Aug 03 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和javascript之间变量的传递实现代码
2012/12/19 PHP
php实现二进制和文本相互转换的方法
2015/04/18 PHP
最新版本PHP 7 vs HHVM 多角度比较
2016/02/14 PHP
PHP/ThinkPHP实现批量打包下载文件的方法示例
2017/07/31 PHP
HR vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
jquery 问答知识整理
2010/02/11 Javascript
使用jQuery轻松实现Ajax的实例代码
2010/08/16 Javascript
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
2012/08/14 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
鼠标选择动态改变网页背景颜色的JS代码
2013/12/10 Javascript
js获取和设置属性的方法
2014/02/20 Javascript
node.js中watch机制详解
2014/11/17 Javascript
javascript实现实时输出当前的时间
2015/04/27 Javascript
JavaScript使用位运算符判断奇数和偶数的方法
2015/06/01 Javascript
基于JS代码实现图片在页面中旋转效果
2016/06/16 Javascript
JavaScript解析JSON格式数据的方法示例
2017/01/24 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
原生js实现each方法实例代码详解
2019/05/27 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
ES6中Promise的使用方法实例总结
2020/02/18 Javascript
JavaScript享元模式原理与用法实例详解
2020/03/09 Javascript
JS实现多选框的操作
2020/06/24 Javascript
javascript+css实现俄罗斯方块小游戏
2020/06/28 Javascript
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
使用coverage统计python web项目代码覆盖率的方法详解
2019/08/05 Python
自定义django admin model表单提交的例子
2019/08/23 Python
python matplotlib拟合直线的实现
2019/11/19 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
GUESS Factory加拿大:牛仔裤、服装及配饰
2019/09/20 全球购物
祖国在我心中的演讲稿
2014/05/04 职场文书
小型婚礼主持词
2015/06/30 职场文书
MySQL一些常用高级SQL语句
2021/07/03 MySQL
详解MySql中InnoDB存储引擎中的各种锁
2022/02/12 MySQL