首先看看如下程式碼執行:
<html>
<head>
<meta charset="utf-8">
<title>文件標題</title>
</head>
<body>
<div id="the_div">
</div>
<button id="btn">test</button>
<script src="https://cdn.staticfile.org/jquery/2.2.4/jquery.min.js"></script>
<script>
$('#btn').click(function(){
$('#the_div').append('<button>new button</button>');
})
$('#the_div button').click(function(){
alert('clicked');
})
</script>
</body>
</html>
初始時會監聽#btn即test按鈕,以及#the_div button即div中的所有按鈕的click事件。當點選test按鈕後div內會動態新增new button按鈕,而我們期望點選new button按鈕後,會彈出一個alert,但事實上這麼做是不會觸發alert的。
.click()
實際上是.on( "click", handler )
的簡化,而$( selector ).on( events, handler )
只會對當前已經存在,且滿足selector
條件的元素繫結events
,也就是說,這個繫結只針對於當前存在的元素,而在其之後加入到DOM中的元素,即使滿足selector
條件,也不會繫結對應的events
。
實際上jQuery也有專門的方法解決這個需求,即[.live()],$( selector ).live( events, handler )
會對所有當前和未來滿足selector
條件的元素繫結對應的events
。
但從jQuery 1.9開始,.live()
就被移除了。
在.live()
的API文件中,官方就給出了替代.live()
的方法,即目前最常用的方法:$( document ).on( events, selector, data, handler );
$( "a.offsite" ).live( "click", function() {
alert( "Goodbye!" ); // jQuery 1.3+
});
$( document ).on( "click", "a.offsite", function() {
alert( "Goodbye!" ); // jQuery 1.7+
});
對於上述例子的解決方案:
<html>
<head>
<meta charset="utf-8">
<title>文件標題</title>
</head>
<body>
<div id="the_div">
</div>
<button id="btn">test</button>
<script src="https://cdn.staticfile.org/jquery/2.2.4/jquery.min.js"></script>
<script>
$('#btn').click(function(){
$('#the_div').append('<button>new button</button>');
})
//解決方案
$('body').on('click','#the_div button',function(){
alert('clicked');
})
</script>
</body>
</html>