使用ES6类(无需jQuery)
要在JavaScript中实现此操作而不需要jQuery的帮助,可以添加和删除事件处理程序。
首先创建将添加到事件侦听器中并将被移除的函数。
flagged () {
this.isScrolled = true;
}
并且这将停止事件上的所有事件
preventClick (event) {
event.preventDefault();
event.stopImmediatePropagation();
}
接着,在mousedown
和mousemove
事件依次触发时添加标志。
element.addEventListener('mousedown', () => {
element.addEventListener('mousemove', flagged);
});
记得在鼠标松开时移除此事件监听器,以免在该元素上重复触发大量事件。
element.addEventListener('mouseup', () => {
element.removeEventListener('mousemove', flagged);
});
最后,在我们的元素上的mouseup
事件中,我们可以使用标志逻辑来添加和删除点击。
element.addEventListener('mouseup', (e) => {
if (this.isScrolled) {
e.target.addEventListener('click', preventClick);
} else {
e.target.removeEventListener('click', preventClick);
}
this.isScrolled = false;
element.removeEventListener('mousemove', flagged);
});
在上面的例子中,我正在针对被单击的实际目标进行定位,因此如果这是一个滑块,我将针对图像而不是主要的库元素进行定位。要定位主要的
元素
,只需像这样更改添加/删除事件侦听器即可。
element.addEventListener('mouseup', (e) => {
if (this.isScrolled) {
element.addEventListener('click', preventClick);
} else {
element.removeEventListener('click', preventClick);
}
this.isScrolled = false;
element.removeEventListener('mousemove', flagged);
});
结论
通过将匿名函数设置为const,我们无需绑定它们。同样,这样它们也有了一个“句柄”,允许我们从事件中删除特定的函数,而不是整个事件集合上的所有函数。