jQuery動態添加元素後元素註冊事件失效解決
前言:
近日丟醬在學jQuery,在學習的時候遇到瞭一個問題,雖然最後解決瞭,但是丟醬覺得要把這個問題解決的方法記錄下來,這樣有小夥伴遇到同樣的問題就不會跟我一樣解決好久啦。
我先貼一段正常邏輯的代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="jquery.min.js"></script> <style> * { margin: 0; padding: 0; } a { text-decoration: none; } button { position: relative; left: 712px; top: 97px; } .content { width: 500px; height: 30px; line-height: 30px; border: 1px solid #bbb; margin: 100px auto; border-collapse: collapse; } th { background-color: rgb(27, 126, 184); color: #fff; border: 1px solid #bbb; } td { border: 1px solid #bbb; } </style> </head> <body> <button>添加數據</button> <table class="content" align="center"> <tr> <th style="font-weight: 700;">課程名稱</th> <th style="font-weight: 700;">所屬學院</th> <th style="font-weight: 700;">已學會</th> </tr> </table> <script> $(function() { var t1 = $('<tr align="center"><td>javaScript</td><td>傳智播客-前端與移動開發學院</td><td><a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="del">GET</a></td></tr>'); var t2 = $('<tr align="center"><td>css</td><td>傳智播客-前端與移動開發學院</td><td><a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >GET</a></td></tr>'); var t3 = $('<tr align="center"><td>html</td><td>傳智播客-前端與移動開發學院</td><td><a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >GET</a></td></tr>'); var t4 = $('<tr align="center"><td>jQuery</td><td>傳智播客-前端與移動開發學院</td><td><a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >GET</a></td></tr>'); $('button').on('click', function() { // console.log($('table tr')); if ($('table tr').length === 1) { $('table').append(t1); console.log($(".del")); // console.log($('table tr').length); } else if ($('table tr').length === 2) { $('table').append(t2); } else if ($('table tr').length === 3) { $('table').append(t3); } else if ($('table tr').length === 4) { $('table').append(t4); } else { return false; } }); // $("table a").on('click', function() { // $('table').children('tr').remove(); // }) $('tr').on('click', 'a', function() { console.log(11); $(this).parents('tr').remove(); }) }) </script> </body> </html>
前端頁面操作流程:
- 1.先點擊“添加數據”按鈕,把a標簽動態生成出來。
- 2.再點擊a標簽(GET),查看控制臺。
結果:控制臺啥也沒有輸出
因為這樣寫是有問題的。所有需要修改一下。我先把我修改後的代碼貼出來。後面解釋
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="jquery.min.js"></script> <style> * { margin: 0; padding: 0; } a { text-decoration: none; } button { position: relative; left: 712px; top: 97px; } .content { width: 500px; height: 30px; line-height: 30px; border: 1px solid #bbb; margin: 100px auto; border-collapse: collapse; } th { background-color: rgb(27, 126, 184); color: #fff; border: 1px solid #bbb; } td { border: 1px solid #bbb; } </style> </head> <body> <button>添加數據</button> <table class="content" align="center"> <tr> <th style="font-weight: 700;">課程名稱</th> <th style="font-weight: 700;">所屬學院</th> <th style="font-weight: 700;">已學會</th> </tr> </table> <script> $(function() { var t1 = $('<tr align="center"><td>javaScript</td><td>傳智播客-前端與移動開發學院</td><td><a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="del">GET</a></td></tr>'); var t2 = $('<tr align="center"><td>css</td><td>傳智播客-前端與移動開發學院</td><td><a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >GET</a></td></tr>'); var t3 = $('<tr align="center"><td>html</td><td>傳智播客-前端與移動開發學院</td><td><a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >GET</a></td></tr>'); var t4 = $('<tr align="center"><td>jQuery</td><td>傳智播客-前端與移動開發學院</td><td><a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >GET</a></td></tr>'); $('button').on('click', function() { // console.log($('table tr')); if ($('table tr').length === 1) { $('table').append(t1); console.log($(".del")); // console.log($('table tr').length); } else if ($('table tr').length === 2) { $('table').append(t2); } else if ($('table tr').length === 3) { $('table').append(t3); } else if ($('table tr').length === 4) { $('table').append(t4); } else { return false; } }); // $("table a").on('click', function() { // $('table').children('tr').remove(); // }) $('.content').on('click', 'a', function() { console.log(11); $(this).parents('tr').remove(); }) }) </script> </body> </html>
前端頁面操作流程:
- 1.先點擊“添加數據”按鈕,把a標簽動態生成出來。
- 2.再點擊a標簽(GET),查看控制臺。
**結果:控制臺開始輸出瞭 **
開始作解釋瞭。其實大傢可以看出來,這裡隻有一個區別。我把這兩個貼出來
// 控制臺不輸出 // 通過on事件委派來給tr裡面的a標簽添加點擊事件 $('tr').on('click', 'a', function() { console.log(11); $(this).parents('tr').remove(); }); // 控制臺輸出 $('.content').on('click', 'a', function() { console.log(11); $(this).parents('tr').remove(); });
第一個裡,我們是事件委派對a標簽的元素作單擊事件。但是這種jquery獲取不到動態添加元素的。
方案解釋:
on雖然可以給未來動態創建的元素綁定事件,但是要先獲取已擁有的父級元素。然後才能再獲取動態元素。
就是相當於說,給父元素添加一個事件(該事件類型和動態元素想要實現的事件類型一樣)
所以這裡可以得到:
<table class="content" align="center"> <tr> <th style="font-weight: 700;">課程名稱</th> <th style="font-weight: 700;">所屬學院</th> <th style="font-weight: 700;">已學會</th> </tr> // 動態添加的元素 <tr align="center"> <td>javaScript</td> <td>傳智播客-前端與移動開發學院</td> <td><a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="del">GET</a></td> </tr> </table>
.content是a標簽的父級
$('.content').on('click', 'a', function() { console.log(11); $(this).parents('tr').remove(); })
隻要記住,在動態生成的元素中,不能直接指定其事件。隻能其父標簽的事件後,過濾指定特定元素事件。
還有一種寫法:直接指定dom的元素事件。這也是可以的。
$(document).on('click',"a",function(){ console.log("22"); })
到此這篇關於jQuery動態添加元素後元素註冊事件失效解決的文章就介紹到這瞭,更多相關jQuery添加元素內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- jQuery選擇器用法介紹
- jquery+swiper組件實現時間軸滑動年份tab切換效果
- jQuery利用DOM遍歷實現商城結算系統實戰
- jQuery實現HTML元素隱藏和顯示
- javascript:void(0)的含義及用法實例