当DOM元素消失时,绑定事件会发生什么?

时间:2013-01-30 22:25:44

标签: javascript jquery events javascript-engine

当我将事件处理程序绑定到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引擎可能会出现内存不足的风险吗?

2 个答案:

答案 0 :(得分:2)

您应该专注于事件委派。

$('#someWrapper').on('click', '.someClass', function() {
   // do your stuff.
});

然后你可以向包装器中添加元素,为它们分配.someClass并触发事件。

答案 1 :(得分:0)

不必在每次创建元素时重新绑定事件,而是应该使用事件委派,而不是AlienWebguy建议的那样。但是,在这种情况下,从dom中删除jQuery对象后没有任何指向jQuery对象,因此垃圾收集应该负责清理未使用的变量。