原生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 相关文章推荐
JavaScript 权威指南(第四版) 读书笔记
Aug 11 Javascript
jquery 插件实现图片延迟加载效果代码
Feb 06 Javascript
基于jQuery替换table中的内容并显示进度条的代码
Aug 02 Javascript
基于JavaScript实现网页倒计时自动跳转代码
Dec 28 Javascript
Bootstrap select实现下拉框多选效果
Dec 23 Javascript
jquery PrintArea 实现票据的套打功能(代码)
Mar 17 Javascript
jQuery中用on绑定事件时需注意的事项
Mar 19 Javascript
微信小程序中form 表单提交和取值实例详解
Apr 20 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
Jul 21 Javascript
webpack 模块热替换原理
Apr 09 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
Aug 04 Javascript
js实现随机抽奖
Mar 19 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
人族 TERRAN 概述
2020/03/14 星际争霸
如何分别全角和半角以避免乱码
2006/10/09 PHP
PHP 变量定义和变量替换的方法
2009/07/30 PHP
php操作JSON格式数据的实现代码
2011/12/24 PHP
让PHP显示Facebook的粉丝数量方法
2014/01/08 PHP
php使用类继承解决代码重复的问题
2015/02/11 PHP
PHP定时任务获取微信access_token的方法
2016/10/10 PHP
PHP实现统计在线人数功能示例
2016/10/15 PHP
PHP微信企业号开发之回调模式开启与用法示例
2017/11/25 PHP
通过继承IHttpHandle实现JS插件的组织与管理
2010/07/13 Javascript
js的隐含参数(arguments,callee,caller)使用方法
2014/01/28 Javascript
JavaScript将字符串转换成字符编码列表的方法
2015/03/19 Javascript
jquery移动端TAB触屏切换实现效果
2020/12/22 Javascript
JS拖拽组件学习使用
2016/01/19 Javascript
微信小程序左滑删除效果的实现代码
2017/02/20 Javascript
基于JavaScript实现瀑布流效果
2017/03/29 Javascript
原生JS发送异步数据请求
2017/06/08 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
2017/07/27 Javascript
angularjs实现简单的购物车功能
2017/09/21 Javascript
微信小程序 动画的简单实例
2017/10/12 Javascript
微信小程序倒计时功能实现代码
2017/11/09 Javascript
vue实现短信验证码登录功能(流程详解)
2019/12/10 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
2020/05/11 Javascript
[48:05]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VGJ.T vs VP
2018/03/31 DOTA
[09:40]DAC2018 4.5 SOLO赛 MidOne vs Miracle
2018/04/06 DOTA
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
Python实现的IP端口扫描工具类示例
2019/02/15 Python
Python实现查找字符串数组最长公共前缀示例
2019/03/27 Python
一夜的工作教学反思
2014/02/08 职场文书
优秀毕业生自我鉴定
2014/02/11 职场文书
商业融资计划书
2014/04/29 职场文书
2015年煤矿工作总结
2015/04/28 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书
redis限流的实际应用
2021/04/24 Redis
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js