让事件在捕获阶段执行,而不在冒泡阶段执行的使用场景。
plotly绘制图形,它自带鼠标滚动缩放图形、鼠标移动拖动图形的功能,现在我们想要点击拖动按钮后只能拖动(使滚轮滚动无效),再点击缩放按钮后又可以滚动鼠标缩放。
1、实现鼠标滚动缩放无效
鼠标滚动能缩放图形,是因为插件为鼠标滚动事件绑定了缩放方法。但我们不知道这个方法叫什么名字,而且下次点击缩放按钮后还要再用到这个滚动事件实现缩放。所以我们不能将这个缩放的滚动事件移除掉。
那我们想到一个办法,阻止它被触发就可以了。
在点击拖动按钮后,想要禁用缩放,此时我们在拖动按钮点击的事件回调中,为容器添加一个滚动事件
this.myPlot.addEventListener('wheel',stopPropagation,true)
其中this.myPlot是整个图形所在的最外层容器元素,我不管缩放的滚动事件绑定在哪个元素,总之它一定会在我这个容器元素的里面。
addEventListener的三个参数定义如下:
element.addEventListener(event, function, useCapture)
- event 必须。字符串,指定事件名。
- function 必须。指定要事件触发时执行的函数。
- useCapture 可选。布尔值,指定事件是否在捕获或冒泡阶段执行。
true - 事件句柄在捕获阶段执行
false- false- 默认。事件句柄在冒泡阶段执行
这里重要的语句是我们将第三个参数指定为true,那么这个滚动事件就会在捕获阶段执行,也就是在实现缩放的那个事件之前执行。
然后我们将此滚动的回调定义为如下方法:
function stopPropagation(e){
e.stopPropagation();
}
在里面我们只干了一件事,就是e.stopPropagation(),停止事件的传播,这样事件就到此结束了,它不会再往下去触发那个缩放的滚动事件了。
2、恢复鼠标滚动缩放
当点击缩放按钮后,我们又需要滚动缩放功能了,此时我们就将先前绑定在容器的滚动事件移除就行了。
this.myPlot.removeEventListener('wheel',stopPropagation,true);
第三个参数为true,指在捕获阶段移除事件句柄。
false- 默认。在冒泡阶段移除事件句柄.
如果添加两次事件句柄,一次在捕获阶段,一次在冒泡阶段,你必须单独移除该事件。