2017-06-20 68 views
2

我正在尝试使用Javascript自己的颜色拾取器轮,我希望能够通过拖动一个小圆圈(内部带有“+”符号)来选择颜色)或通过点击轮子上的某处(不拖动小圆圈,但小圆圈必须到达该位置)。另外,我希望能够在按下轮子上的某个位置(当触发mousedown事件时)之后拖动小圆圈,直到释放鼠标按钮(mouseup)。RemoveEventListener在另一个内部添加EventListener时不起作用

的位置:它是在这里看到了我想要在视觉上容易得多: https://jsfiddle.net/s1qesLp9/1/

如果您取消注释行78,然后就可以看到的问题是什么。

问题是,当我使用添加和删除eventListeners(因为我想要完成上述操作,我使用mousedown,mousemove和mouseup)我得到这样的警报数量为每mousedown增加1在车轮上(我只需要一个警戒,独立于车轮上的多少mousedowns!)。我在想如果它与文档对象有关,或者如果删除eventListeners有问题,但我不确定。

这里来,我有问题的一部分:

document.getElementById('wheel').addEventListener('mousedown', function(e) { 
    targetMove(e); 
    document.addEventListener('mousemove', targetMove); 
    document.addEventListener('mouseup', function() { 
     document.removeEventListener('mousemove', targetMove); 
     document.onmouseup = null; 
     alert("Here is the problem: For every mousedown on the wheel, the 
     number of alerts is increased by 1 (I only want one alert here!)"); 
    }); 
}, false); 

回答

0

我已经解决了!

而不必如此:

document.addEventListener('mouseup', function() { 
    document.removeEventListener('mousemove', targetMove); 
    document.onmouseup = null; 
    alert("Here is the problem: For every mousedown on the wheel, the number 
of alerts is increased by 1 (I only want one alert here!)"); 
}); 

我有这样的:

document.onmouseup = function() { 
    document.removeEventListener('mousemove', targetMove); 
    document.onmouseup = null; 
    alert("Problem is solved"); 
}; 

所以,问题是使用方法的addEventListener上mouseup和被赋予的功能的document.onmouseup更换代替。

感谢您试图帮助!

0

这是因为你要添加的新侦听每次鼠标按下后鼠标松开,永不删除。你可以移动它做一个指定的函数,并在添加之前调用remove。删除不存在的侦听器不会导致我意识到的任何问题。

< --edit - >我应该提到,如果您为每个操作设置标志,从逻辑角度来看,这可能会更容易。所以在mousedown你会移动目标并将鼠标设置为true。然后在mousemove上,如果鼠标移动目标。最后onmouseup,将mouseheld设置为false。 < --edit - />

document.getElementById('wheel').addEventListener('mousedown', function(e) { 
 
    targetMove(e); 
 
    document.addEventListener('mousemove', targetMove); 
 
    
 
    //This listener is getting added with every mousedown and is never removed 
 
    document.addEventListener('mouseup', function() { 
 
     document.removeEventListener('mousemove', targetMove); 
 
     document.onmouseup = null; 
 
     alert("Here is the problem: For every mousedown on the wheel, the 
 
     number of alerts is increased by 1 (I only want one alert here!)"); 
 
    }); 
 
}, false);

+0

我不太清楚你设置标志的意思。是否也可以用代码显示,因为那样会更容易理解。随意更改提供的代码中的代码:)你说我永远不会删除监听器到mouseup,我不会删除监听器(mouseup和mousemove)通过函数()中的以下代码: document.removeEventListener('mousemove ',targetMove); document.onmouseup = null; – amarillo

+0

就我而言,删除侦听器可以通过:document.onmouseup = null或document.removeEventListener('mouseup',targetMove)来完成。我已经尝试过没有任何解决方案,一切工作,因为它应该。 – amarillo

0

事件侦听器为mousedown事件,再次添加相同的事件侦听器每个mousedown。如果从回调函数中删除这些事件侦听器,并分别添加它们,则不会出现此问题。

document.getElementById('wheel').addEventListener('mousedown', function(e) { 
    targetMove(e); 
}, false); 

document.addEventListener('mousemove', targetMove); 
document.addEventListener('mouseup', function() { 
    document.removeEventListener('mousemove', targetMove); 
    document.onmouseup = null; 
    alert("Problem solved! You are binding this event listener only once."); 
    }); 

这是jsFiddle

+0

谢谢你的回答!这样做的问题是有一些功能会消失。正如您在上面提供的链接中看到的,您可以单击轮盘上的某个地方并拖动小圆圈,但也可以在按下轮子上的某个位置后拖动小圆圈,直到松开鼠标按钮。 – amarillo

+0

是的,我只会在解决方案时得到一个警报,但我也希望拥有小圆圈的所有功能(您无法执行代码的唯一功能是在按下轮子上的某个地方后拖动小圆圈(在开始时不拖动小圆圈),当鼠标按钮被释放时,小圆圈停留在那里)。如果你比较我和你的链接,那么你会注意到我的意思。 – amarillo

相关问题