当我将事件处理程序绑定到DOM元素然后销毁DOM元素时会发生什么?我是否必须完成解除事件处理程序绑定的过程?
<div id="el1">
<span id="c">Click Me!</span>
</div>
<span id="note">Note...</span>
<script>
var i=0;
$("#c").click(function(){
i++;
$("#note").html("'Click Me!' was clicked.");
$("#el1").html("<span id=\"c\">Click Me! ("+i+" time)</span>");
});
</script>
行动中:http://jsfiddle.net/lordloh/FyLdM/
显然,even处理程序不会绑定到具有相同id的新DOM对象。我正在使用的工作是
<div id="el1">
<span id="c">Click Me!</span>
</div>
<span id="note">Note...</span>
<script>
var i=0;
$("#c").click(clickHandler);
function clickHandler(){
i++;
$("#note").html("'Click Me!' was clicked.");
$("#el1").html("<span id=\"c\">Click Me! ("+i+" time)</span>");
$("#c").click(clickHandler);
}
</script>
行动中:http://jsfiddle.net/lordloh/FyLdM/1/
我关心的是这是一种不好的做法还是可以接受的?如果这个序列重复数百万次会发生什么? javascript引擎可能会出现内存不足的风险吗?
答案 0 :(得分:2)
您应该专注于事件委派。
$('#someWrapper').on('click', '.someClass', function() {
// do your stuff.
});
然后你可以向包装器中添加元素,为它们分配.someClass
并触发事件。
答案 1 :(得分:0)
不必在每次创建元素时重新绑定事件,而是应该使用事件委派,而不是AlienWebguy建议的那样。但是,在这种情况下,从dom中删除jQuery对象后没有任何指向jQuery对象,因此垃圾收集应该负责清理未使用的变量。