前面跟网友讨论到了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。

  

js事件队列的更多相关文章

  1. 关于js中的回调函数callback

    来源于:http://www.jianshu.com/p/6bc353e5f7a3 前言 其实我一直很困惑关于js 中的callback,困惑的原因是,学习中这块看的资料少,但是平时又经常见,偶尔复制 ...

  2. 关于 js 中的回调函数 callback

    本文写于1年前 曾经的学习文章如今拿出来分享 前言 其实我一直很困惑关于js中的callback,困惑的原因是,学习中这块看的资料少,但是平时又经常见,偶尔复制一下前人代码,功能实现了也就不再去追其原 ...

  3. Event Loop - 事件队列

    Event Loop 定义: event - 事件 loop - 循环,既然叫事件循环,那么循环的点在哪? 循环的是一个又一个的任务队列,这些任务队列由宏任务和微任务构成 两条原则 一次处理一个任务 ...

  4. 关于js中的回调函数callback,通俗易懂

    前言 其实我一直很困惑关于js 中的callback,困惑的原因是,学习中这块看的资料少,但是平时又经常见,偶尔复制一下前人代码,功能实现了也就不再去追其原由,这么着,这个callback的概念就越来 ...

  5. 浏览器中Javascript单线程分析

    线程这个特性对于一门语言环境来说是尤其重要的,在Java/C++环境下都提供了多线程API操作. 但在Javascript中据说代码执行时单线程的,大量计算的逻辑会阻塞浏览器HTML渲染,但setTi ...

  6. Node.js EventEmitter(事件队列)

    Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列. Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.read ...

  7. JavaScript之JS单线程|事件循环|事件队列|执行栈

    本博文基于知乎"JavaScript作用域问题?"一问,而引起了对JavaScript事件循环和单线程等概念与实践上的研究.深入理解. 一.概念 0.关键词:JavaScript单 ...

  8. js 在浏览器中的event loop事件队列

    目录 前言 认识一个栈两个队列 执行过程 异步任务怎么分配 简单例子 难一点的例子 前言 以下内容是js在浏览器中的事件队列执行,与在nodejs中有所区别,请注意. 都说js是单线程的,不过它本身其 ...

  9. 如何观察JS的事件队列的执行划分

    也就是说,不同的操作函数,操作符,JS将其放入事件队列是不一样的... 比如: 外部函数和内部函数,就是分两次放入事件循环的尾端的. 比如,多个操作符组成的链式操作,也有可能是放不同的操作批次进入事件 ...

随机推荐

  1. FFmpeg工具使用总结

    . 一. FFmpeg是什么? 简单说,FFmpeg就是一个很好的,免费的,开源的视频转换工具.详细说,FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依 ...

  2. Git、Github、码云 笔记汇总

    从本地恢复码云的项目 把本地项目同步到码云 CBoard 基于0.4.1的旧版本的分支修改合并到0.4.2新版本里面 通过git命令行把一个分支的其中一个commit(提交)合并到另外一个分支里面去

  3. 实验一 c++简单程序设计

    一.实验内容 1.ex 2_28 (1) 用if...else判断 #include<iostream> using namespace std; int main() { char i; ...

  4. ui2-3

    2016.9讲义 一.课程的主要内容和目的 二.课程所用工具软件——Photoshop CS6 1. Photoshop 的发展史 1990.2,ps1.0问世,1991.2,PS2.0发行,此后,进 ...

  5. npm install 报错:ERR! code EINTEGRITY 解决方案

    npm升级后,npm install 报错了,报错信息:ERR! code EINTEGRITY到处百度搜索解决方案,终于找到了!“npm cache verify”这条命令帮助了不少人 npm ca ...

  6. P3348 [ZJOI2016]大森林(Link-cut-tree)

    传送门 题解 题面大意: \(0.\)区间加节点 \(1.\)区间换根 \(2.\)单点询问距离 如果没有\(1\)操作,因为区间加节点都是加在下面,所以我们可以直接把\(n\)棵树压成一棵树,直接询 ...

  7. lightgbm调参方法

    gridsearchcv: https://www.cnblogs.com/bjwu/p/9307344.html gridsearchcv+lightgbm cv函数调参: https://www. ...

  8. OpenERP 中国财务模块 调整

    最开始的模样是这个样子的 后三行是没用的,于是在RML文件中注释掉相关的代码,改进后的界面如下: 这个样子看起来是好多了,但是 数量跟是十亿千百的那块看起来还是很别扭,调整行高后的结果: 最诡异的事情 ...

  9. OpenERP __sql_constrants doesn't work.

    可能的原因有两个,一个是你没有更新模块列表,第二个可能是你原有的列已经有重复的数据.(unique限制为例.)

  10. (转)基于OpenStack构建企业私有云(1)实验环境准备

    原文:https://www.unixhot.com/article/407 https://www.cnblogs.com/kevingrace/p/5707003.html-----完整部署Cen ...