1. 程式人生 > >JQuery繫結事件bind()方法和on()方法的優缺點

JQuery繫結事件bind()方法和on()方法的優缺點

jQuery繫結事件的方法有四種:bing()、live()、delegate()、on(),其中live(),已經被淘汰了,其存在很多的問題,不適合使用,而delegate能夠在繫結事件後,依然可以新增動態元素事件。on()可以說是前三種方法的結合體。

1.bind()方法:
bind()函式用於為每個匹配元素的一個或多個事件繫結事件處理函式。
2、bind(event,data,function)
引數 描述:
event事件是必需要寫的。規定新增到元素的一個或多個事件。由空格分隔多個事件。而且必須是有效的事件。
data資料 可選。規定傳遞到函式的額外資料。
function 必需。

規定當事件發生時執行的函式。
3、demo:

<html>
<head>
<script type="text/javascript" src="/jquery/jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
  $("button").bind("click",function(){
    $("div").slideToggle();
  });
});
</script>
</head>
<body
>
<div>This is a box.</div> <button>請點選這裡</button> </body> </html>

4、注意:
在執行bind()時,事件處理函式會繫結到每個匹配元素上。例如你使用bind()裡面所有的button元素綁定了click事件,那麼當時文件中所存在的每個button元素都會繫結click事件。如果之後你再向文件中添加了新button的元素,其繫結事件不會對其生效。如果你希望繫結事件對未來新新增的元素也生效,請使用on()、delegate()、live()等事件函式(儘量優先使用靠前的事件函式)。
另外,如果同一元素、同一事件型別繫結多個事件處理函式。那麼觸發事件時,jQuery會按照繫結的先後順序依次執行繫結的事件。
如果想要解綁bind()繫結的事件,就用unbind()函式。
5、bing()優缺點:


優點:
1.這個方法的相容性好,能夠提供出對每個事件的相容問題的解決方案;
2.非常的方便,簡單;
3.如.click(), .hover()…這些非常方便的事件,都是bind的一種簡化處理方式;
4.對於利用ID選出來的元素是非常好的,不僅僅是很快的可以找到(因為一個頁面只有一個id),而且當事件發生時,handler可以立即被執行(相對於後面的live, delegate)實現方式;

缺點:
1.它會繫結事件到所有的選出來的元素上;
2.它不會繫結到在它執行完後動態新增的那些元素上;
3.當元素很多時,會出現效率問題;
4.當頁面載入完的時候,你才可以進行bind(),所以可能產生效率問題;

1、on()
on() 方法在被選元素及子元素上新增一個或多個事件處理程式。
2、on(event,childSelector,data,function)
event必需。規定要從被選元素移除的一個或多個事件或名稱空間。由空格分隔多個事件值。必須是有效的事件。
childSelector 可選。規定只能新增到指定的子元素上的事件處理程式(且不是選擇器本身,比如已廢棄的 delegate() 方法)。
data 可選。規定傳遞到函式的額外資料。
function 可選。規定當事件發生時執行的函式。
map 規定事件對映 ({event:function, event:function, …}),包含要新增到元素的一個或多個事件,以及當事件發生時執行的函式。
3、demo:

<!DOCTYPE html>
<html>
<head>
<script src="http://cdn.static.runoob.com/libs/jquery/1.10.2/jquery.min.js">
</script>
<script>
$(document).ready(function(){
  $("p").on("click",function(){
    alert("The paragraph was clicked.");
  });
});
</script>
</head>
<body>

<p>Click this paragraph.</p>

</body>
</html>

4、其實.bind(), .live(), .delegate()都是通過.on()來實現的,.unbind(), .die(), .undelegate(),也是一樣的都是通過.off()來實現的
這是1.8.2的原始碼:

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 ) {
    // ( namespace ) or ( selector, types [, fn] )
    return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
},

5、優缺點:
優點:
1.提供了一種統一繫結事件的方法;
2.仍然提供了.delegate()的優點,當然如果需要你也可以直接用.bind();

缺點:
也許會對你產生一些困擾,因為它隱藏了一前面我們所介紹的三種方法的細節;