有没有办法在Fabric.js画布上接收鼠标右击事件?
以下代码仅适用于左键单击:
canvas.observe('mouse:down', function(){console.log('mouse down'));
答案 0 :(得分:4)
我通过扩展fabric.Canvas类实现了右键单击。看看_onMouseDown
方法here。
默认情况下,在fabricjs中基本上禁用了对象的鼠标右键事件。
答案 1 :(得分:3)
我这样做的方法是在整个画布上侦听右键单击事件,并将click事件的x,y坐标与当前位于给定位置的对象进行匹配。这个解决方案感觉有点像黑客,但嘿,它有效!
$('#my_canvas').bind('contextmenu', function (env) {
var x = env.offsetX;
var y = env.offsetY;
$.each (canvas._objects, function(i, e) {
// e.left and e.top are the middle of the object use some "math" to find the outer edges
var d = e.width / 2;
var h = e.height / 2;
if (x >= (e.left - d) && x <= (e.left+d)) {
if(y >= (e.top - h) && y <= (e.top+h)) {
console.log("clicked canvas obj #"+i);
//TODO show custom menu at x, y
return false; //in case the icons are stacked only take action on one.
}
}
});
return false; //stops the event propigation
});
答案 2 :(得分:3)
如果要处理右键单击(在画布或其对象上),请在upper-canvas元素上设置上下文菜单侦听器。使用canvas方法findTarget,您可以检查是否单击了任何目标,如果是,则可以检查目标的类型。
let scope = this;
jQuery(".upper-canvas").on('contextmenu', function (options: any) {
let target: any = scope.canvas.findTarget(options, false);
if (target) {
let type: string = target.type;
if (type === "group") {
console.log('right click on group');
} else {
scope.canvas.setActiveObject(target);
console.log('right click on target, type: ' + type);
}
} else {
scope.canvas.discardActiveObject();
scope.canvas.discardActiveGroup();
scope.canvas.renderAll();
console.log('right click on canvas');
}
options.preventDefault();
});
答案 3 :(得分:2)
这就是我所做的,它使用了一些内置的结构对象检测代码:
$('.upper-canvas').bind('contextmenu', function (e) {
var objectFound = false;
var clickPoint = new fabric.Point(e.offsetX, e.offsetY);
e.preventDefault();
canvas.forEachObject(function (obj) {
if (!objectFound && obj.containsPoint(clickPoint)) {
objectFound = true;
//TODO: whatever you want with the object
}
});
});
答案 4 :(得分:1)
注意: 以上大多数答案已过时;此答案适用于最新的Fabric版本2.7.0
可以在here for fireRightClick
和here for fireMiddleClick
中找到在画布中触发右键单击和中键单击事件的配置,默认情况下将其设置为false
。这意味着默认情况下,右键和中点击事件是禁用的。
您只需在创建画布时设置值即可启用这些功能:
var canvas = new fabric.Canvas('canvas', {
height: height,
width: width,
fireRightClick: true, // <-- enable firing of right click events
fireMiddleClick: true, // <-- enable firing of middle click events
});
现在,您的mousedown
事件将针对所有点击触发,您可以通过使用事件上的按钮标识符来区分它们:
canvas.on('mouse:down', (event) => {
if(event.button === 1) {
console.log("left click");
}
if(event.button === 2) {
console.log("middle click");
}
if(event.button === 3) {
console.log("right click");
}
}
object.on('mousedown', (event) => {
if(event.button === 1) {
console.log("left click");
}
if(event.button === 2) {
console.log("middle click");
}
if(event.button === 3) {
console.log("right click");
}
}
要防止显示上下文菜单或防止气泡/传播到画布后面的其他元素,可以添加:
if(event.button === 3){
// event.e is the "real" DOM mouse event
event.e.preventDefault();
event.e.stopPropagation();
}
这将允许您在整个Fabric应用中使用右键和/或中键。