首先先解釋一下什么是動態生成的元素:動態生成的元素即我們用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方法。