domReady的实现案例


Posted in Javascript onNovember 23, 2016

我们都知道JQ的 $(document).ready(fn) 方法。可以在页面准备就绪后才执行脚本,该方法相比传统的window.onload 事件,它的优势体现于onload事件是需要等到页面中所有资源都加载完毕后才会触发,而JQ的ready方法则会判断DOM树是否构建完毕。

onload相比较onreadystate事件的区别是,onreadystatechange事件是IE独有的,并且在IE11之后不再支持,该事件是IE浏览器为特定的需要判断资源加载的DOM元素指定的事件。

支持onreadystatechange事件的DOM元素必然有一个readyState属性,该属性的返回值,用于说明资源的加载情况。

一般而言,onreadystatechange事件更多用于Iframe的加载判断。

最后我们需要了解的是当页面包含iframe后,DOM树的生成,以及DOMContentLoaded事件的触发,onload事件的触发,其流程对于IE非IE是不同的。

一般来说:

IE :解析index页面 -> 解析iframe页面 -> 触发iframe的DOMContentLoaded事件 -> 触发iframe页面 onload事件 -> 触发Index页面的DOMContentLoaded事件 -> 触发index页面的onload事件。

!IE:解析index页面 -> 触发index页面的DOMContentLoaded事件 -> 解析iframe页面 -> 触发iframe页面的DOMContentLoaded事件 -> 触发iframe的onload事件 -> 触发index页面的onload事件。

从这个流程,我们可以看出IE中,必须等待当前页面的iframe加载解析完毕,当前页面才能加载解析完毕,而在非IE中,iframe的加载与解析对当前页面来言更多的是异步执行。

下面是具体的代码:

(function(win){

  'use strict';

  var document = win.document,
    readList = [],    // 等待执行的函数堆栈
    flag = false;

  var removeEvent = function(){

    if(document.addEventListenner){
      window.removeEventListenner('load',handle,false);
    }else if(document.attachEvent){
      window.detachEvent('onload',handle)
      document.detachEvent('onreadystatechange',readyState);
    }else{
      window.onload = null;
    }

  },
  handle = function(){

    if(!flag){
      
      while(readList.length){  
        readList[0].call();  //执行函数
        readList.shift();  //删除第一个数组元素
      }
      flag = true;
      removeEvent();
    }

  },
  readyState = function(){
    if(document.readyState == 'complete'){
      handle();
    }  
  },
  DOMContentloaded=function(){

    if(document.readyState == 'complete'){
      setTimeout(handle);  // setTimeout 会使用最短时间,该时间不同系统并不一样。
    }else if(document.addEventListenner){
      document.addEventListenner('DOMContentLoaded',fn,false);
      window.addEventListenner('load',handle,false);
    }else if(document.attachEvent){
      window.attachEvent('onload',handle);
      document.attachEvent('onreadystatechange',readyState);  //onreadystatechange 事件在页面中含有iframe的时候,它会等待iframe加载完毕才会触发。
      
      if(self === self.top){  // 当页面不在iframe中则使用此种方式检测doScroll方法是否可用。如果再iframe中则用onreadstatechange事件进行判断。
        (function(){
          try{
            document.documentElement.doScroll('left');
          }catch(e){
            setTimeout(arguments.callee,50);  //arguments.callee 是对当前函数的引用。
            return ;
          }
          handle();
        }());
      }

    }else{
      window.onload = handle;
    }
  },
  ready = function(fn){
    readList.push(fn);  // 加入待处理的堆栈中。
    DOMContentloaded();
  };

  win.domReady = ready;


}(window));

代码调用:

domReady(function(){
   document.getElementById('box').innerHTML = (new Date().getTime() - date)/1000;
 });

以上这篇domReady的实现案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jquery的finkyUI插件与Ajax实现页面数据加载功能
Dec 03 Javascript
解决遍历时Array.indexOf产生的性能问题
Jul 03 Javascript
js面向对象之静态方法和静态属性实例分析
Jan 10 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
Jan 04 Javascript
微信小程序 css使用技巧总结
Jan 09 Javascript
在Vue-cli里应用Vuex的state和mutations方法
Sep 16 Javascript
JavaScript实现轮播图特效
Apr 10 Javascript
el-table树形表格表单验证(列表生成序号)
May 31 Javascript
vue实现PC端分辨率适配操作
Aug 03 Javascript
jQuery实现可以计算进制转换的计算器
Oct 19 jQuery
JavaScript动态生成表格的示例
Nov 02 Javascript
JS数据类型分类及常用判断方法
Nov 19 Javascript
BootStrap按钮标签及基本样式
Nov 23 #Javascript
JavaScript仿百度图片浏览效果
Nov 23 #Javascript
Asp.Net之JS生成分页条的方法
Nov 23 #Javascript
javascript判断firebug是否开启的方法
Nov 23 #Javascript
JavaScript表单验证开发
Nov 23 #Javascript
JavaScript实现垂直向上无缝滚动特效代码
Nov 23 #Javascript
分类解析jQuery选择器
Nov 23 #Javascript
You might like
php获取、检查类名、函数名、方法名的函数方法
2015/06/25 PHP
解决Laravel blade模板转义html标签的问题
2019/09/03 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
浅析js中的浮点型运算问题
2014/01/06 Javascript
js利用数组length属性清空和截短数组的小例子
2014/01/15 Javascript
JS中的构造函数详细解析
2014/03/10 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
jquery插件orbit.js实现图片折叠轮换特效
2015/04/14 Javascript
vue.js移动端app之上拉加载以及下拉刷新实战
2017/09/11 Javascript
使用 Vue 绑定单个或多个 Class 名的实例代码
2018/01/08 Javascript
详解react native页面间传递数据的几种方式
2018/11/07 Javascript
巧妙运用v-model实现父子组件传值的方法示例
2019/04/07 Javascript
mpvue网易云短信接口实现小程序短信登录的示例代码
2020/04/03 Javascript
Python字符串和字典相关操作的实例详解
2017/09/23 Python
分析Python读取文件时的路径问题
2018/02/11 Python
PyQt5每天必学之带有标签的复选框
2018/04/19 Python
Pandas DataFrame 取一行数据会得到Series的方法
2018/11/10 Python
在python中按照特定顺序访问字典的方法详解
2018/12/14 Python
基于python实现KNN分类算法
2020/04/23 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
基于Pytorch SSD模型分析
2020/02/18 Python
Python内存映射文件读写方式
2020/04/24 Python
python实现磁盘日志清理的示例
2020/11/05 Python
Canal官网:巴西女性时尚品牌
2019/10/16 全球购物
PHP如何防止SQL注入
2014/05/03 面试题
致跳远、跳高运动员广播稿
2014/01/09 职场文书
理工类毕业自我鉴定
2014/02/20 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
买房协议书范本
2014/10/23 职场文书
跑出一片天观后感
2015/06/08 职场文书
团队合作精神学习心得体会
2016/01/19 职场文书
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android