原生JS实现DOM加载完成马上执行JS代码的方法


Posted in Javascript onSeptember 07, 2018

用原生JS我们经常使用window.onload事件来加载页面。但是window.onload是在页面元素都加载完毕后才执行,如果页面内有大的图片的话,会在页面展现后好久时间后才执行。所以有时我们需要在DOM载入时马上执行一些函数。jQuery提供了document.ready方法用来代替window.onload。但又不愿意仅为了这一个需求而引入整个JQuery库,于是就把jQuery的方法提取出来,单独使用了。

如果只需要对DOM进行操作,那么这时就没必要等到页面全部加载了。Firefox有DOMContentLoaded事件可以轻松解决,可惜的就是IE没有。

MSDN关于JSCRIPT的一个方法有段不起眼的话,当页面DOM未加载完成时,调用doScroll方法时,会产生异常。那么我们反过来用,如果不异常,那么就是页面DOM加载完毕了。所以 对于Mozilla & Opera 浏览器,在dom树载入后有现成的 DOMContentLoaded 事件。对于Safari 浏览器,有document.onreadystatechange事件,当该触发时,如果 document.readyState=complete时,可视为dom树已经载入。

对于ie,当在iframe内时,同样有document.onreadystatechange事件,对于ie在非iframe内时,只有不断地通过能否执行doScroll判断dom是否加载完毕。

在本例中每间隔5毫秒尝试去执行 document.documentElement.doScroll(‘left')。在ie8下,貌视非iframe窗口也会有 document.onreadystatechange事件,另外也可以在构建自己的框架时使用此函数。

(function(){
  var isReady=false; //判断onDOMReady方法是否已经被执行过
  var readyList= [];//把需要执行的方法先暂存在这个数组里
  var timer;//定时器句柄
 
  ready=function(fn)
  {
   if (isReady )
    fn.call( document);
   else
    readyList.push( function() { return fn.call(this);});
   return this;
  }
 
  var onDOMReady=function(){
   for(var i=0;i< readyList.length;i++)
   {
    readyList[i].apply(document);
   }
   readyList = null;
  }
 
  var bindReady = function(evt)
  {
   if(isReady) return;
   isReady=true;
   onDOMReady.call(window);
   if(document.removeEventListener)
   {
    document.removeEventListener("DOMContentLoaded", bindReady, false);
   }
   else if(document.attachEvent)
   {
    document.detachEvent("onreadystatechange", bindReady);
    if(window == window.top){
     clearInterval(timer);//事件发生后清除定时器
     timer = null;
    }
   }
  };
 
  if(document.addEventListener){
   document.addEventListener("DOMContentLoaded", bindReady, false);
  }
  else if(document.attachEvent)//非最顶级父窗口
 
  {
   document.attachEvent("onreadystatechange", function(){
    if((/loaded|complete/).test(document.readyState))
    bindReady();
   });
 
  if(window == window.top)//在应用有frameset或者iframe的页面时,parent是父窗口,top是最顶级父窗口(有的窗口中套了好几层frameset或者iframe)
  {
   timer = setInterval(function(){
    try
    {
     isReady||document.documentElement.doScroll('left');//在IE下用能否执行doScroll判断 dom是否加载完毕
    }
    catch(e)
    {
     return;
    }
    bindReady();
   },5);
  }
  }
 })();

下面是使用方法:

ready(dosomething);//dosomething为已存在的函数
 //也可以通过闭包来使用
 ready(function(){
  //这里是逻辑代码
 });

以上这篇原生JS实现DOM加载完成马上执行JS代码的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Js动态创建div
Sep 25 Javascript
js 页面执行时间计算代码
Mar 04 Javascript
javascript 特性检测并非浏览器检测
Jan 15 Javascript
学习JavaScript设计模式之状态模式
Jan 08 Javascript
jQuery获取父元素节点、子元素节点及兄弟元素节点的方法
Apr 14 Javascript
Javascript HTML5 Canvas实现的一个画板
Apr 12 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
Jul 24 Javascript
Vue.js进阶知识点总结
Apr 01 Javascript
微信小程序嵌入腾讯视频源过程详解
Aug 08 Javascript
javascript 原型与原型链的理解及实例分析
Nov 23 Javascript
Bootstrap实现前端登录页面带验证码功能完整示例
Mar 26 Javascript
Vuejs通过拖动改变元素宽度实现自适应
Sep 02 Javascript
vue加载完成后的回调函数方法
Sep 07 #Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
Sep 07 #Javascript
VUE DOM加载后执行自定义事件的方法
Sep 07 #Javascript
详解JavaScript事件循环机制
Sep 07 #Javascript
解决vue 引入子组件报错的问题
Sep 06 #Javascript
解决vue v-for 遍历循环时key值报错的问题
Sep 06 #Javascript
vue 解决循环引用组件报错的问题
Sep 06 #Javascript
You might like
php读取远程gzip压缩网页的方法
2014/12/29 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
jQuery中调用WebService方法小结
2011/03/28 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
Javascript基础教程之关键字和保留字汇总
2015/01/18 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
用JS写的一个Ajax库(实例代码)
2016/08/06 Javascript
JS实现图片局部放大或缩小的方法
2016/08/20 Javascript
Bootstrap学习笔记之环境配置(1)
2016/12/07 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
2018/01/02 Javascript
Angular父组件调用子组件的方法
2018/04/02 Javascript
JavaScript创建对象的四种常用模式实例分析
2019/01/11 Javascript
vue组件中watch props根据v-if动态判断并挂载DOM的问题
2019/05/12 Javascript
微信小程序 获取手机号 JavaScript解密示例代码详解
2020/05/14 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
[10:24]郎朗助力完美“圣”典,天籁交织奏响序曲
2016/12/18 DOTA
django之常用命令详解
2016/06/30 Python
使用python绘制常用的图表
2016/08/27 Python
详谈在flask中使用jsonify和json.dumps的区别
2018/03/26 Python
Pandas实现数据类型转换的一些小技巧汇总
2018/05/07 Python
selenium+python自动化测试之页面元素定位
2019/01/23 Python
python turtle库画一个方格和圆实例
2019/06/27 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
阿里健康大药房:阿里自营网上药店
2017/08/01 全球购物
寒假实习自荐信
2014/01/26 职场文书
销售总经理岗位职责
2014/03/15 职场文书
五四演讲稿范文
2014/09/03 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
2015年办公室主任工作总结
2015/04/09 职场文书
同意转租证明
2015/06/24 职场文书
四群教育工作总结
2015/08/10 职场文书
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技