原生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 相关文章推荐
基于jQuery的history历史记录插件
Dec 11 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
Apr 01 Javascript
jQuery CSS()方法改变现有的CSS样式
Aug 20 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
Dec 14 Javascript
原生js实现水平方向无缝滚动
Jan 10 Javascript
jQuery中map函数的两种方式
Apr 07 jQuery
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
May 01 jQuery
javascript数组拍平方法总结
Jan 20 Javascript
js自定义input文件上传样式
Oct 26 Javascript
详解Nuxt.js 实战集锦
Nov 19 Javascript
vue基于better-scroll仿京东分类列表
Jun 30 Javascript
微信小程序实现天气预报功能(附源码)
Dec 10 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中文分词的简单实现代码分享
2011/07/17 PHP
学习使用curl采集curl使用方法
2012/01/11 PHP
PHP的mysqli_stmt_init()函数讲解
2019/01/24 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
doctype后如何获得body.clientHeight的方法
2007/07/11 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
JS关键字变色实现思路及代码
2013/02/21 Javascript
可选择和输入的下拉列表框示例
2013/11/05 Javascript
js插件方式打开pdf文件(浏览器pdf插件分享)
2013/12/20 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
js实现点击获取验证码倒计时效果
2021/01/28 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
Angular2安装angular-cli
2017/05/21 Javascript
php main 与 iframe 相互通讯类(js+php同域/跨域)
2017/09/14 Javascript
VUE写一个简单的表格实例
2019/08/06 Javascript
微信小程序登陆注册功能的实现代码
2019/12/10 Javascript
vue3.0+vue-router+element-plus初实践
2020/12/02 Vue.js
JavaScript this关键字的深入详解
2021/01/14 Javascript
python回溯法实现数组全排列输出实例分析
2015/03/17 Python
python 查找字符串是否存在实例详解
2017/01/20 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
python顺序执行多个py文件的方法
2019/06/29 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
详解Django admin高级用法
2019/11/06 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
德国在线订购鲜花:Fleurop
2018/08/25 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
华为慧通面试题
2012/09/11 面试题
文秘专业大学生求职信
2013/11/10 职场文书
大专毕业生自我评价分享
2013/11/10 职场文书
党风廉政承诺书
2014/03/27 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
公司股份转让协议书范本
2015/01/28 职场文书
实习生辞职信范文
2015/03/02 职场文书
基于Golang 高并发问题的解决方案
2021/05/08 Golang