如何清除/删除JavaScript事件处理程序?

56 html javascript dom-events

给出以下HTML片段:

<form id="aspnetForm" onsubmit="alert('On Submit Run!'); return true;">
Run Code Online (Sandbox Code Playgroud)

我需要删除/清除onsubmit事件的处理程序,并使用jQuery或任何其他JavaScript使用方式注册我自己的处理程序.

jig*_*ggy 82

要做到这一点没有任何库:

document.getElementById("aspnetForm").onsubmit = null;
Run Code Online (Sandbox Code Playgroud)

  • 嗯......如果你把它设置为null而不是undefined它会起作用吗?虽然undefined*应该*是正确的设置,但null可能有效. (8认同)
  • `的document.getElementById( "aspnetForm").的removeAttribute( '的onsubmit')` (2认同)

Pet*_*ley 24

用jQuery

$('#aspnetForm').unbind('submit');
Run Code Online (Sandbox Code Playgroud)

然后继续添加自己的.

  • 您只能取消绑定使用jQuery的`bind()`方法添加的事件侦听器. (28认同)
  • 相反,你可以使用$ .die('submit') (2认同)

小智 11

试试这个,这对我有用:

$('#aspnetForm').removeAttr('onsubmit').submit(function() {   
    alert("My new submit function justexecuted!"); 
});
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅


Aka*_*ash 5

这是一个古老的问题,但鉴于主要浏览器都已放弃EventTarget.getEventListeners(),这里有一种方法可以删除元素及其子元素上的所有事件处理程序,并仅保留 HTML 结构。我们简单地克隆元素并替换它:

let e = document.querySelector('selector');
let clone = e.cloneNode(true);
e.replaceWith(clone);
Run Code Online (Sandbox Code Playgroud)

addEventListener()与使用跟踪每个处理程序函数的方法抢占原型一样多,但至少可以在 DOM 已经与另一个脚本的事件连接后使用。

这也与上面使用 jQueryclone()代替cloneNode()

let original = $('#my-div');
let clone = original.clone();
original.replaceWith(clone);
Run Code Online (Sandbox Code Playgroud)

这种模式实际上不会在元素或其子节点上留下任何事件处理程序,除非它们被定义为“on”属性,onclick="foo()".