class ElementDragger {
constructor(elm) {
elm.addEventListener('mousedown', this);
}
handleEvent(e) {
const elm = e.target;
switch(e.type) {
case 'mousedown':
elm.removeEventListener('mousedown', this).
elm.addEventListener('mousemove', this);
elm.addEventListener('mouseup', this);
break;
case 'mousemove':
elm.style.left = e.clientX + 'px';
break;
case 'mouseup':
elm.removeEventListener('mousedown', this);
elm.removeEventListener('mouseup', this);
elm.addEventListener('mousedown', this);
break;
}
}
}I don't know the purpose unbinding mousedown on mousedown - it only fires once per mousedown doesn't it?
Why not just stick with `elm.addEventListener('mousedown', this.handleMouseDown.bind(this))`? Where's the benefit other than making things more verbose?
> Where's the benefit other than making things more verbose?
To be clear what you're asking, are you saying that:
elm.addEventListener('mousedown', this);
... is more verbose than: elm.addEventListener('mousedown', this.handleMouseDown.bind(this))Switch statements in OOP are a sign that something is wrong.
handleEvent(e) {
this[e.type](e, e.target);
}
mousemove(e, elm) {
elm.style.left = e.clientX + 'px';
}
... but then the discussion would almost certainly revolve around this questionable decision instead of the original topic.Then again, my jugment might be colored by working on codebases that are >21 years old.
You're vacillating and applying an inconsistent standard. The switch statement is used where multiple listeners are being attached, therefore it wouldn't work with your "single function". You'd need multiple functions.
Give any example passing functions directly as the callback to `addEventListener` to demonstrate your case, please. The equivalent version that simply implements DOMEventListener will be less verbose, be lighter on resources (both with memory use and with runtime), and have no need for any this-binding workaround weirdness.
this._callback = this.handleMouseDown.bind(this);
elm.addEventListener('mousedown', this._callback);
elm.removeEventListener('mousedown', this._callback);
this._callback = null;
Compared to: elm.addEventListener('mousedown', this);
elm.removeEventListener('mousedown', this);
@richthegeek I removed that event listener in my example to illustrate how easy it is, there was otherwise no good reason for it.