[轉]jq新版事件綁定.on()、解綁事件off()用法詳解

jquery1.4 及之前的版本,由.click() 或 .bind()方法綁定的事件,不能適用腳本創建的新元素:即是說頁面加載完成后,再動態創建的DOM元素并不能響應之前綁定的事件!

舊版本的處理方法是使用.live()方法來代替事件綁定.bind(),使得綁定的事件能適用腳本創建的新元素。

但自jq1.7版本開始,官方已明文表示不再推薦使用使用.live()方法,官方解釋為:live()調用過程首先將事件方法綁定到了Document,然后,查找Document里是否有匹配元素。 這個過程對于性能來說可能比較浪費。

官方推薦將.live()改成Delegate()方法,適用腳本創建的新元素。

jq1.8開始,官方又再次申明:如果你開發最新版本的jQuery,完全可以使用on()方法來處理所有的事件綁定,避免過多的方法調用,因為其實在最新版本的jQuery類庫中,所有以上舊版方法在后面其實都是調用on()方法。

本文將詳細介紹jq1.8中.on()用法,相關用法源碼如下:

舊版寫法:
<pre>
// 舊版寫法: 事件不能適用腳本創建的新元素
$("selector").bind("click",function(){
alert("不響應事件!");
})
// 舊版事件.live():適用腳本創建的新元素寫法,live()調用過程如下:我們首先將click方法綁定到了Document,然后,查找Document里是否有這個元素。 這個過程對于性能來說可能比較浪費
$("slector").live("click",function(){
alert("響應事件!");
})
</pre>

新版寫法:
<pre>
// 新版寫法一:單純將bind改成on,事件不能適用腳本創建的新元素
$("selector").on("click",function(){
alert("不響應事件!");
})
// 新版寫法二:將live改成Delegate,適用腳本創建的新元素
$("selector").delegate("child","click",function(){
alert("響應事件!");
})
// 新版寫法三:適用于匹配選擇器的當前及未來的元素(比如由腳本創建的新元素)
// $(selector).on('event','child',function(){}) selector為匹配元素的父元素,可指定為document/body ,但從查找document/body向下檢索匹配元素這個過程對于性能來說,比較浪費,推薦定成匹配元素就近的父元素!!
//如果你開發最新版本的jQuery,完全可以使用on()方法來處理所有的事件綁定,避免過多的方法調用,因為其實在最新版本的jQuery類庫中,所有以上舊版方法在后面其實都是調用on()方法
$("selector").on("click","child",function(e){
alert("響應"+e.type+"事件1!");
});
$("selector").on("click.namespace","child",eventFunc=function(e){
alert("響應"+e.type+"事件2!");
});
$("selector").on("mouseout.namespace","child",function(e){
alert("響應"+e.type+"事件!");
});
</pre>

新版多事件同時綁定寫法

<pre>
//方式一
$("selector").on({
mouseover:function(){
$(this).addClass("over");
},
mouseout:function(){
$(this).removeClass("over");
}
},"ul li");
//方式二
$("selector").on("mouseover mouseout","ul li",function(e){
if(e.type=="mouseover"){
$(this).addClass("over");
}else{
$(this).removeClass("over");
})
</pre>

新版解綁事件寫法: 可同時解綁多個事件 空格分隔開各個事件

<pre>
// 解綁所有點擊事件
$(".unbindAllclick").click(function(){
$(".demonstrate").off('click',"ul li");
})
// 事件函數:可解綁指定事件函數的同類事件,第3個參數:事件函數 (不需要引號)
$(".unbindSpecifyclick").click(function(){
$(".demonstrate").off('click',"ul li",eventFunc);
})
// 命名空間:解綁同一命名空間中的多類(如click、mouseout等)事件,第1個參數可直接簡寫命名空間即可,或寫成"click.namespace mouseout.namespace"全寫形式
$(".unbindNamespace").click(function(){
$(".demonstrate").off('.namespace',"ul li");
})
</pre>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容