Javascript 父事件结束时是否销毁子侦听器?

Javascript 父事件结束时是否销毁子侦听器?,javascript,event-listener,Javascript,Event Listener,例如,如果您有下面的代码,当未发生mousedown时,mousemove和mouseup事件是否会被销毁 var el = document.getElementById('mydiv'); el.addEvenListener('mousedown', function(event){ initializeStuff(); document.onmousemove = function(event) { event = event || window.event;

例如,如果您有下面的代码,当未发生
mousedown
时,
mousemove
mouseup
事件是否会被销毁

var el = document.getElementById('mydiv');
el.addEvenListener('mousedown', function(event){ 
  initializeStuff();

  document.onmousemove = function(event) {
    event = event || window.event;
    showDragAnimation();
  };

  doucment.onmouseup = function() {
    showFinalPosition();
  };

}, false);

不,它们不会被破坏,
mousedown
不被认为是“没有发生”。因为JS不会并发运行,所以无论如何这都没有意义

如果您的代码确实使用了
addEventListener
,那么它将严重泄漏事件处理程序,并且您的应用程序将变得非常缓慢(每次单击都会导致更多)。只有在覆盖以前的侦听器的…属性上使用旧的
,才能避免这种命运

您将要使用

function onmousedown(event) {
    this.addEventListener("mousemove", onmousemove, false);
    this.addEventListener("mouseup", onmouseup, false);
    initializeStuff();
}
function onmousemove(event) {
    showDragAnimation();
}
function onmouseup(event) {
    this.removeEventListener("mousemove", onmousemove);
    this.removeEventListener("mouseup", onmouseup);
    showFinalPosition();
}

document.getElementById('mydiv').addEvenListener('mousedown', onmousedown, false);

不,它们不是,您必须在代码中删除它们。不。除非文档被销毁,否则事件将起作用。@Teemu或@jsve,这意味着
mouseup
将随时触发?或者只有当鼠标向下移动时才会触发?嗯。。。实际上,
mouseup
只能在
mousedown
之后激发,但是无论鼠标按钮是否按下,
mousemove
都会被激发。请注意,有时候,当文档发生在浏览器视图之外时,
onmouseup
不会激发文档。这可能会产生奇怪的体验,您可能需要采取一些防范措施。谢谢。我更喜欢你的格式。另外,关于将相同的EventListener添加到您前面指出的元素:如果使用相同参数在同一EventTarget上注册了多个相同的EventListener,则会丢弃重复的实例。它们不会导致EventListener被调用两次,而且由于重复项被丢弃,因此不需要使用removeEventListener方法手动删除它们。“@ayjay:是的,但在原始代码中,您使用了函数表达式,这将导致不同的函数:-)