关于javascript的事件委托delegate
什么是事件委托
事件(例如onclick,onmouseover,onmouseout等事件),这些事件本来是加在发生这些事件的元素上,委托就是加在他的父亲或者爷爷身上。来完成这个事件。
啥时候会使用delegate呢?页面中原来就有的元素是可以一次性获取进行事件的绑定的,但是当页面初始的状态已经生成。后续中又动态生成的元素,此时你前面的获取的进行事件的绑定就会失效。
原因就是js的流程,顺序流。已经加载完成后才生成的元素。所以此时要进行新的动态生成的事件操作就要进行事件的委托。当然原理就是冒泡的原理。
例如:
$("ul").delegate("li a", "click", function() { //delegate 授权的意思
var index = $(this).parent().index();
window.location.href = "detail.html?goodsid=" + dataArr[index].goodsid + "&text=" + encodeURI(this.text);
})
事件委派就是利用事件冒泡原理,只指定一个事件处理程序,就可以管理某一类型的所有事件
事件委派的好处
1.减少了事件的监听器,原来需要在多个子元素绑定的事件处理函数,现在只需要在祖先元素(一般为父元素)上面统一定义一次即可
2.减少内存消耗,提高了页面的性能,主要是减少了时间处理函数的数量
3.动态绑定时间,如果我们新增一个元素,我们还需要继续为这个元素绑定事件,但是如果使用了事件委派就不需要了,事件委派中事件是绑定在父级元素上面的,新增元素,事件动作冒泡到父级元素身上,执行绑定在父级元素上的事件处理函数,可以减少不必要工作。
事件委派的局限
focus,blur之类事件本身没有冒泡机制,无法委托
mousemove,mouseout这类的事件,虽然存在事件冒泡,但是每次都需要计算位置,消耗很高很麻烦,同样不适用于事件委托。
- 事件委托基于冒泡 , 对于不冒泡的事件不支持
- 层级过多,冒泡过程中,可能会被某层阻止掉
- 把所有事件都用代理就可能会出现事件误判,好比把不应该触发事件的 绑上了事件.