jQuery嵌套事件绑定时,如果逻辑处理不当,有时会出现事件重复绑定的问题,例如下面的例子。
点击“添加文本框”按钮时,会在div中新增一个textarea,同时使用bind方法为class为demo-textarea的元素绑定click事件
jQuery事件重复绑定Demo,点击“新增文本框”按钮追加textarea
点击textarea弹出提示,重复添加时会重复绑定
第n次新增之后,textarea在点击时会重复弹出n次提示。
相关代码如下所示:
<script>
$(document).ready(function(){
$("#add-btn").on("click",function(){
$("#first-p").after('<p id="demo-p"><textarea class="demo-textarea">点击textarea弹出提示</textarea></p>');
$("#demo-div").find(".demo-textarea").bind("click",function(){
alert("Textarea Clicked!");
});
});
});
</script>
<div id="demo-div" style="border:solid 1px;padding:5px 10px;">
<p id="first-p">jQuery事件重复绑定Demo,点击“新增文本框”按钮追加textarea;<br />
点击textarea弹出提示,重复添加时会重复绑定</p>
<p><button id="add-btn" title="点我添加一个文本框">添加文本框</button></p>
</div>
事件重复绑定到的简单解决方法:
事件绑定嵌套时,内层事件绑定前执行ubind方法解除绑定,上例中的代码变更为:
<script>
$(document).ready(function(){
$("#add-btn").on("click",function(){
$("#first-p").after('<p id="demo-p"><textarea class="demo-textarea">点击textarea弹出提示</textarea></p>');
$("#demo-div").find(".demo-textarea").unbind("click").bind("click",function(){
alert("Textarea Clicked!");
});
});
});
</script>
代码修改后,效果如下:
点击“新增文本框”按钮追加textarea
点击textarea弹出提示,重复添加时不会重复绑定
第n次新增之后,textarea在点击时只会弹出1次提示。
实际上,上例使用下面的代码更为妥当:
<script>
$(document).ready(function(){
$(document).on("click", "#demo-div .demo-textarea", function(){
alert("Textarea Clicked!");
});
$("#add-btn").on("click", function(){
$("#first-p").after('<p id="demo-p"><textarea class="demo-textarea">点击textarea弹出提示</textarea></p>');
});
});
</script>
效果如下:
点击“新增文本框”按钮追加textarea
点击textarea弹出提示,重复添加时不会重复绑定
第n次新增之后,textarea在点击时只会弹出1次提示。
本文链接:http://bookshadow.com/weblog/2014/08/21/jquery-duplicate-bind-demo-and-solution/
请尊重作者的劳动成果,转载请注明出处!书影博客保留对文章的所有权利。