提取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闭包的理解和实例
Aug 12 Javascript
JavaScript必知必会(十) call apply bind的用法说明
Jun 08 Javascript
微信小程序 教程之模板
Oct 18 Javascript
关于Function中的bind()示例详解
Dec 02 Javascript
详解Weex基于Vue2.0开发模板搭建
Mar 20 Javascript
原生javascript实现文件异步上传的实例讲解
Oct 26 Javascript
基于webpack.config.js 参数详解
Mar 20 Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
Mar 26 Javascript
vue axios 简单封装以及思考
Oct 09 Javascript
详解Vue源码学习之双向绑定
Apr 10 Javascript
jQuery实现鼠标移入显示蒙版效果
Jan 11 jQuery
详解vue中v-model和v-bind绑定数据的异同
Aug 10 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读取30天之内的根据算法排序的代码
2008/04/06 PHP
PHP 批量更新网页内容实现代码
2010/01/05 PHP
谷歌音乐搜索栏的提示功能php修正代码
2011/05/09 PHP
PHP删除HTMl标签的实现代码
2013/06/30 PHP
PHP处理postfix邮件内容的方法
2015/06/16 PHP
CI框架入门之MVC简单示例
2016/11/21 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
windows环境下使用Composer安装ThinkPHP5
2018/05/18 PHP
Aster vs Newbee BO3 第二场2.18
2021/03/10 DOTA
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
js实现不提交表单获取单选按钮值的方法
2015/08/21 Javascript
js制作支付倒计时页面
2016/10/21 Javascript
jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承
2016/12/06 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
node.js操作MongoDB的实例详解
2017/10/11 Javascript
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
React实现轮播效果
2020/08/25 Javascript
uni-app 自定义底部导航栏的实现
2020/12/11 Javascript
selenium3+python3环境搭建教程图解
2018/12/07 Python
Python单元测试与测试用例简析
2019/11/09 Python
Python使用指定字符长度切分数据示例
2019/12/05 Python
python 实现两个npy档案合并
2020/07/01 Python
python 自定义异常和主动抛出异常(raise)的操作
2020/12/11 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
La Redoute英国官网:法国时尚品牌
2017/04/27 全球购物
荷兰超市:DEEN
2018/03/14 全球购物
澳大利亚顶级美发和美容贸易超市:glamaCo
2020/01/19 全球购物
中学生学习生活的自我评价
2013/10/26 职场文书
小学生获奖感言范文
2014/02/02 职场文书
政风行风建设责任书
2014/07/23 职场文书
2016形势与政策学习心得体会
2016/01/12 职场文书
python基于tkinter制作下班倒计时工具
2021/04/28 Python
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
2021/05/25 Vue.js
「SHOW BY ROCK!!」“雫シークレットマインド”组合单曲MV公开
2022/03/21 日漫
V Rising 服务器搭建图文教程
2022/06/16 Servers