提取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 相关文章推荐
浅谈JavaScript之事件绑定
Jul 08 Javascript
JavaScript中匿名函数用法实例
Mar 23 Javascript
Bootstrap布局之栅格系统详解
Jun 13 Javascript
js判断checkbox是否选中个数的方法(超简单)
Aug 19 Javascript
js实现楼层导航功能
Feb 23 Javascript
angular-ngSanitize模块-$sanitize服务详解
Jun 13 Javascript
JS实现的简单表单验证功能完整实例
Oct 14 Javascript
Js利用prototype自定义数组方法示例
Oct 20 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
Nov 06 Javascript
详解如何理解vue的key属性
Apr 14 Javascript
详解mpvue开发微信小程序基础知识
Sep 23 Javascript
vue npm install 安装某个指定的版本操作
Aug 11 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简单的留言板与回复功能具体实现
2014/02/19 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
2017/04/19 PHP
自制PHP框架之设计模式
2017/05/07 PHP
使用Laravel中的查询构造器实现增删改查功能
2019/09/03 PHP
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
2013/01/23 Javascript
你必须知道的Javascript知识点之&quot;this指针&quot;的应用
2013/04/23 Javascript
浅析LigerUi开发中谨慎载入common.css文件
2013/07/09 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
分享2个jQuery插件--jquery.fileupload与artdialog
2014/12/26 Javascript
详解maxlength属性在textarea里奇怪的表现
2015/12/27 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
Bootstrap轮播图学习使用
2017/02/10 Javascript
JS实现直接运行html代码的方法
2017/03/13 Javascript
基于Vuejs和Element的注册插件的编写方法
2017/07/03 Javascript
jQuery 改变P标签文本值方法
2018/02/24 jQuery
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
CKeditor富文本编辑器使用技巧之添加自定义插件的方法
2019/06/14 Javascript
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
Python中的模块导入和读取键盘输入的方法
2015/10/16 Python
Python使用requests提交HTTP表单的方法
2018/12/26 Python
PyTorch使用cpu加载模型运算方式
2020/01/13 Python
jupyternotebook 撤销删除的操作方式
2020/04/17 Python
python字符串的index和find的区别详解
2020/06/20 Python
运行Python编写的程序方法实例
2020/10/21 Python
屈臣氏官方旗舰店:亚洲享负盛名的保健及美妆零售商
2019/03/15 全球购物
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
本科毕业生求职自荐信
2014/02/03 职场文书
巾帼文明岗申报材料
2014/05/01 职场文书
基层党建工作汇报材料
2014/08/15 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
化学专业大学生职业生涯规划范文
2014/09/13 职场文书
人为什么会“幸灾乐祸”?
2019/08/06 职场文书
python爬虫selenium模块详解
2021/03/30 Python
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
2022/04/13 Java/Android