我有myDiv.mousedown
,window.mousemove
和window.mouseup
事件。我试图组织我的代码,并让它干净。所以我创建了一个function
并返回了3个事件处理程序
mousedown
事件会添加mousemove
个事件,而mouseup
事件会删除mousemove
个事件。
问题是,mousemove
事件永远不会被删除。 mouseup
事件会被触发,但mousemove
事件仍然存在。我做错了什么,如何解决它(以干净有序的方式)?
var myDiv = document.getElementById('myDiv');
var VeryUsefullClass = (function() {
function VeryUsefullClass(parentElem, options) {
var _this = this;
_this.index = 0;
_this.mouseHandlerBinded = mouseHandler.bind(_this);
myDiv.addEventListener('mousedown', _this.mouseHandlerBinded().mouseDown);
window.addEventListener('mouseup', _this.mouseHandlerBinded().mouseUp);
}
function mouseHandler() {
var _this = this;
var obj = {
mouseDown: function(e) {
console.log('mouseDown');
window.addEventListener('mousemove', _this.mouseHandlerBinded().mouseMove);
},
mouseMove: function(e) {
myDiv.innerHTML = 'mouseMove ' + _this.index++;
},
mouseUp: function(e) {
console.log('mouseUp');
_this.index = 0;
window.removeEventListener('mousemove', _this.mouseHandlerBinded().mouseMove);
}
}
return obj;
}
return VeryUsefullClass;
})();
console.clear();
var hello = new VeryUsefullClass();

#myDiv {
position: absolute;
background-color: orange;
width: 200px;
height: 100px;
}

<div id="myDiv"></div>
&#13;
答案 0 :(得分:0)
_this.mouseHandlerBinded().mouseMove
,你将获得一个新函数的函数,从不绑定。
var myDiv = document.getElementById('myDiv');
var VeryUsefullClass = (function() {
var mdown= mouseHandler().mouseDown;
var mup = mouseHandler().mouseUp;
var mmove; // unbind with this function will work
function VeryUsefullClass(parentElem, options) {
var _this = this;
_this.index = 0;
mmove = mouseHandler.call(_this).mouseMove;
myDiv.addEventListener('mousedown', mdown);
window.addEventListener('mouseup', mup);
}
function mouseHandler() {
var _this = this;
var obj = {
mouseDown: function(e) {
console.log('mouseDown');
window.addEventListener('mousemove', mmove);
},
mouseMove: function(e) {
myDiv.innerHTML = 'mouseMove ' + (_this.index++);
},
mouseUp: function(e) {
console.log('mouseUp');
_this.index = 0;
window.removeEventListener('mousemove', mmove);
}
}
return obj;
}
return VeryUsefullClass;
})();
console.clear();
var hello = new VeryUsefullClass();