如何在JavaScript中取消绑定给定DOM上的所有附加事件?

时间:2016-01-13 15:12:14

标签: javascript jquery

假设某些DOM节点(如<a>标记)与某些事件绑定,例如单击以打开弹出窗口或其他任何事件。但是我无法读取包含绑定内容的代码。我怎么解开他们所有人?有没有简单的方法/黑客?

再次更新:

-

我使用Chrome检查了Elements > Event Listeners,发现我的a上有点击事件处理程序,为了确保我是对的,我尝试了以下步骤:

首先,我从控制台手动添加了一个点击处理程序,如下所示:

$a.click(function(){console.log(1)});

然后我回到听众标签,按下刷新按钮,还有一个(现在有两个处理程序)。

然后我用:

$a.off();

我又回去了,我手动添加的那个已经消失了,只剩下一个处理程序(我想放弃的那个)

我使用了替换节点方式,然后再回过头来,我发现点击处理程序已经完全消失了。这就是我想要的。

所以,它就像$a.off()一样无效,即使它非常确定事件是绑定到元素本身,而不是它的父节点。

-

更新

  1. 我正在使用jQuery
  2. 我尝试$.unbind()$.off(),但都没有效果
  3. 我使用了$('#myEl').replaceWith($('#myEl').clone());,这很好用。但似乎这种方式并不是很完美。

3 个答案:

答案 0 :(得分:2)

您可以创建元素的克隆并替换它。克隆元素不会克隆附加的事件侦听器。

var original = document.getElementById('id'),
var clone = original.cloneNode(true);

original.parentNode.replaceChild(clone, original);

答案 1 :(得分:2)

没有API可以做到这一点。根据对元素进行的修改,您可以克隆节点,移动子节点并用其克隆替换原始节点:

var clone = element.cloneNode();
while (element.firstChild) {
  clone.appendChild(element.lastChild);
}
element.parentNode.replaceChild(clone, element);

cloneNode将复制所有属性,但不会复制对DOM属性所做的任何更改。

答案 2 :(得分:1)

也许你可以使用jquery .unbind():

$('a').unbind()

在新版本的jquery中,建议使用.off()。

$('a').off()

如果这不起作用,则意味着您的事件不对此元素具有约束力,但是其他像父元素一样,您可能在脚本中有此代码,并且您必须决定如何处理它:

$('.parent').on('click','a',callback);