提取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之可拖动的iframe效果代码
Aug 01 Javascript
JavaScript严格模式禁用With语句的原因
Oct 20 Javascript
在React框架中实现一些AngularJS中ng指令的例子
Mar 06 Javascript
用JS实现简单的登录验证功能
Jul 28 Javascript
浅谈Node Inspector 代理实现
Oct 19 Javascript
Vue 页面跳转不用router-link的实现代码
Apr 12 Javascript
vue 组件使用中的一些细节点
Apr 25 Javascript
vue 国际化 vue-i18n 双语言 语言包
Jun 07 Javascript
jQuery判断自定义属性data-val用法示例
Jan 07 jQuery
JS校验与最终登陆界面功能完整示例
Jan 13 Javascript
基于Vue实现微前端的示例代码
Apr 24 Javascript
Node.js API详解之 os模块用法实例分析
May 06 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
压力如何影响浓缩咖啡品质
2021/03/03 咖啡文化
支持中文字母数字、自定义字体php验证码代码
2012/02/27 PHP
PHP实现过滤各种HTML标签
2015/05/17 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
CL vs ForZe BO5 第四场 2.13
2021/03/10 DOTA
javascript 原型继承介绍
2011/08/30 Javascript
JavaScript学习笔记之DOM基础 2.4
2015/08/14 Javascript
JQuery validate插件验证用户注册信息
2016/05/11 Javascript
js实现四舍五入完全保留两位小数的方法
2016/08/02 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
react 国际化的实现代码示例
2018/09/14 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
详解使用Nuxt.js快速搭建服务端渲染(SSR)应用
2019/03/13 Javascript
Angular中使用ng-zorro图标库部分图标不能正常显示问题
2019/04/22 Javascript
JavaScript Math对象和调试程序的方法分析
2019/05/13 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
Vue 使用beforeEach实现登录状态检查功能
2019/10/31 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
2020/07/22 Javascript
H5 js点击按钮复制文本到粘贴板
2020/11/19 Javascript
[53:03]Optic vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
使用Python发送邮件附件以定时备份MySQL的教程
2015/04/25 Python
python实现多线程行情抓取工具的方法
2018/02/28 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
numpy中的ndarray方法和属性详解
2019/05/27 Python
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
美国最佳选择产品网站:Best Choice Products
2019/05/27 全球购物
int和Integer有什么区别
2013/05/25 面试题
五一活动标语
2014/06/30 职场文书
中国梦演讲稿5分钟
2014/08/19 职场文书
电力培训心得体会
2014/09/02 职场文书
2015年法律事务部工作总结
2015/07/27 职场文书
同事欢送会致辞
2015/07/31 职场文书
MySQL的Query Cache图文详解
2021/07/01 MySQL
python之基数排序的实现
2021/07/26 Python
Web应用开发TypeScript使用详解
2022/05/25 Javascript