Oscar 的回答是不完整的,如果在您的局部(通过 ajax 加载的视图)中您使用 .on() 附加了事件,那么您必须在 .empty() 之前调用 .off()。
查看下面的代码,如果不调用 .off(),则在调用 .empty() 时删除通过标准 .click() 处理程序在 p1.html 中分配的事件,但通过 .on() 在 p2.html 中分配的事件是每次加载部分时都不会删除并重新分配。
索引.html
<html>
<body>
<script src="ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<div id='spi' style="padding: 20px; border: 1px solid #666;">
</div>
<br/>
<a href="p1.html" class="spi">Load Partial 1</a> |
<a href="p2.html" class="spi">Load Partial 2</a>
<script type="text/javascript">
$(document).on('click', 'a.spi' , function(e) {
e.preventDefault();
/*
!!! IMPORTANT !!!
If you do not call .off(),
events assigned on p2.html via .on()
are kept and fired one time for each time p2.html was loaded
*/
$("#spi").off();
$("#spi").empty();
$("#spi").load($(this).attr('href'));
});
</script>
</body>
</html>
p1.html
This is the partial 1<br/>
<br/>
<br/>
<a href="javascript:void(0)" id='p1_l1'>Link 1</a>
<br/><br/>
<a href="javascript:void(0)" id='p1_l2'>Link 2</a>
<br/><br/>
<a href="javascript:void(0)" id='p1_l3'>Link 3</a>
<script type="text/javascript">
$("#p1_l1").click(function(e) {
e.preventDefault();
console.debug("P1: p1_l1");
});
$("#p1_l2").click(function(e) {
e.preventDefault();
console.debug("P1: p1_l2");
});
</script>
p2.html
This is the partial 2<br/>
<br/>
<br/>
<a href="javascript:void(0)" id='p2_l1'>Link 1</a>
<br/><br/>
<a href="javascript:void(0)" id='p2_l2'>Link 2</a>
<script type="text/javascript">
$("#spi").on('click', 'a', function(e) {
e.preventDefault();
console.debug( 'P2: ' + $(this).attr('id') );
});
</script>