說明
採用JQuery技術先獲取頁面元素,然後再在後面追加元素的時候(append),在下面用 $(selector) 獲取剛剛添加的標籤,發現怎麼都獲取不到。
之所以這樣原因是因爲頁面已經將JS加載完畢,此時新增請求動態添加節點,自然獲取不到。
動態添加的標籤要事件委託才能獲取到節點,具體解決辦法:
- 通過on綁定事件(注意使用on綁定事件時,hover無效,因爲on的參數只能傳一個函數)
- live綁定:
- delegate綁定:
語法:
$(selector1).on(events,[selector2],[data],fn)
參數 | 描述 |
---|---|
events | 一個或多個用空格分隔的事件類型和可選的命名空間 |
selector2 | 可選。一個選擇器字符串,用以過濾選定的元素,該選擇器的後裔元素將調用處理程序。如果選擇是空或被忽略,當它到達選定的元素,事件總是觸發。 |
data | 可選。作爲event.data屬性值傳遞給事件對象的額外數據對象以供事件處理函數處理 |
fn | 該事件被觸發時執行的函數。 false值也可以做一個函數的簡寫,返回false |
注意:
- selector1 爲動態添加節點的父級節點,請使用非動態添加的父級節點,不然同樣獲取不到。
- 請委託給直接上級非動態添加節點,不要擴大範圍,否則可能會造成一次點擊多次執行情況!
示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="sth1"><button id="btn1">btn1</button></div>
<div id="sth2"></div>
<div id="sth3"></div>
<script src="jquery/jquery-2.1.1.min.js"></script>
<script type="text/javascript">
$("#btn1").click(function () {//能正常觸發事件
alert("btn 111");
});
$(function () {
$("#sth2").append('<button id="btn2">btn2</button>');
$("#sth3").append('<button id="btn3">btn3</button>');
});
$("#btn2").click(function () {//不能正常觸發事件
alert("btn 222");
});
$("#sth3").on("click","#btn3",function () {//能正常觸發事件
alert("btn 333");
});
</script>
</body>
</html>