啸羽程序园

在编写自定义插件时候,经常会定义插件的事件,那么掌握了事件委托和冒泡会更加得心应手,写出更加优雅的代码。

首先说冒泡:

js所谓的事件冒泡就是子级元素的某个事件被触发,它的上级元素的该事件也被递归执行。从下往上冒泡泡。

看例子:

<ul class="ulclass" sheng="heilongjiang"> 
    <li>黑河</li> 
    <li>五大连池</li> 
    <li>伊春</li> 
    <li>鹤岗</li> 
    <li>双鸭山</li> 
</ul>

js中声明事件:
$("ul[sheng='heilongjiang']").on('click',function(){ 
    alert("父元素ul被点击"); 
}); 
$("ul[sheng='heilongjiang']").on('click','li',function(){ 
    alert("子元素li被点击"); 
});
当li的点击事件被触发时,父级ul的点击事件也被触发执行。
如果某些情况下不希望冒泡:
$("ul[sheng='heilongjiang']").on('click','li',function(){ 
   e.stopPropagation();//禁用冒泡了
   alert("子元素li被点击"); 
});
接下来是事件委托:

js事件委托,其实也是使用了冒泡的原理,从点击的子元素开始,向它的父元素传播事件,
这样做好处是对于大量要处理的元素,不必为每个元素都绑定事件,只需要在他们的父元
素上绑定一次即可,提高性能。 还有一个好处就是可以处理动态插入dom中的元素,直接
绑定的方式是不行的。就是事件目标自身不处理事件,而是把处理任务委托给其父元素或者
祖先元素,甚至根元素事件委托很好地利用了"事件冒泡"。当点击子元素,根据"事件冒泡",
该子元素的父级元素捕获了该次点击事件,并触发自己的方法。
假如现在有100个按钮,要为每个按钮绑定一个click事件,如果循环100个按钮加事件,对性能
会有一定的影响。
看下示例:
<div class="buttons">
        <bottoun type="button" class="btn">点我触发事件</bottoun>
        <bottoun type="button" class="btn">点我触发事件</bottoun>
        <bottoun type="button" class="btn">点我触发事件</bottoun>
        .......100个按钮
</div>
$(".buttons").on('click','.btn',function(){
      alert("come on baby!");
});

事件委托注意逆向思维来理解和考虑。
Hi, I’m shen, 啸羽