javascript - 'stopPropagation' 是否应该阻止画布接收 Fabricjs 对象上的鼠标事件?
问题描述
这是一个非常简单的问题,但我似乎找不到答案。
我有一个fabricjs
带有鼠标 eventListener 的画布实例。我还有一堆带有鼠标事件监听器的对象。我不希望对象上的鼠标事件传递到画布。stopPropagation
和/或stopImmediatePropagation
不要停止事件。
我使用这些方法错了吗?或者有没有Fabricjs
办法处理这个?
包装Fabricjs
画布实例的类上的方法
this.canvas.on("mouse:down", this.handleMouseDown);
子类上的方法Fabricjs
:
testMouseDownHandler: function (event) {
event.e.stopPropagation();
event.e.stopImmediatePropagation();
event.e.preventDefault();
if (event.e.shiftKey) {
this.canvas.setActiveObject(this);
}
},
解决方案
正如@traktor53 在他的评论中所说,在画布对象上没有冒泡这样的事情。在 Konva.js 中,他们实际上在对象级别添加了自己的事件处理,其中冒泡的模拟方式与您在普通 DOM 中所期望的完全一样(更多关于 Konva.js 文档中 Konva 的强大功能:https://konvajs .org/docs/events/Cancel_Propagation.html)。
据我所知,它不适用于 Fabric.js,但这并不意味着您在单击对象时不能阻止画布的事件处理程序的执行。
主要问题是画布事件在对象事件之前触发,这意味着当您尝试防止对象的事件处理程序内部“冒泡”时,您为时已晚(从这个意义上说,它确实没有向画布“冒泡”)。
我通过忽略所有具有目标的画布事件来阻止画布事件执行,这意味着它只会在我们单击画布之外的任何其他内容时运行:
canvas.on('mouse:down', (event) => {
if(event.target !== null){
//Ignore this event, we are clicking on an object (event.target is clicked object)
return;
}
//... your canvas event handling code...
}
object.on('mousedown', (event) => {
//... your object event handling code...
let object = event.target;
}
在文档中找到所有其他事件名称:http: //fabricjs.com/events
希望这会有所帮助。如果还有其他(更好的解决方案),请发表评论。
推荐阅读
- pytorch - data_block api :show_batch 导致 CUDA 未知错误
- apache-kafka - 如何在同一主题中创建多个 kafka 消费者组
- sql - SQL:我只想获取特定的列
- java - TimerTask 中 ArrayList 的 add() 导致所有元素都相同
- wordpress - 发送关于贝宝成功的电子邮件
- amazon-web-services - 如何在速度模板(AWS appsync + elasticsearch)中使用字符串替换?
- c# - 如何将匿名类型列表推送到已定义类型列表
- python - Python:为不存在的字段赋值
- java - 文件夹过长时读取文件
- python - 获取 SalesforceMalformedRequest:格式错误的请求错误