Skip to content

jquery Delegate(委托)

jquery在1.4.2版本中添加了delegate这个方法,下面是这个方法的描述:

.delegate( selector, eventType, handler )

  • selector选择器字符串,用于过滤器触发事件的元素。
  • eventType一个包含一个或多个JavaScript事件类型的字符串,比如"click"或"keydown,"或自定义事件的名称。
  • handler每当事件触发时执行的函数。

.delegate( selector, eventType, eventData, handler )

  • selector选择器字符串,用于过滤触发事件的元素。
  • eventType一个包含一个或多个JavaScript事件类型的字符串,比如"click"或"keydown,"或自定义事件的名称。
  • eventData将要传递给事件处理函数的数据映射。
  • handler每当事件触发时执行的函数。

其实之前jquery就有实现过代理:.live(使用document对象来代理事件)

代理的实现原理是事件的冒泡,在指定的祖先元素中注册事件(live在document上注册,而delegate在特定元素上),元素事件触发,传播到这个元素然后进行筛选,之前在《[javascript DOM事件模型]》讨论过。

delegate的实现源码:

javascript
delegate: function( selector, types, data, fn ) {
    return this.live( types, data, fn, selector );
}

可以看出,delegate是依赖live的。但是为什么delegate比live更好用呢?

这是因为delegate的第一个参数(选择器)。 首先看一个demo,这个demo里面,传统的jquery做法是对每个td进行方法绑定: 传统的jquery做法是对每个td进行方法绑定:

javascript
$("table td").hover(function(){
    $(this).animate({opacity:0.25},300,function(){
        $(this).animate({opacity:1},300);
    });
});

用live的做法:

javascript
$("table td").live("hover",function(){
    //do same thing
});

而delegate的写法:

javascript
$("table").delegate("td","hover",function(){
    $(this).animate({opacity:0.25},300,function(){
        $(this).animate({opacity:1},300);
    });
});

从代码上看,没有什么区别。速度上,肯定delegate要快。因为不用把所有td遍历一遍去生成jquery对象。