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 相关文章推荐
javascript实现动态增加删除表格行(兼容IE/FF)
Apr 02 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
Dec 31 Javascript
jQuery 文本框得失焦点的简单实例
Feb 19 Javascript
利用函数的惰性载入提高javascript代码执行效率
May 05 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
Apr 17 Javascript
原生JS封装animate运动框架的实例
Oct 12 Javascript
JavaScript实现修改伪类样式
Nov 27 Javascript
详解vue组件开发脚手架
Jun 15 Javascript
微信小程序实现折叠展开效果
Jul 19 Javascript
如何让node运行es6模块文件及其原理详解
Dec 11 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
Mar 25 Javascript
如何用JS模拟实现数组的map方法
Jul 30 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读取目录下所有文件的代码
2008/01/07 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
2014/04/30 PHP
php检索或者复制远程文件的方法
2015/03/13 PHP
CodeIgniter基于Email类发邮件的方法
2016/03/29 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
2019/09/30 PHP
收藏Javascript中常用的55个经典技巧
2007/08/12 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
基于jQuery实现动态搜索显示功能
2016/05/05 Javascript
JavaScript——DOM操作——Window.document对象详解
2016/07/14 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
微信小程序 动态绑定数据及动态事件处理
2017/03/14 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
2017/05/11 Javascript
jQuery.extend 与 jQuery.fn.extend的用法及区别实例分析
2018/07/25 jQuery
JavaScript学习笔记之基于定时器实现图片无缝滚动功能详解
2019/01/09 Javascript
JS使用数组实现的队列功能示例
2019/03/04 Javascript
详解在React项目中安装并使用Less(用法总结)
2019/03/18 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
Vue scoped及deep使用方法解析
2020/08/01 Javascript
[46:58]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第一场 12.17
2020/12/19 DOTA
在Django的模型和公用函数中使用惰性翻译对象
2015/07/27 Python
python编程实现希尔排序
2017/04/13 Python
python 如何引入协程和原理分析
2020/11/30 Python
移动web模拟客户端实现多方框输入密码效果【附代码】
2016/03/25 HTML / CSS
html5需遵循的6个设计原则
2016/04/27 HTML / CSS
全球领先美式家具品牌:Ashley爱室丽家居
2017/08/07 全球购物
学生个人求职自荐信格式
2013/09/23 职场文书
后勤副校长自我鉴定
2013/10/13 职场文书
幼儿园校车司机的岗位职责
2014/01/30 职场文书
电气个人求职信范文
2014/02/04 职场文书
学雷锋演讲稿
2014/03/04 职场文书
销售顾问工作计划书
2014/09/15 职场文书
2014年业务员工作总结范文
2014/11/17 职场文书
2016廉政教育学习心得体会
2016/01/25 职场文书
微信小程序中使用vant框架的具体步骤
2022/02/18 Javascript
Python中with上下文管理协议的作用及用法
2022/03/18 Python
让JavaScript代码更加精简的方法技巧
2022/06/01 Javascript