• js事件队列


      前面跟网友讨论到了JS的事件队列 ,对这个有了一些理解,事件队列我认为就是把一些不按顺序执行的事件放到队列里面,然后按照自己制定的顺序去执行,那么什么情况下会用到这个呢?我首先想到的是动画,动画是会执行一系列的操作,一连串的方法,但是后面讨论,这也只能算是函数或方法队列,事件队列应该是关联到element的触发和事件绑定。

      那么经过网友的讨论,找到这么一个例子,那就是element的事件监听,除了直接用框架(jquery dojo yui等)外,一般的监听都会是这样

    if(window.addEventListener){
        ......
    }else if(window.attachEvent){//IE8或更低
        ......
    }

      但是这里 window.attachEvent 的实现顺序跟绑定的的顺序刚好相反

    var obj = document.getElementById('test');
    obj.attachEvent('onclick',function{
      alert(1);
    });
    
    obj.attachEvent('onclick',function{
      alert(2);
    });

    这样的例子在IE8或更低的IE版本下运行,会先是弹出 2 再弹出 1 ,至于为什么,那要去问微软了。
    如果要做一个兼容的事件监听,那么就会用到队列了,队列就可以很好的控制事件的执行顺序,于是写了这么一个例子(代码很挫......) 

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>js事件队列</title>
    </head>
    <body>
    <a href="javascript:;" id="tobj">点击我1</a>
    <a href="javascript:;" id="yobj">点击我2</a>
    <script>
    var tobj = document.getElementById('tobj')
        ,ton
    ;
    if(window.addEventListener){
        ton = function(type,cb){
            tobj.addEventListener(type,cb,false);
        }
    }else if(window.attachEvent){//IE8或更低
        ton = function(type,cb){
            tobj.attachEvent('on'+type,cb);
        }
    }
    
    ton('click',function(){
        console.log(1);
    });
    
    ton('click',function(){
        console.log(2);
    });
    
    /*
    最后等到的结果是:
    IE8以及IE8以下:2   1
    IE9或更高: 1  2
    FF或chrome: 1  2
    这种情况下  为了保持能够按照 顺序执行  所以要采用队列解决
    */
    
    
    //简单队列对象
    var aqueue = function(){
        this.list = [];
        this.num = 0;//执行次数记录  防止多次监听造成的多次执行
    };
    aqueue.prototype = {
        add:function(fn){
            this.list.push(fn);
        }
        ,size:function(){
            return this.list.length;
        }
        ,done:function(elem){
            var _self = this
                ,len = _self.size()
                ,i=0
            ;
            if(_self.num===len){//如果执行次数等于事件数量
                _self.num=0;//初始化执行次数
            }else{
                for(;i<len;i++){
                    _self.list[i].call(elem);
                    _self.num++;
                }
            }
        }
    };
    
    var aq = new aqueue();
    
    var yobj = document.getElementById('yobj')
        ,yon
    ;
    
    if(window.addEventListener){
        yon = function(type,cb){
            aq.add(cb);//把事件加入队列
            yobj.addEventListener(type,function(){
                aq.done(yobj);
            },false);
        }
    }else if(window.attachEvent){//IE8或更低
        yon = function(type,cb){
            aq.add(cb);//把事件加入队列
            yobj.attachEvent('on'+type,function(){
                aq.done(yobj);
            });
        }
    }
    
    yon('click',function(){
        console.log(1);
    });
    
    yon('click',function(){
        console.log(2);
    });
    </script>
    </body>
    </html>

    这里用的是console.log 输出结果,只有在控制台才能看到,另外要注意的是用 window.attachEvent  监听,方法里面的 this 并不是指向监听对象,而是指向window。


      

  • 相关阅读:
    存储过程参数传递
    iCkeck插件
    单点登录
    SQL数据库默认实例与命名实例的区别
    IE浏览器重复提交ajax请求有缓存
    IE里Iframe的Cookie问题解决办法总结
    微信公众服务号开发
    解析url参数含有特殊字符的情况
    使用客户端控件展示增删改查操作
    修改网站web.config后出现奇怪问题找不到网页
  • 原文地址:https://www.cnblogs.com/subying/p/js-queue.html
Copyright © 2020-2023  润新知