JS中的事件绑定与捕获
来源:互联网 发布:东京 泡泡 上门 知乎 编辑:程序博客网 时间:2024/06/05 20:12
最近一直在学习前端知识(吐槽一下,有时候学着还真是很累。。。。),现在对事件绑定和捕获做一个小小的总结。
1.如何进行事件绑定?
实际开发中经常需要给一个对象绑定一个事件,我们经常采用如下方式:
obj.onclick=fn1;
但是,这种情况下会存在潜在问题,比如多个部门协作时,可能会出现如下代码:
obj.onclick=fn2;
这个时候obj的第二个点击事件将会覆盖第一个,因此,便有了方式二:
IE下:obj.attachEvent(事件名称,事件函数);
//如:obj.attachEvent('onclick', fn1);
obj.attachEvent('onclick', fn2);
两个点击事件便会不冲突,按照一定顺序发生,此处会有一点点区别。IE7会先执行后者(fn2),再执行前者(fn1)。IE7以上正好相反。
obj.addEventListener(事件名称,事件函数,是否捕获);//第三个参数,默认为false(冒泡),true代表时间捕获(稍后讲到)。
现在我们总结一下IE和非IE下二者的区别:
IE: 没有第三个捕获参数;事件名称有“on”;事件执行的顺序有差别;另外,IE下,事件绑定函数中,this是指向window对象的,而FireFox下this是指向触发该事件的对象。
2解决this指向问题的方法:
采用call方法。即fn.call();
call方法第一个参数可以改变函数执行过程中的内部this的指向,call方法第二个参数开始就是原来函数的参数列表;
因此,我们采用兼容处理的绑定函数:
function bind(obj, evname, fn) { if (obj.addEventListener) { obj.addEventListener(evname, fn, false); } else { obj.attachEvent('on' + evname, function() { fn.call(obj); }); } }
3.事件绑定的取消
第一种事件绑定形式的取消:obj.onclick=null;
第二种形式的取消:
IE: obj.detachEvent(事件名称,事件函数);
非IE下:obj.removeEventListner(事件名称,事件函数,是否捕获);
4. 时间捕获的概念
假定存在如下代码:
<div id="div1">
<div id="div3">
<div id="div3">
</div>
</div>
</div>
那么当点击里面的div3时,点击事件是从外部“从天而降”先到达1,再到2,最后到3;然后时间开始向外反馈:从3到2,再到1,最后出去。那么进去的过程就可以理解为“捕获” ,出来的过程就可以理解为“冒泡”。
绑定函数中(不包括IE),当第三个参数为true时,事件的相应时候便会发生捕获,false则为冒泡机制。
5.冒泡机制
事件冒泡 : 当一个元素接收到事件的时候,会把他接收到的所有传播给他的父级,一直到顶层window.事件冒泡机制
阻止冒泡 : 当前要阻止冒泡的事件函数中调用 event.cancelBubble = true;(event需要做兼容性处理)
2015年11月9日补充:
事件的捕获和冒泡其实是事件触发顺序的两种机制:
我们以点击事件为例:点击事件触发的时候,首先点击的是父级,然后一级一级往下传,直到目标层级。这时候,如果将事件捕获,必定会先触发父级的点击事件,接着是下一级,再往下....直到最后触发目标层级。而如果父级此时的捕获设置为false,那将首先触发目标层级的点击事件,然后点击事件不断网上冒泡到父级。。。直到document。其实就是点击事件到底是从父级进入到目标层级的过程中触发,还是从目标层级出来向上冒泡的时候触发!
以上为个人学习过程中的理解和总结,不正之处,还望指出!!!
- JS中的事件绑定与捕获
- js中的事件捕获与事件冒泡
- js中的事件冒泡与事件捕获
- JS 中的事件冒泡与捕获
- js中的普通事件与事件绑定
- JS中的事件绑定,事件捕获,事件冒泡以及事件委托,兼容IE
- JS中的事件绑定,事件捕获,事件冒泡以及事件委托,兼容IE
- JS中的事件绑定,事件捕获,事件冒泡以及事件委托,兼容IE
- js中的事件绑定与解绑
- 事件绑定与事件捕获/冒泡
- JS 中的事件绑定、事件监听与事件委托
- js中的事件绑定
- JS事件捕获与冒泡
- js事件冒泡与捕获
- JS事件捕获与冒泡
- JavaScript事件绑定与冒泡捕获
- JS中的事件捕获和事件冒泡
- js 中的事件冒泡或事件捕获
- ZFS存储池的创建
- 字符串越界问题
- Cocos2dx 关于层的屏蔽
- 【LET】【JAVA】Pattern Matcher
- ExecutorService 的理解与使用
- JS中的事件绑定与捕获
- 面试题 不使用中间变量交换两个字符
- (白书训练计划)UVa 1152 4 Values whose Sum is 0(中途相遇法。。)
- 数据库索引的实现原理
- 【索引】Backtracking - Hard
- VC double CString 相互转换 摘录
- 关于js中的传递方式
- Java语言与应用框架——Struts官方文档
- Python(2.7.x)多线程的简单示例