jquery on()方法綁定多個選擇器,多個事件


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

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

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

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

 

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

 

 1 <!--實例效果文字描述,可刪-->
 2     <div class="demonstrate">
 3         <div class="description">
 4             <h3>jq新版事件綁定.on()、解綁事件off()用法詳解</h3>
 5             <p>年月日 星期 時分秒</p>
 6         </div>
 7         <div id="demo">
 8             <ul>
 9                 <li>1 點我有3彈窗</li>
10                 <li>2 點我有3彈窗</li>
11                 <li>3 點我有3彈窗</li>
12                 <li>4 點我有3彈窗</li>
13             </ul>
14             <div style="clear:both;">
15                 <p>
16                     <a href="javascript:;" class="bind">js->添加一個li,添加的li也能響應之前綁定的事件!</a>
17                 </p>
18                 <p>
19                     <a href="javascript:;" class="unbindAllclick">解綁li 所有click事件</a>
20                 </p>
21                 <p>
22                     <a href="javascript:;" class="unbindSpecifyclick">解綁li 指定事件函數的click事件2</a>
23                 </p>
24                 <p>
25                     <a href="javascript:;" class="unbindNamespace">解綁li 同一命名空間中的click事件2、mouseout事件</a>
26                 </p>
27             </div>
28         </div>
29     </div>
30         <script type="text/javascript">
31 // js創建新元素
32 $(".bind").on("click",function(){
33     $("ul").append("<li/>");
34     var temp=$("ul li").last();
35     temp.html($("ul li").length +"響應點擊事件?");
36 });
37 // 舊版寫法: 事件不能適用腳本創建的新元素
38 // $("ul li").bind("click",function(){
39 //     alert("不響應事件!");
40 // })
41 // 舊版事件.live():適用腳本創建的新元素寫法,live()調用過程如下:我們首先將click方法綁定到了Document,然后,查找Document里是否有這個元素。 這個過程對於性能來說可能比較浪費
42 // $("ul li").live("click",function(){
43 //     alert("響應事件!");
44 // })
45 // 新版寫法一:單純將bind改成on,事件不能適用腳本創建的新元素
46 // $("ul li").on("click",function(){
47 //     alert("不響應事件!");
48 // })
49 // 新版寫法二:將live改成Delegate,適用腳本創建的新元素
50 // $(".demonstrate").delegate("ul li","click",function(){
51 //     alert("響應事件!");
52 // })
53 // 新版寫法三:適用於匹配選擇器的當前及未來的元素(比如由腳本創建的新元素)
54 // $(ele).on() ele 為匹配元素的父元素,可指定為document/body ,但從查找document/body向下檢索匹配元素這個過程對於性能來說,比較浪費,推薦定成匹配元素就近的父元素!!
55 //如果你開發最新版本的jQuery,完全可以使用on()方法來處理所有的事件綁定,避免過多的方法調用,因為其實在最新版本的jQuery類庫中,所有以上舊版方法在后面其實都是調用on()方法
56 $(".demonstrate").on("click","ul li",function(e){
57     alert("響應"+e.type+"事件1!");
58 });
59 $(".demonstrate").on("click.namespace","ul li",eventFunc=function(e){
60     alert("響應"+e.type+"事件2!");
61 });
62 $(".demonstrate").on("mouseout.namespace","ul li",function(e){
63     alert("響應"+e.type+"事件!");
64 });
65 // 新版多事件同時綁定寫法
66 //$(".demonstrate").on({
67 //    mouseover:function(){
68 //    $(this).addClass("over");
69 //    },
70 //    mouseout:function(){
71 //    $(this).removeClass("over");
72 //    }
73 //},"ul li")
74 //
75 //$(".demonstrate").on("mouseover mouseout","ul li",function(e){
76 //    if(e.type=="mouseover"){
77 //        $(this).addClass("over");
78 //    }else{
79 //        $(this).removeClass("over");
80 //    }
81 //})
82 // 新版解綁事件寫法: 可同時解綁多個事件 空格分隔開各個事件
83 // 解綁所有點擊事件
84 $(".unbindAllclick").click(function(){
85   $(".demonstrate").off('click',"ul li");
86 })
87 // 事件函數:可解綁指定事件函數的同類事件,第3個參數:事件函數 (不需要引號)
88 $(".unbindSpecifyclick").click(function(){
89   $(".demonstrate").off('click',"ul li",eventFunc);
90 })
91 // 命名空間:解綁同一命名空間中的多類(如click、mouseout等)事件,第1個參數可直接簡寫命名空間即可,或寫成"click.namespace mouseout.namespace"全寫形式
92 $(".unbindNamespace").click(function(){
93   $(".demonstrate").off('.namespace',"ul li");
94 })
95 </script>

 

 

轉自:http://www.phpvar.com/archives/2529.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM