JS兼容所有浏览器的DOMContentLoaded事件


Posted in Javascript onJanuary 12, 2018

使用JavaScript操作dom元素的时候,通常会将获取dom元素的代码放在window.onload=function(){}事件处理函数中,但window.onload事件在某些开始后可能会影响客户体验,因为要等待所有的脚本,css代码和图片等内容加载完毕才会触发此事件,尤其是如果图片量很大的情况下,会严重客户体验。所以很多时候,只需要DOM结构加载完毕即可,jQuery的$(document).ready(function(){})实现此功能,下面介绍一下原生JavaScript如何实现此功能。

实现过程介绍:

标准浏览器中,使用DOMContentLoaded事件即可实现我们的要求,注册事件处理函数也极为简单。

代码如下:

addEventListener(‘DOMContentLoaded',fn,false)

但IE8和IE8以下浏览器并不支持DOMContentLoaded事件,所以还需要另辟蹊径来解决此问题。

可能很多朋友认为根据document.onreadystatechange事件的document.readyState状态是否等于complete来判断dom结构是否加载完毕,但经过测试并不能完成任务,如果页面使用iframe引入子页面,会有问题。

解决方案如下:

低版本IE浏览器特有的doScroll方法,当dom结构没有加载完成时,调用此方法会报错,于是可以通过定时器函数不断的调用此方法,并结合try catch语句来实现判断功能,代码如下:

eventQueue = [];
isReady = false;
isBind = false;
function domReady(fn){
 if(isReady){
  fn.call(window);
 }
 else{
  eventQueue.push(fn);
 };
 bindReady();
};
function bindReady(){
 if(isReady) return;
  if(isBind) return;
  isBind=true;
  if(window.addEventListener){
   document.addEventListener('DOMContentLoaded',execFn,false);
  }
  else if(window.attachEvent){
   doScroll();
  };
};
function doScroll(){
 try{
  document.documentElement.doScroll('left');
 }
 catch(error){
  return setTimeout(doScroll,20);
 };
 execFn();
};
function execFn(){
 if(!isReady){
  isReady=true;
  for(var index=0;i<eventQueue.length;index++){
   eventQueue[index].call(window);
  };
  eventQueue = [];
 };
};
domReady(function(){
 //code
});
domReady(function(){
 //code
});

代码实现了兼容所有浏览器的DOMContentLoaded效果,下面介绍一下它的实现过程。

一.代码注释:

(1).eventQueue = [],声明一个空数组,用来要执行的函数队列。

(2).isReady = false,声明一个变量并赋初值为false,如果为true则表示dom已经加载完毕。

(3).isBind = false,声明一个变量并赋初值为false,如果为true,则表示时间处理函数绑定完毕。

(4).function domReady(fn){},此函数实现了等dom加载完毕再去执行fn函数的功能。

(5).if(isReady){fn.call(window);},如果变量值为true,则直接执行函数。

(6).else{eventQueue.push(fn);},将要执行的函数加入数组中。

(7).bindReady(),此函数可以实现注册事件处理函数。

(8).if(isReady) return,如果等于true,直接跳出函数,这个时候fn函数已经被执行。

(9).if(isBind) return,如果已经注册的话,同样无需进行第二次。

(10).isBind=true,将变量的值修改为true。

(11).if(window.addEventListener){document.addEventListener('DOMContentLoaded',execFn,false);},如果是标准浏览器则使用addEventListener注册事件处理函数。

(12).else if(window.attachEvent){doScroll();},如果IE8及IE8以下浏览器,调用doScroll方法实现此效果。

(13).function doScroll(){},此函数可以使用利用定时器函数不断的调用doScroll()函数,如果报错,则继续调用,否则的话,也就是dom结构加载完毕,于是就执行相关函数。

(14).function execFn(){},此函数可以从数组中取出要执行的函数,然后执行,并最后将数组清空。

总结

以上所述是小编给大家介绍的JS兼容所有浏览器的DOMContentLoaded事件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
学习javascript,实现插入排序实现代码
Jul 31 Javascript
JavaScript 代码压缩工具小结
Feb 27 Javascript
一样的table?不一样的table(可编辑状态table)
Sep 19 Javascript
基于jQuery实现多层次的手风琴效果附源码
Sep 21 Javascript
JS实现旋转木马式图片轮播效果
Jan 18 Javascript
Vue表单验证插件的制作过程
Apr 01 Javascript
浅谈Koa服务限流方法实践
Oct 23 Javascript
解决bootstrap-select 动态加载数据不显示的问题
Aug 10 Javascript
详解关于React-Router4.0跳转不置顶解决方案
May 10 Javascript
Vue.directive 实现元素scroll逻辑复用
Nov 29 Javascript
基于JavaScript获取url参数2种方法
Apr 17 Javascript
详解为什么Vue中的v-if和v-for不建议一起用
Jan 13 Vue.js
使用JS获取SessionStorage的值
Jan 12 #Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
Jan 12 #Javascript
web前端vue filter 过滤器
Jan 12 #Javascript
你可能不知道的前端算法之文字避让(inMap)
Jan 12 #Javascript
关于HTTP传输中gzip压缩的秘密探索分析
Jan 12 #Javascript
用最少的JS代码写出贪吃蛇游戏
Jan 12 #Javascript
Javascript将图片的绝对路径转换为base64编码的方法
Jan 11 #Javascript
You might like
VOLVO车载收音机
2021/03/02 无线电
php select,radio和checkbox默认选择的实现方法
2010/05/15 PHP
PHP新手NOTICE错误常见解决方法
2011/12/07 PHP
php使用curl访问https示例分享
2014/01/17 PHP
PHP用户验证和标签推荐的简单使用
2016/10/31 PHP
flash javascript之间的通讯方法小结
2008/12/20 Javascript
jquery下将选择的checkbox的id组成字符串的方法
2010/11/28 Javascript
PHP abstract与interface之间的区别
2013/11/11 Javascript
Extjs4中Form的使用之本地hiddenfield
2013/11/26 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
jQuery+Ajax实现无刷新操作
2016/01/04 Javascript
理解javascript定时器中的单线程
2016/02/23 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
2016/11/22 Javascript
使用vue.js写一个tab选项卡效果
2017/03/25 Javascript
微信小程序 wx:for的使用实例详解
2017/04/27 Javascript
JS+canvas实现的五子棋游戏【人机大战版】
2017/07/19 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
2019/05/14 Javascript
jQuery实现放大镜案例
2020/10/19 jQuery
python 查找文件夹下所有文件 实现代码
2009/07/01 Python
在Python中使用异步Socket编程性能测试
2014/06/25 Python
Python处理JSON时的值报错及编码报错的两则解决实录
2016/06/26 Python
Zabbix实现微信报警功能
2016/10/09 Python
python实现对excel进行数据剔除操作实例
2017/12/07 Python
python 定义给定初值或长度的list方法
2018/06/23 Python
Python实现程序判断季节的代码示例
2019/01/28 Python
python 多线程重启方法
2019/02/18 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
HTML5 移动页面自适应手机屏幕四类方法总结
2017/08/17 HTML / CSS
乐高官方旗舰店:LEGO积木玩具
2019/04/06 全球购物
如何强制垃圾回收
2015/10/06 面试题
学校元旦晚会方案
2014/02/19 职场文书
银行柜员求职自荐书
2014/06/18 职场文书
2016元旦文艺汇演主持词
2015/07/06 职场文书
python实现大文本文件分割成多个小文件
2021/04/20 Python
SpringBoot整合MongoDB的实现步骤
2021/06/23 MongoDB
如何用vue实现网页截图你知道吗
2021/11/17 Vue.js