【发布时间】:2018-04-25 20:02:57
【问题描述】:
我正在动态地将节点(div)添加到 DOM 树并通过 jQuery(委托或非委托)附加事件侦听器。问题是我无法解开这些听众,结果他们堆积起来。这是一个示例代码,我找不到任何错误:
$(function() {
var theTXT = '<div data-abc="tester">click here</div>';
$("#loader").on('click', doClick);
function doClick() {
$("body").append(theTXT);
$('[data-abc="tester"]').off('click', redoClick);
$('[data-abc="tester"]').on('click', redoClick);
function redoClick() {
console.log("hi");
}
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="loader">load</div>
现在,如果我将 redoClick() 处理程序移到 doClick() 处理程序之外,一切正常。 任何帮助将不胜感激,这样我就可以理解为什么 .off() 不起作用。
【问题讨论】:
-
为什么要在另一个函数中声明一个函数? oO
-
目标是什么?对于每个添加的“单击此处”div,仅在第一次单击时记录“hi”?
-
@ZivWeissman 我更喜欢限制变量和函数的范围,这就是为什么
-
我可以删除所有点击监听器,像这样: $('[data-abc="tester"]').off('click');但我宁愿避免这种粗暴的解决方案。
-
@j08691 不,问题以一种相当复杂的形式出现,其中一部分是动态创建的。这是 .off() 有问题的行为的过度简化版本。我不明白的是 on() 看到 redoClick() 处理程序并注册事件,而 off() 没有(!)。
标签: jquery events event-handling