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 相关文章推荐
在网页中屏蔽快捷键
Sep 06 Javascript
javascript cookie解码函数(兼容ff)
Mar 17 Javascript
js 弹出框 替代浏览器的弹出框
Oct 29 Javascript
js不能跳转到上一页面的问题解决方法
Mar 01 Javascript
初步使用Node连接Mysql数据库
Mar 03 Javascript
VueRouter导航守卫用法详解
Dec 25 Javascript
详解从买域名到使用pm2部署node.js项目全过程
Mar 07 Javascript
vue展示dicom文件医疗系统的实现代码
Aug 27 Javascript
微信小程序实现简单跑马灯效果
May 26 Javascript
vue实现PC端分辨率适配操作
Aug 03 Javascript
JavaScript缓动动画函数的封装方法
Nov 25 Javascript
javascript中Set、Map、WeakSet、WeakMap区别
Dec 24 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中使用asort进行中文排序失效的问题处理
2014/08/18 PHP
PHP进阶学习之Geo的地图定位算法详解
2019/06/19 PHP
遍历jquery对象的代码分享
2011/11/02 Javascript
理解JAVASCRIPT中hasOwnProperty()的作用
2013/06/05 Javascript
js判断屏幕分辨率的代码
2013/07/16 Javascript
js中prototype用法详细介绍
2013/11/14 Javascript
javascript放大镜效果的简单实现
2013/12/09 Javascript
jQuery拖拽 & 弹出层 介绍与示例
2013/12/27 Javascript
Jquery中的层次选择器与find()的区别示例介绍
2014/02/20 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
Vue.js每天必学之内部响应式原理探究
2016/09/07 Javascript
Vue学习之路之登录注册实例代码
2017/07/06 Javascript
使用svg实现动态时钟效果
2018/07/17 Javascript
nodejs实现用户登录路由功能
2019/05/22 NodeJs
vue点击页面空白处实现保存功能
2019/11/06 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
Python科学计算包numpy用法实例详解
2018/02/08 Python
Python发展史及网络爬虫
2019/06/19 Python
Python使用正则表达式分割字符串的实现方法
2019/07/16 Python
python3.6生成器yield用法实例分析
2019/08/23 Python
python中threading开启关闭线程操作
2020/05/02 Python
Keras在训练期间可视化训练误差和测试误差实例
2020/06/16 Python
Python如何截图保存的三种方法(小结)
2020/09/01 Python
你常见到的runtime exception
2016/09/05 面试题
你经历的项目中的SCM配置项主要有哪些?什么是配置项?
2013/11/04 面试题
儿科主治医生个人求职信
2013/09/23 职场文书
光电信息专业应届生求职信
2013/10/07 职场文书
房地产员工找工作的自我评价
2013/11/15 职场文书
大学生创业策划书
2014/02/02 职场文书
党支部班子“四风”问题自我剖析材料
2014/09/28 职场文书
保险公司反洗钱宣传活动总结
2015/05/08 职场文书
初婚未育证明样本
2015/06/18 职场文书
vue递归实现树形组件
2022/07/15 Vue.js
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers