提取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 相关文章推荐
ASP 过滤数组重复数据函数(加强版)
May 31 Javascript
合并table相同单元格的jquery插件分享(很精简)
Jun 20 Javascript
50款非常棒的 jQuery 插件分享
Mar 29 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
Mar 18 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
Oct 10 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
Dec 04 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
Sep 15 Javascript
理解javascript中try...catch...finally
Dec 25 Javascript
实例解析Array和String方法
Dec 14 Javascript
微信小程序之数据双向绑定与数据操作
May 12 Javascript
详解关于Vue2.0路由开启keep-alive时需要注意的地方
Sep 18 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
Oct 26 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
浅谈COOKIE和SESSION区别
2015/07/19 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
PHP fopen函数用法实例讲解
2019/02/15 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
HTML代码中标签的全部属性 中文注释说明
2009/03/26 Javascript
js插件方式打开pdf文件(浏览器pdf插件分享)
2013/12/20 Javascript
js判断一个字符串是以某个字符串开头的简单实例
2016/12/27 Javascript
vue如何使用 Slot 分发内容实例详解
2017/09/05 Javascript
Vue结合SignalR实现前后端实时消息同步
2017/09/19 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
Vue中props的使用详解
2018/06/15 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
使用JS获取页面上的所有标签
2018/10/18 Javascript
从零开始在NPM上发布一个Vue组件的方法步骤
2018/12/20 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
express框架下使用session的方法
2019/07/31 Javascript
jQuery带控制按钮轮播图插件
2020/07/31 jQuery
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
Python编程实战之Oracle数据库操作示例
2017/06/21 Python
详解python上传文件和字符到PHP服务器
2017/11/24 Python
python批量修改ssh密码的实现
2019/08/08 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
2019/10/12 Python
Django Admin设置应用程序及模型顺序方法详解
2020/04/01 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
python实例化对象的具体方法
2020/06/17 Python
keras的load_model实现加载含有参数的自定义模型
2020/06/22 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
2020/07/21 Python
CSS3控制HTML元素动画效果
2014/02/08 HTML / CSS
石油大学毕业生自荐信
2014/01/28 职场文书
《雨霖铃》听课反思
2014/02/13 职场文书
北体毕业生求职信
2014/02/28 职场文书
文明市民先进事迹
2014/05/15 职场文书
先进工作者主要事迹材料
2015/11/03 职场文书
幽默导游词应该怎么写?
2019/08/26 职场文书
Vue.js中v-for指令的用法介绍
2022/03/13 Vue.js