使用JavaScript从HTML元素中删除特定的事件侦听器集

时间:2013-10-14 02:22:37

标签: javascript html

我想从选定的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);
        }
}       

3 个答案:

答案 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;

JSFIDDLE

答案 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;
  ...
}

有很多方法,但它们引入了更多问题。如果可以,请保持简单。