天天看點

JQuery中事件綁定的四種方法及其優缺點

JQuery中事件綁定的方法有

bind

live

delegate

on

1、

bind

bind(type [,data], fn)

.bind

,監聽器綁定到目标元素上,會将所有比對的元素都綁定一次事件。是以,當元素很多時,後來動态添加的元素不會被綁定。

例:

$("#foo").bind('click',function(){
    console.log("clicked");
})
           

簡寫:

$("#foo").click(function(){
    console.log("clicked");
})
           

2、

live

.live

,監聽器綁定到

document

上,利用事件委托,可以像調用

bind

一樣調用

live

方法,但兩者的底層實作不一樣。

.live

綁定的事件也會比對到那些動态添加的元素,而且,被

live

綁定的事件隻會被附加到

document

元素上一次,是以提高了性能。

例:

$( "#members li a" ).live( "click", function( e ) {} );
           

注意:該方法在1.7版本後被棄用

3、

delegate

$(selector).delegate(childSelector,event,data,function)

.delegate與.live類似,不會監聽器綁定到你指定的附加元素上,而不是document

上,也利用了事件委托,是以也提高了性能。但是該方法不能直接由bind過渡

例:

$( "#members" ).delegate( "li a", "click", function( e ) {} );
           

4、

on

$(selector).on(event,childSelector,data,function)

1.7版本新添加的,也是推薦使用的事件綁定方法。其實bind、live、delegate都是通過該方法實作的:

bind: function( types, data, fn ) {
 return this.on( types, null, data, fn );
},
unbind: function( types, fn ) {
 return this.off( types, null, fn );
},

live: function( types, data, fn ) {
 jQuery( this.context ).on( types, this.selector, data, fn );
 return this;
},
die: function( types, fn ) {
 jQuery( this.context ).off( types, this.selector || "**", fn );
 return this;
},

delegate: function( selector, types, data, fn ) {
 return this.on( types, selector, data, fn );
},
undelegate: function( selector, types, fn ) {
 return arguments.length ==  ? 
  this.off( selector, "**" ) : 
  this.off( types, selector, fn );
           

是以,使用

on

方法和使用以上個方法的一樣

// Bind
$( "#members li a" ).on( "click", function( e ) {} ); 
$( "#members li a" ).bind( "click", function( e ) {} );

// Live
$( document ).on( "click", "#members li a", function( e ) {} ); 
$( "#members li a" ).live( "click", function( e ) {} );

// Delegate
$( "#members" ).on( "click", "li a", function( e ) {} ); 
$( "#members" ).delegate( "li a", "click", function( e ) {} );
           

對于隻需要觸發一次,随後就要立即解除綁定的情況,也可以使用

one()

方法。即在每個對象上,事件處理函數隻會被執行一次。