2

当我将事件处理程序绑定到 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/

显然,偶数处理程序不会绑定到具有相同 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引擎会冒内存不足的风险吗?

4

2 回答 2

2

您应该专注于事件委托。

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

然后您可以将元素添加到包装器中,分配它们.someClass并且事件将触发。

于 2013-01-30T22:30:07.557 回答
0

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

于 2013-01-30T22:34:49.500 回答