我是javascript的新手,我遇到了以下问题,我多次搜索后无法在之前的答案中找到(希望这不是重复)。
我有以下模块/类。我们假设我正在尝试实现一个可以在屏幕上拖动的组件。当用户第一次点击时,我们会开始聆听mousemove
的{{1}}事件,以了解用户将鼠标移动到的位置。一旦用户释放鼠标,我们想要删除窗口的事件监听器。
代码非常直接,如果我只是在一个生命之外编码它就可以了。但是,目前 window
根本不起作用。我想这可能与 clousure ,范围等有关,但我完全错过了它。非常感谢您提前,这里是代码:
MyClass.js
removeEventListener
的index.html
...
var myNamespace = myNamespace || {};
(function(myNamespace){
var onMouseDragDown = function(e){
window.addEventListener("mousemove", onMouseDragMove,true);
window.addEventListener("mouseup", onMouseDragUp,false);
};
var onMouseDragUp = function(e){
// This code executes, but the events CONTINUE to be triggered after removing the event listener
//The following lines do not seem to have any effect whatsoever even though they are executed when the user releases the mouse button
window.removeEventListener("mousemove", onMouseDragMove, true);
window.removeEventListener("mouseup", onMouseDragUp,false);
};
var onMouseDragMove = function(e){
console.log('moving');
};
myNamespace.MyClass = function(param){
this._param = param;
this._div = document.createElement('div');
this._div = ....
this._div.addEventListener('mousedown', onMouseDragDown.bind(this), false);
}
myNameSpace.MyClass.prototype.getDiv = function (){
return this._div;
}
)(myNameSpace);
答案 0 :(得分:4)
要删除事件侦听器,您必须提供添加时提供的确切功能 这里发生的是bind()每次都创建一个新函数,所以事实上:
someFunc.bind(someObj) !== someFunc.bind(someObj)
要删除事件侦听器,您必须存储添加时提供的函数。
所以在添加它时存储侦听器以便以后删除它:
var someListener = someFunc.bind(someObj);
element.addEventListener("--", someListener ) ;
// then, later :
element.removeEventListener('--', someListener);
我在这里做了一个简短的演示,当你点击第一个按钮时它会提示'你好' 我们看到,通过对绑定的新调用删除侦听器,它不会删除它 然后删除存储的函数就可以完成工作。
http://jsbin.com/EjevIQA/2/edit
编辑:您不需要为要拖动的每个div添加/删除侦听器。 相反,你可以只听取窗口内的点击,并利用'目标' 事件的信息,它将告诉我们点击了哪个div 也许你会想要在处理时停止传播/防止默认 被点击的div,我不知道。
事件处理程序将如下所示:
function handleMouseDown(e) {
// you might check here which button was clicked (0=left, 2=right)
var button = e.button;
// retrieve the target
var target = e.target ;
// check if the target is an object we want to drag
...
... return otherwise.
// do some things to initialize the drag.
...
// you might want to prevent the click to bubble / trigger default behaviour :
e.stopPropagation();
e.preventDefault();
}
您可以在窗口或文档对象上一劳永逸地设置它:
document.addEventListener("mousedown", handleMouseDown)
我在这里做了一个小小的演示,点击一个div来看它已被识别:
http://jsbin.com/ilavikI/2/edit
答案 1 :(得分:1)
可能是你的
.bind(this)
在
this._div.addEventListener('mousedown', onMouseDragDown.bind(this), false);
不会返回对要移除的同一个函数的引用吗?