关于javascript的事件委托delegate

作者: jie 分类: JavaScript 发布时间: 2023-06-19 13:56

什么是事件委托

事件(例如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这类的事件,虽然存在事件冒泡,但是每次都需要计算位置,消耗很高很麻烦,同样不适用于事件委托。

  1. 事件委托基于冒泡 , 对于不冒泡的事件不支持
  2. 层级过多,冒泡过程中,可能会被某层阻止掉
  3. 把所有事件都用代理就可能会出现事件误判,好比把不应该触发事件的 绑上了事件.


发表回复