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获取url参数的使用扩展实例
Dec 29 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
Nov 19 Javascript
jQuery插件slides实现无缝轮播图特效
Apr 17 Javascript
深入分析javascript中console命令
Aug 14 Javascript
详解React Native网络请求fetch简单封装
Aug 10 Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
Nov 12 Javascript
原生js代码能实现call和bind吗
Jul 31 Javascript
解决一个微信号同时支持多个环境网页授权问题
Aug 07 Javascript
修改Vue打包后的默认文件名操作
Aug 12 Javascript
Vue-cli4 配置 element-ui 按需引入操作
Sep 11 Javascript
jQuery实现简单轮播图效果
Dec 27 jQuery
原生js实现自定义滚动条
Jan 20 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+ajax登录跳转登录实现思路
2016/07/31 PHP
PHP多进程简单实例小结
2019/11/09 PHP
分享10个优化代码的CSS和JavaScript工具
2016/05/11 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
浅谈关于axios和session的一些事
2017/07/13 Javascript
微信小程序视图template模板引用的实例详解
2017/09/20 Javascript
jQuery实现的简单动态添加、删除表格功能示例
2017/09/21 jQuery
vue router学习之动态路由和嵌套路由详解
2017/09/21 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
vue elementUI 表单校验的实现代码(多层嵌套)
2019/11/06 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
2020/07/20 Javascript
vue 实现锚点功能操作
2020/08/10 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
[03:55]DOTA2完美大师赛选手传记——LFY.MONET
2017/11/18 DOTA
Python urllib模块urlopen()与urlretrieve()详解
2013/11/01 Python
Python 字符串操作方法大全
2014/03/11 Python
python实现数组插入新元素的方法
2015/05/22 Python
python图像处理之反色实现方法
2015/05/30 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
2017/05/03 Python
利用python如何处理百万条数据(适用java新手)
2018/06/06 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
2018/10/17 Python
python中的单引号双引号区别知识点总结
2019/06/23 Python
Python函数中的可变长参数详解
2019/09/12 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
2019/11/26 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
Selenium常见异常解析及解决方案示范
2020/04/10 Python
python实现Oracle查询分组的方法示例
2020/04/30 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
Qoo10台湾站:亚洲领先的在线市场
2018/05/15 全球购物
PHP如何删除一个Cookie值
2012/11/15 面试题
中国文明网签名寄语
2014/01/18 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
好人好事新闻稿
2015/07/17 职场文书
初一军训感言
2015/08/01 职场文书
公司员工奖惩制度
2015/08/04 职场文书