笔记:JS事件的捕获与冒泡

  

1. 名词解释

  • 事件捕获:当使用捕获事件时,父级元素先触发,子级元素后触发  inner-->middle-->outer
  • 事件冒泡:当使用冒泡事件时,子级元素先触发,父级元素后触发  outer-->middle-->inner

2. 事件的发生顺序

    W3C模型:将事件的两种类型进行中和,任何事件发生时,先从顶层开始进行事件捕获直到触发到达了事件源元素。然后再从事件源往上进行事件冒泡直到document

    

 3. 添加/取消事件过程

  • addEventListener(event,function,true/false)第三个选项为:是否添加事件捕获(true为添加捕获事件,false为添加冒泡事件);取消事件使用removeEventListener(event,function,true/flase);取消冒泡事件stopPropagation()【W3C模型】
  • attachEvent(‘on’+event,function)只支持冒泡事件;取消事件用dettachEvent(‘on’+event,function);取消冒泡事件过程cancelBubble = true【IE】

4. 处理默认行为

    事件捕获与冒泡的过程统称为事件的传播,阻止事件的默认行为:

     IE:

          window.event.returnValue = false

     W3C:

            preventDefault();

5. 不能冒泡的事件

    blur 失去焦点

    focus 获得焦点

    load 加载页面

    unload 卸载页面

   注:mouseenter/mouseleave 不冒泡 mouseover/mouseout 冒泡

        Focusin/focusout 冒泡 便于管理页面上的焦点变化

(这两点继续学习)

6. 实例

   

<html>
<head>
<title>事件的捕获和冒泡</title>
</head>
<body>
<div id="outer" style="width:500px;height:500px;background-color:red">
    
    <div id="middle" style="width:300px;height:300px;background-color:black">

        <div id="inner" style="width:100px;height:100px;background-color:yellow">
        </div>

    </div>

</div>

<script>
    var outer = document.getElementById('outer');
    var middle = document.getElementById('middle');
    var inner = document.getElementById('inner');
    if(inner.addEventListener){
        outer.addEventListener('click',function(){alert(this.id);},true);
        middle.addEventListener('click',function(){alert(this.id);},false);
        inner.addEventListener('click',function(){alert(this.id);},true);
    }else if(inner.attachEvent){
        inner.attachEvent('onclick',function(){alert(inner.id);});
        middle.attachEvent('onclick',function(){alert(middle.id);});
        outer.attachEvent('onclick',function(){alert(outer.id);});
    }
</script>
</body>
</html>

     根据代码可以看出:

     outer-->inner依次触发的事件为2图中的1、5、3,所以他的执行先后顺序按照数字大小执行,即:outer-->inner-->middle

 

<html> 
<body> 
<table border="1" width="26%" id="tableA" onclick="alert('tableA')"> 
<tr onclick="tableA_rowA_click()"> 
   <td width="106">一般</td> 
</tr> 
<tr onclick="tableA_rowB_click()"> 
   <td width="106">阻止消息上传</td> 
</tr> 
</table>
<script language="javascript"> 
function tableA_rowA_click(){ 
alert('tableA_rowA'); 
} 
function tableA_rowB_click(){ 
alert('tableA_rowB'); 
event.stopPropagation();
//event.cancelBubble=true; 
} 
</script>  
</body> 
</html>

    表中第一行的事件为:输出tableA tableA_rowA 第二行的事件为:输出tableA_rowB

    原因:第二行使用了stopPropagation()方法,阻止了事件的冒泡

posted @ 2012-08-27 15:09  黑MAO  阅读(1004)  评论(0编辑  收藏  举报