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实现的基于金山词霸网络翻译的代码
Jan 15 Javascript
js Dialog 实践分享
Oct 22 Javascript
Javascript中call与apply的学习笔记
Sep 22 Javascript
AngularJS入门教程(二):AngularJS模板
Dec 06 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
Jul 27 Javascript
浅谈JavaScript中面向对象的的深拷贝和浅拷贝
Aug 01 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
Sep 28 Javascript
Bootstrap 轮播(Carousel)插件
Dec 26 Javascript
jquery之基本选择器practice(实例讲解)
Sep 30 jQuery
html中通过JS获取JSON数据并加载的方法
Nov 30 Javascript
深入理解Node内建模块和对象
Mar 12 Javascript
JavaScript实现网页留言板功能
Nov 23 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中文件缓存转内存缓存的方法
2011/12/06 PHP
Laravel 5框架学习之模型、控制器、视图基础流程
2015/04/08 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
JSQL 批量图片切换的实现代码
2010/05/05 Javascript
Javascript的getYear、getFullYear、getUTCFullYear异同分享
2011/11/30 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
Javascript学习笔记之 函数篇(二) : this 的工作机制
2014/06/24 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
2015/09/27 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
jQuery实现选中行变色效果(实例讲解)
2017/07/06 jQuery
微信小程序实现图片放大预览功能
2020/10/22 Javascript
vue中的计算属性的使用和vue实例的方法示例
2017/12/04 Javascript
JS中的JSON对象的定义和取值实现代码
2018/05/09 Javascript
axios如何取消重复无用的请求详解
2019/12/15 Javascript
vue中利用three.js实现全景图的完整示例
2020/12/07 Vue.js
Python之自动获取公网IP的实例讲解
2017/10/01 Python
PyQt5每天必学之QSplitter实现窗口分隔
2018/04/19 Python
Python机器学习库scikit-learn安装与基本使用教程
2018/06/25 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
python创建学生管理系统
2019/11/22 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
Appium+Python实现简单的自动化登录测试的实现
2021/01/26 Python
HTML5 LocalStorage 本地存储详细概括(多图)
2017/08/18 HTML / CSS
澳大利亚新奇小玩意网站:Yellow Octopus
2017/12/28 全球购物
德国高品质男装及配饰商城:Cultizm(Raw Denim原色牛仔裤)
2018/04/16 全球购物
delegate与普通函数的区别
2014/01/22 面试题
《天游峰的扫路人》教学反思
2014/04/25 职场文书
护理专业求职信
2014/06/15 职场文书
护士节演讲稿开场白
2014/08/25 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
2015中秋节晚会主持词
2015/07/01 职场文书
Go语言的协程上下文的几个方法和用法
2022/04/11 Golang
CSS 鼠标选中文字后改变背景色的实现代码
2023/05/21 HTML / CSS