jquery給動態生成的元素綁定事件,on函數


首先先解釋一下什么是動態生成的元素:動態生成的元素即我們用jquery的內部插入函數append()所生成的html代碼。相對的也有靜態生成的元素:即直接編寫在頁面的html代碼。

下面通過例子來講解:

html中有這樣一個table:

 1 <div class="table-responsive">
 2                         <table class="table  table-bordered">
 3                             <thead>
 4                             <tr>
 5                                 <th width="30">#</th>
 6                                 <th width="30"><input type="checkbox"></th>
 7                                 <th>名稱</th>
 8                                 <th width="100">操作</th>
 9                             </tr>
10                             </thead>
11                             <tbody id="rolePageBody">
12                             </tbody>
13                             <tfoot>
14                             <tr>
15                                 <td colspan="6" align="center">
16                                     <div id="Pagination" class="pagination"><!-- 這里顯示分頁 --></div>
17                                 </td>
18                             </tr>
19 
20                             </tfoot>
21                         </table>
22                     </div>

 

這是一個JavaScript函數:作用是動態的生成html代碼將pageInfo中的數據顯示在上邊的tbody中

 1 // 填充表格
 2 function fillTableBody(pageInfo) {
 3     // 判斷pageInfo對象是否有效
 4     if(pageInfo == null || pageInfo == undefined || pageInfo.list == null || pageInfo.list.length == 0) {
 5         $("#rolePageBody").append("<tr><td colspan='4' align='center'>抱歉!沒有查詢到您搜索的數據!</td></tr>");
 6         
 7         return ;
 8     }
 9     
10     // 使用pageInfo的list屬性填充tbody
11     for(var i = 0; i < pageInfo.list.length; i++) {
12         
13         var role = pageInfo.list[i];
14         
15         var roleId = role.id;
16         
17         var roleName = role.name;
18         
19         var numberTd = "<td>"+(i+1)+"</td>";
20         var checkboxTd = "<td><input id='"+roleId+"' class='itemBox' type='checkbox'></td>";
21         var roleNameTd = "<td>"+roleName+"</td>";
22         
23         var checkBtn = "<button type='button' class='btn btn-success btn-xs'><i class=' glyphicon glyphicon-check'></i></button>";
24         
25         // 通過button標簽的id屬性(別的屬性其實也可以)把roleId值傳遞到button按鈕的單擊響應函數中,在單擊響應函數中使用this.id
26         var pencilBtn = "<button id='"+roleId+"' type='button' class='btn btn-primary btn-xs pencilBtn'><i class=' glyphicon glyphicon-pencil'></i></button>";
27         
28         // 通過button標簽的id屬性(別的屬性其實也可以)把roleId值傳遞到button按鈕的單擊響應函數中,在單擊響應函數中使用this.id
29         var removeBtn = "<button id='"+roleId+"' type='button' class='btn btn-danger btn-xs removeBtn'><i class=' glyphicon glyphicon-remove'></i></button>";
30         
31         var buttonTd = "<td>"+checkBtn+" "+pencilBtn+" "+removeBtn+"</td>";
32         
33         var tr = "<tr>"+numberTd+checkboxTd+roleNameTd+buttonTd+"</tr>";
34         
35         $("#rolePageBody").append(tr);
36     }
37 
38 }

 

這樣問題就來了,如果我們用傳統的click方法綁定動態生成的button(上邊代碼第31行就是動態生成的button),就會出現問題,當我們翻頁的時候,頁面的按鈕就又會重新生成,此時click就不會綁定到重新生成的按鈕上,從而再次點擊按鈕時沒有響應。

傳統的click方法綁定動態生成的button:

$(".pencilBtn").click(function () {
      alert("xxx");
});

 

此時要解決這個問題,就要用到jquery的事件處理函數on()方法。

on函數有三個參數:

  • 第一個參數需要傳入事件類型:             注意:事件類型是不帶小括號的,不要寫成click(),應該寫click
    •   例如單擊事件就傳入click,失去焦點事件傳入blur,表單提交事件傳入submit。
  • 第二個參數需要傳入要綁定事件的元素的選擇器。           注意:元素選擇器不要寫成$("#xxxx"),直接寫#xxx就可以了
  • 第三個參數需要傳入事件的響應函數。
<script type="text/javascript">
    $(function(){
        // ①首先找到所有“動態生成”的元素所附着的“靜態”元素
        // ②on()函數的第一個參數是事件類型
        // ③on()函數的第二個參數是找到真正要綁定事件的元素的選擇器
        // ③on()函數的第三個參數是事件的響應函數
        $("#rolePageBody").on("click",".pencilBtn",function(){
            alert("xxx");
        });
    });
</script>

注:“動態生成”的元素所附着的“靜態”元素,即js動態生成的html元素在html頁面的父標簽,例如上邊代碼中所有動態生成的html代碼都要附着在id=rolePageBody的tbody中,所以需要動過這個依附的tbody對象來調用on方法。

 


免責聲明!

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



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