事件冒泡

什么是JS事件冒泡?

在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)。

  1. event.stopPropagation();
    事件处理过程中,阻止了事件冒泡,但不会阻击默认行为(它就执行了超链接的跳转)

  2. return false;
    事件处理过程中,阻止了事件冒泡,也阻止了默认行为(比如刚才它就没有执行超链接的跳转)

  3. event.preventDefault();
    如果把它放在头部A标签的click事件中点击“点击我”。
    会发现它依次弹出:我是最里层—->我是中间层—->我是最外层,但最后却没有跳转到百度
    它的作用是:事件处理过程中,不阻击事件冒泡,但阻击默认行为(它只执行所有弹框,却没有执行超链接跳转)


事件周期:

DOM: 3个阶段:

  • 捕获: 由最外层元素向内,逐级记录绑定的事件处理函数,只是记录,而不触发
  • 目标触发: 首先触发实际发生事件的元素上绑定的处理函数(目标元素: 实际发生事件的元素)
  • 冒泡: 由内层向外层依次执行各级绑定的处理函数

    鄙视:能否修改事件触发的顺序: ——能!

     elem.addEventListener(“事件名”,函数对象,false/true);
    

    第三个参数: 是否在捕获阶段提前触发,
    默认false,只能在冒泡阶段顺序触发
    改为true,可在捕获阶段提前触发!
    在捕获阶段提前触发的处理函数,冒泡阶段不会重复触发。
    IE8: 2个阶段: 没有捕获!——不能修改事件触发的顺序
    elem.attachEvent(“on事件名”,函数对象)

取消冒泡

取消冒泡: 一般用于事件处理函数的末尾

DOM: e.stopPropagation();
IE8: e.cancelBubble=true;

兼容:

if(e.stopPropagation!==undefined){
    e.stopPropagation();
}else{
    e.cancelBubble=true;
}

利用冒泡:
优化: 如果多个平级子元素都绑定了相同的事件处理函数,则只需要在父元素上绑定一次即可。不必反复绑定!
为什么: 绑定的事件处理函数越多,页面的执行效率越低。应尽量减少页面中绑定的事件处理函数个数。
核心问题:如何获得目标元素:

var target=e.target||e.srcElement

DOM IE8

取消事件: 在事件处理函数执行过程中,发生了异常或错误,希望事件不再继续触发。
如何取消:
js动态绑定事件处理函数:

DOM: e.preventDefault();
IE8: e.returnValue=false;

兼容:

if(e.preventDefault!==undefined){
    e.preventDefault();
}else{
    e.returnValue=false;
} 

参考网址:事件冒泡