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 相关文章推荐
可以文本显示的公告栏的js代码
Mar 11 Javascript
JavaScript判断DOM何时加载完毕的技巧
Nov 11 Javascript
jquery如何判断某元素是否具备指定的样式
Nov 05 Javascript
JavaScript通过setTimeout实时显示当前时间的方法
Apr 16 Javascript
jquery实现页面常用的返回顶部效果
Mar 04 Javascript
Js与Jq获取浏览器和对象值的方法
Mar 18 Javascript
关于cookie的初识和运用(js和jq)
Apr 07 Javascript
再次谈论Javascript中的this
Jun 23 Javascript
JQuery异步提交表单与文件上传功能示例
Jan 12 Javascript
基于jquery日历价格、库存等设置插件
Jul 05 jQuery
快速搭建React的环境步骤详解
Nov 06 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
Jan 31 jQuery
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
星际争霸任务指南——神族
2020/03/04 星际争霸
解析php mysql 事务处理回滚操作(附实例)
2013/08/05 PHP
PHP输出缓存ob系列函数详解
2014/03/11 PHP
php提交post数组参数实例分析
2015/12/17 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
23个超流行的jQuery相册插件整理分享
2011/04/25 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
JavaScript学习笔记之DOM基础 2.4
2015/08/14 Javascript
好好了解一下Cookie(强烈推荐)
2016/06/14 Javascript
BootStrap实现树形目录组件代码详解
2016/06/21 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
Javascript实现图片懒加载插件的方法
2016/10/20 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
在React项目中使用Eslint代码检查工具及常见问题
2018/10/10 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
微信小程序加载机制及运行机制图解
2019/11/27 Javascript
JS异步宏队列与微队列原理区别详解
2020/07/02 Javascript
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
Python将字符串常量转化为变量方法总结
2019/03/17 Python
python画图——实现在图上标注上具体数值的方法
2019/07/08 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
Django搭建项目实战与避坑细节详解
2020/12/06 Python
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
HTML5中图片之间的缝隙完美解决方法
2017/07/07 HTML / CSS
购买澳大利亚最好的服装和内衣在线:BONDS
2016/10/14 全球购物
俄罗斯的精英皮具:Wittchen
2018/01/29 全球购物
阿迪达斯希腊官方网上商店:adidas希腊
2019/04/06 全球购物
介绍下java.util.Arrays类
2012/10/16 面试题
Java面试笔试题大全
2016/11/23 面试题
车间副主任岗位职责
2013/12/24 职场文书
2015年综治维稳工作总结
2015/04/07 职场文书
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android
Python测试框架pytest核心库pluggy详解
2022/08/05 Golang