有没有办法在Fabric.js画布上接收鼠标右键事件?
下面的代码只适用于左键点击:
canvas.observe('mouse:down', function(){console.log('mouse down'));
canvas.observe('mouse:down', function(){console.log('mouse down'));
注意: 以上大多数回答已经过时,此回答适用于最新的 Fabric 版本 2.7.0
在画布中触发右键和中键点击事件的配置可以在这里fireRightClick
和这里fireMiddleClick
找到,并默认设置为false
。这意味着右键和中键点击事件默认情况下被禁用。
参数stopContextMenu
可以在这里找到,用于停止在画布上右键单击时出现上下文菜单。
您可以通过在创建画布时设置这些值来轻松启用它们:
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
stopContextMenu: true, // <-- prevent context menu from showing
});
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");
}
}
当点击对象时,您可以通过 event.e 访问“真实”的鼠标 DOM 事件:
if(event.button === 3){
console.log(event.e);
}
event.e
)上调用了 preventDefault()
吗?你可以通过将其记录到控制台来双重检查DOM事件是哪个对象。 - Wiltevent.preventDefault(); event.stopPropagation();
会发生什么?我将在fiddle中尝试一次。您使用的canvas.js版本是什么? - Wiltevent.button
代码是错误的 - 它们从0到2,而不是1到3,请参见 https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events#determining_button_states - Nigel如果您想处理画布或其对象上的右键单击事件,则应在上层画布元素上设置上下文菜单监听器。使用画布方法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();
});
discardActiveGroup
并消除 "group" 和 "activeSelection" 之间的类型区别。 - Diosney$('#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
});
var d = e.width * e.scaleX / 2;
和 var h = e.height * e.scaleY / 2;
- jsbeckr以下是我所做的,利用了一些内置的面料物体检测代码:
$('.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
}
});
});