您的位置:首页 > 教程笔记 > 前端笔记

兼容低版本IE浏览器的DOMContentLoaded事件

2023-12-04 13:50:36 前端笔记 150

用过jQuery的朋友一定对$(document).reay(function(){})不会陌生。

它的作用是当文档结构加载完毕就会触发事件,其实就是对DOMContentLoaded事件的封装。

下面是兼容低版本IE浏览器的DOMContentLoaded的事件,代码:

//保存domReady的事件队列
    eventQueue = [];
    //判断DOM是否加载完毕
    isReady = false;
    //判断DOMReady是否绑定
    isBind = false;
    /*执行domReady()
    *
    *@param    {function}
    *@execute  将事件处理程序压入事件队列,并绑定DOMContentLoaded
    *          如果DOM加载已经完成,则立即执行
    *@caller
    */
    function domReady(fn){
      if (isReady) {
        fn.call(window);
      }
      else{
        eventQueue.push(fn);
      };
      bindReady();
    };
    /*domReady事件绑定
    *
    *@param    null
    *@execute  现代浏览器通过addEvListener绑定DOMContentLoaded,包括ie9+
    ie6-8通过判断doScroll判断DOM是否加载完毕
    *@caller   domReady()
    */
    function bindReady(){
      if (isReady) return;
      if (isBind) return;
      isBind = true;
      if (window.addEventListener) {
        document.addEventListener('DOMContentLoaded',execFn,false);
      }
      else if (window.attachEvent) {
        doScroll();
      };
    };
    /*doScroll判断ie6-8的DOM是否加载完成
     *
     *@param    null
     *@execute  doScroll判断DOM是否加载完成
     *@caller   bindReady()
    */
    function doScroll(){
      try{
        document.documentElement.doScroll('left');
      }
      catch(error){
        return setTimeout(doScroll,20);
      };
      execFn();
    };
    /*执行事件队列
    *
    *@param    null
    *@execute  循环执行队列中的事件处理程序
    *@caller   bindReady()
    */
    function execFn(){
      if (!isReady) {
        isReady = true;
        for (var i = 0; i < eventQueue.length; i++) {
          eventQueue[i].call(window);
        };
        eventQueue = [];
      };
    };
    //js文件1
    domReady(function(){
    });
    //js文件2
    domReady(function(){
    });
    //注意,如果是异步加载的js就不要绑定domReady方法,不然函数不会执行,
    //因为异步加载的js下载之前,DOMContentLoaded已经触发,addEventListener执行时已经监听不到了

相关推荐

  • JavaScript 事件委托或者事件代理介绍

    JavaScript 事件委托或者事件代理介绍

    本章节介绍一下标题标题中的事件委托这个概念和它的相关用法,代理也是一种叫法之一。其实从名称就可以看出事件委托其实就是自己的事情交给别人去干,下面就做一下介绍。下面是一个li元素列表:ul id=l

    前端笔记 2023-12-04 13:50:23 29
  • js兼容所有浏览器的pageX和pageY属性

    js兼容所有浏览器的pageX和pageY属性

    标题中的两个属性具有一定的浏览器兼容性问题。不出所料,此兼容性问题是由I9以下浏览器导致的。但是由于考虑到低版本的I浏览器用户尚多,所以本章节介绍一下如何实现兼容所有浏览器的gX和gY

    前端笔记 2023-12-04 13:49:32 141
  • jquery实现的右键鼠标点击事件

    jquery实现的右键鼠标点击事件

    jqury其实本身的事件机制就很完善了,包括了单击,双击,鼠标移入,鼠标移出等。但是却少了一个做事件。就是鼠标右击事件。当然大家也是直接用侦听鼠标按下事件,然后通过if来判断执行相应的函数。造成鼠标

    前端笔记 2023-12-04 13:49:08 122
  • 兼容低版本IE浏览器的Object.create()方法

    兼容低版本IE浏览器的Object.create()方法

    关于Objct.crt()方法的基本用法可以参阅Objct.crt()一章节。但是此方法对于低版本的浏览器无效,比如I9以下浏览器。下面就介绍一下代码实例,它实现了兼容效果。代码如下

    前端笔记 2023-12-04 13:48:41 123
  • js判断是否在微信内置浏览器中打开

    js判断是否在微信内置浏览器中打开

    代码实例如下// tru or flsvr flg = Wixini.onInWixin();Wixini的地址是github/zxli/Wixini。

    前端笔记 2023-12-04 13:48:21 168