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实现类似滑动门切换效果的层切换
Sep 23 Javascript
Js获取数组最大和最小值示例代码
Oct 29 Javascript
一个JavaScript的求爱小特效
May 09 Javascript
JavaScript实现文字与图片拖拽效果的方法
Feb 16 Javascript
设置jQueryUI DatePicker默认语言为中文
Jun 04 Javascript
利用AngularJs实现京东首页轮播图效果
Sep 08 Javascript
全屏滚动插件fullPage.js使用实例解析
Oct 21 Javascript
jQuery实现用户输入自动完成功能
Feb 13 Javascript
Vue入门之animate过渡动画效果
Apr 08 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
Feb 15 jQuery
解决nuxt页面中mounted、created、watch执行两遍的问题
Nov 05 Javascript
JavaScript实现雪花飘落效果
Dec 27 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
图片存储与浏览一例(Linux+Apache+PHP+MySQL)
2006/10/09 PHP
php查看session内容的函数
2008/08/27 PHP
PHP读取XML值的代码(推荐)
2011/01/01 PHP
php去除换行(回车换行)的三种方法
2014/03/26 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
2014/10/15 PHP
php使用Cookie实现和用户会话的方法
2015/01/21 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
PHP创建自己的Composer包方法
2018/04/09 PHP
PHP FileSystem 文件系统常用api整理总结
2019/07/12 PHP
JavaScript类和继承 constructor属性
2010/03/04 Javascript
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
JavaScript获取表单enctype属性的方法
2015/04/02 Javascript
angularjs封装bootstrap时间插件datetimepicker
2016/06/20 Javascript
AngularJs 国际化(I18n/L10n)详解
2016/09/01 Javascript
使用canvas实现一个vue弹幕组件功能
2018/11/30 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
2019/01/18 jQuery
vue多次循环操作示例
2019/02/08 Javascript
使用JavaScript解析URL的方法示例
2019/03/01 Javascript
jquery实现自定义树形表格的方法【自定义树形结构table】
2019/07/12 jQuery
vue单应用在ios系统中实现微信分享功能操作
2020/09/07 Javascript
用Python实现一个简单的多线程TCP服务器的教程
2015/05/05 Python
Python实现的爬虫功能代码
2017/06/24 Python
浅谈Django自定义模板标签template_tags的用处
2017/12/20 Python
Python实现进程同步和通信的方法
2018/01/02 Python
python3如何将docx转换成pdf文件
2018/03/23 Python
PYQT5实现控制台显示功能的方法
2019/06/25 Python
把django中admin后台界面的英文修改为中文显示的方法
2019/07/26 Python
Laravel框架表单验证格式化输出的方法
2019/09/25 Python
python 爬取马蜂窝景点翻页文字评论的实现
2020/01/20 Python
给 TensorFlow 变量进行赋值的方式
2020/02/10 Python
选购世界上最好的美妆品:Cult Beauty
2017/11/03 全球购物
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
Auguste The Label官网:澳大利亚一家精品女装时尚品牌
2020/06/14 全球购物
办公室文员工作自我鉴定
2014/09/19 职场文书
临时用工协议书范本
2014/10/29 职场文书
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
2022/04/24 Vue.js