在编写自定义插件时候,经常会定义插件的事件,那么掌握了事件委托和冒泡会更加得心应手,写出更加优雅的代码。
首先说冒泡:
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!");
});
事件委托注意逆向思维来理解和考虑。