我想从选定的HTML元素中仅删除mouseup
个事件列表器。
我使用了以下代码,但它将删除所有列表。
var old_element = divs[d];
var new_element = old_element.cloneNode(true);
old_element.parentNode.replaceChild(new_element, old_element);
这就是我附上活动名单的方式。
var divs = document.getElementsByTagName('body');// to enhance the preformance
for(var d in divs) {
try{
if (divs[d].addEventListener) {
divs[d].addEventListener('mouseup',callHighlight);
} else {
divs[d].attachEvent('mouseup', callHighlight);
}
}catch(err){
//alert(err.message);
}
}
答案 0 :(得分:1)
你应该使用removeEventListener代替replacechild,这显然会删除所有事件。
old_element.removeEventListener('mouseup', handler);
答案 1 :(得分:0)
默认情况下,所有事件侦听器都为null,因此只需重置它即可。问题是所有鼠标事件都已注册到正文,因此如果没有先将事件停止冒泡到正文,您将无法删除事件。您可以使用stopPropagation()
old_element.onmouseup = function (e) {
// event won't go up to the body tag
e.stopPropagation();
return null;
};
或
function kill (e) {
e.stopPropagation();
return null;
}
old_element.onmouseup = kill;
second_element.onmouseup = kill;
答案 2 :(得分:0)
克隆元素时,使用 addEventListener 或直接属性赋值(element.onclick = fn;
)添加的侦听器将被删除,但内联侦听器和使用IE的 attachEvent添加的侦听器不是。
在通过引用添加侦听器并且可能还使用 attachEvent 的情况下,最好使用 removeEventListener 和 detachEvent 删除它们。因此,您可能希望创建添加和删除功能,例如:
function addEvent(element, event, fn) {
if (element.addEventListener) {
element.addEventListener(event, fn, false);
} else if (element.attachEvent) {
element.attachEvent('on' + event, fn);
}
}
function removeEvent(element, event, fn) {
if (element.removeEventListener) {
element.removeEventListener(event, fn);
} else if (element.detachEvent) {
element.detachEvent('on' + event, fn);
}
}
请注意, addEventListener 和 attachEvent 之间存在一些显着差异,最重要的是,在后者中,此未设置为处理程序调用该函数的元素,并且不将该事件的引用作为侦听器的第一个参数传递。因此,监听器功能最终看起来像:
function foo(evt) {
evt = evt || window.event;
var target = evt.target || evt.srcElement;
...
}
有很多方法,但它们引入了更多问题。如果可以,请保持简单。