● 事件分为三个阶段:   事件捕获 -->  事件目标 -->  事件冒泡
 
● 事件捕获:事件发生时(onclick,onmouseover……)首先发生在document上,然后依次传递给body、……最后到达目的节点(即事件目标)。
● 事件冒泡:事件到达事件目标之后不会结束,会逐层向上冒泡,直至document对象,跟事件捕获相反
 
1、onlick -->事件冒泡,重写onlick会覆盖之前属性,没有兼容性问题
  1. ele.onclik = null; //解绑单击事件,将onlick属性设为null即可

2、addEventListener(event.type, handle, boolean); IE8及以下不支持,属于DOM2级的方法,可添加多个方法不被覆盖

  1. //事件类型没有on,false 表示在事件第三阶段(冒泡)触发,true表示在事件第一阶段(捕获)触发。 如果handle是同一个方法,只执行一次。
  2. ele.addEventListener('click', function(){ }, false);
  3. //解绑事件,参数和绑定一样
  4. ele.removeEventListener(event.type, handle, boolean);

3、attachEvent(event.type, handle ); IE特有,兼容IE8及以下,可添加多个事件处理程序,只支持冒泡阶段

  1. //如果handle是同一个方法,绑定几次执行几次,这点和addEventListener不同,事件类型要加on,例如onclick而不是click
  2. ele.attachEvent('onclick', function(){ });
  3. //解绑事件,参数和绑定一样
  4. ele.detachEvent("onclick", function(){ });

4、默认事件行为:href=""链接,submit表单提交等

  ● 阻止默认事件:

(1)return false; 阻止独享属性(通过on这种方式)绑定的事件的默认事件

  1. ele.onclick = function() {
  2. …… //你的代码
  3. return false; //通过返回false值阻止默认事件行为
  4. };

(2)event.preventDefault( ); 阻止通过 addEventListener( ) 添加的事件的默认事件

  1. element.addEventListener("click", function(e){
  2. var event = e || window.event;
  3. ……
  4. event.preventDefault( ); //阻止默认事件
  5. },false);

(3)event.returnValue = false; 阻止通过 attachEvent( ) 添加的事件的默认事件

  1. element.attachEvent("onclick", function(e){
  2. var event = e || window.event;
  3. ……
  4. event.returnValue = false; //阻止默认事件
  5. },false);

5、接下来我们把事件绑定以及事件解绑封装成为一个函数,兼容浏览器,包括IE6及以上

  1. // 事件绑定
  2. function addEvent(element, eType, handle, bol) {
  3. if(element.addEventListener){ //如果支持addEventListener
  4. element.addEventListener(eType, handle, bol);
  5. }else if(element.attachEvent){ //如果支持attachEvent
  6. element.attachEvent("on"+eType, handle);
  7. }else{ //否则使用兼容的onclick绑定
  8. element["on"+eType] = handle;
  9. }
  10. }
  1. // 事件解绑
  2. function removeEvent(element, eType, handle, bol) {
  3. if(element.addEventListener){
  4. element.removeEventListener(eType, handle, bol);
  5. }else if(element.attachEvent){
  6. element.detachEvent("on"+eType, handle);
  7. }else{
  8. element["on"+eType] = null;
  9. }
  10. }

-----------------------------------------------------------------------------------------------------------------------------------------------

A.● 事件冒泡、事件捕获阻止:
event.stopPropagation( );                // 阻止事件的进一步传播,包括(冒泡,捕获),无参数
event.cancelBubble = true;             // true 为阻止冒泡
 
B.● 事件委托:利用事件冒泡的特性,将里层的事件委托给外层事件,根据event对象的属性进行事件委托,改善性能。
使用事件委托能够避免对特定的每个节点添加事件监听器;事件监听器是被添加到它们的父元素上。事件监听器会分析从子元素冒泡上来的事件,找到是哪个子元素的事件。
 

来个例子吧,如果要单独点击table里面的td,普通做法是for循环给每个td绑定事件,td少的话性能什么差别,td如果多了,就不行了,我们使用事件委托:

  1. <!-- HTML -->
  2. <table id="out" border="1" style="cursor: pointer;">
  3. <tr>
  4.   <td>table01</td>
  5.   <td>table02</td>
  6.   <td>table03</td>
  7.   <td>table04</td>
  8.   <td>table05</td>
  9.   <td>table06</td>
  10.   <td>table07</td>
  11.   <td>table08</td>
  12.   <td>table09</td>
  13.   <td>table10</td>
  14. </tr>
  15. </table>
  1. var out = document.getElementById("out");
  2. if(out.addEventListener){
  3. out.addEventListener("click",function(e){
  4. var e = e||window.event;
  5. //IE没有e.target,有e.srcElement
  6. var target = e.target||e.srcElement;
  7. //判断事件目标是否是td,是的话target即为目标节点td
  8. if(target.tagName.toLowerCase()=="td"){
  9. changeStyle(target);
  10. console.log(target.innerHTML);
  11. }
  12. },false);
  13. }else{
  14. out.attachEvent("onclick",function(e){
  15. var e = e||window.event;
  16. //IE没有e.target,有e.srcElement
  17. var target = e.target||e.srcElement;
  18. //判断事件目标是否是td,是的话target即为目标节点td
  19. if(target.tagName.toLowerCase()=="td"){
  20. changeStyle(target);
  21. console.log(target.innerHTML);
  22. }
  23. });
  24. };
  25. };
  26. function changeStyle(ele){
  27. ele.innerHTML = "已点击"
  28. ele.style.background="#900";
  29. ele.style.color = "#fff"; }

关于事件就到这里了。。。

张小窝 -- web前端开发路上    原创。

JS中的事件绑定,事件捕获,事件冒泡以及事件委托,兼容IE的更多相关文章

  1. 事件绑定的快捷方式 利on进行事件绑定的几种情况

    [事件绑定快捷方式]$("button:first").click(function(){ alert(1); }); [使用on绑定事件] ① 使用on进行单事件绑定 $(&qu ...

  2. js中的前绑定和后绑定详解

    这篇文章详细介绍了js中的前绑定和后绑定,有需要的朋友可以参考一下 其主要意思就是看我有没有用过前绑定,即Dom树中的某些元素在还没有创建出来时,就指定该类型的元素一出生就应该拥有的某些事件.在实际开 ...

  3. js中addEventListener第三个参数涉及到的事件捕获与冒泡

    js中,我们可以给一个dom对象添加监听事件,函数就是 addEventListener("click",function(){},true); 很容易理解,第一个参数是事件类型, ...

  4. jQuery js 中return false,e.preventDefault(),e.stopPropagation()的区别(事件冒泡)

    有时候遇到冒泡事件很烦人,真的..... 1.e.stopPropagation()阻止事件冒泡 <head> <title></title> <script ...

  5. jQuery使用(七):事件绑定与取消,及自定事件的实现原理

    实例方法: on() one() off() trigger() hover() 一.绑定事件与jQuery事件委托 $(selector).eventType(fn); $(selector).on ...

  6. js中this的绑定规则及优先级

    一.   this绑定规则 函数调用位置决定了this的绑定对象,必须找到正确的调用位置判断需要应用下面四条规则中的哪一条. 1.1 默认绑定 看下面代码: function foo() { cons ...

  7. js中同一个onclick绑定了两个js方法出现的问题

    问题: js中如果同一个onclick绑定了两个js方法问题,即 <li onclick="f1(),f2()"></li> 两个方法f1,f2中都分别有一 ...

  8. angular JS中使用jquery datatable 自定义搜索按钮点击事件 和mRender的 ng-click事件

    'use strict'; app.controller('DataTableCtrl', function ($scope, $compile) { $scope.searchFiles = { n ...

  9. js中this的绑定

    人们对于this的绑定常常有两个误解,一:指向函数本身,二:指向函数作用域.这两种想法都是错的,this并不指向函数本身,也不指向函数作用域. function foo(){ this.count++ ...

  10. js:捕获冒泡和事件委托

    一.事件流(捕获,冒泡)   事件流:指从页面中接收事件的顺序,有冒泡流和捕获流. 当页面中发生某种事件(比如鼠标点击,鼠标滑过等)时,毫无疑问子元素和父元素都会接收到该事件,可具体顺序是怎样的呢?冒 ...

随机推荐

  1. jQuery Mobile 控制 select 的显示隐藏 display none

    如需要动态控制下拉选择菜单select的显隐,一般考虑使用display:none这个方法. 但在jQueryMobile中的select添加自定义的css,display:none 是无效的. 解决 ...

  2. uva 1203 - Argus

    简单的优先队列的应用: 代码: #include<queue> #include<cstdio> using namespace std; struct node { int ...

  3. bootcamp

    为了鄙社自主研发的html5studio和mist,我给Air划了32G装windows囧 第一要注意的是,必须使用bootcamp划分将要安装windows的分区,不要在windows安装过程中删除 ...

  4. Java Servlet的request使用的编码引发的思考 以及解决方法

    如果我们用浏览器填写了中文,而在服务器Servlet上没有进行编码设置,那么将会出现乱码. 出现乱码的原因是:浏览器发送的文字是以UTF-8编码发送的,然后调用request.getParameter ...

  5. 【POJ3691】 DNA repair (AC自动机+DP)

    DNA repair Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Description B ...

  6. CyclicBarrier的介绍和使用

    转自:http://www.itzhai.com/the-introduction-and-use-of-cyclicbarrier.html 类说明: 一个同步辅助类,它允许一组线程互相等待,直到到 ...

  7. 事务Isolation Level 例子详解

    举例分析: 我们有A表, 包含两条数据. Read uncommitted: 假设我们有两个事务 Trans1, Trans2. 它们的操作如下: Trans 1: 更新A1 -> A11, 然 ...

  8. 【转】git在eclipse中的配置

    原文网址:http://www.cnblogs.com/zhxiaomiao/archive/2013/05/16/3081148.html 一_安装EGIT插件 http://download.ec ...

  9. 有关Spring Batch

    在使用Spring Batch时,在无法实现StepListener的情况下,如何使用ExecutionContext呢. 解决办法,使用宣言@BeforeStep或@AfterStep.

  10. [转]让程序在崩溃时体面的退出之Dump文件

    原文地址:http://blog.csdn.net/starlee/article/details/6630816 在我的那篇<让程序在崩溃时体面的退出之CallStack>中提供了一个在 ...