简体   繁体   English

如何使画布中的对象不可选择?

[英]How to make objects in canvas unselectable?

I want to make all object in canvas unselectable.我想让画布中的所有对象都无法选择。 I've found selectable method but i didn't find the way to implement it to all objects.我找到了 可选择的方法,但我没有找到将它实现到所有对象的方法。

I was looking for an unmovable and uneditable Fabric Text and I finally found a solution combining several SO, hope I can save someone some time.我一直在寻找一个不可移动不可编辑的织物文本,我终于找到了一个结合几个 SO 的解决方案,希望我能节省一些时间。

Using "selectable": false wasn't enough in my case: the text was still editable and the cursor was still the "movable cursor" (even if the object wasn't selectable).使用"selectable": false对我来说还不够:文本仍然是可编辑的,光标仍然是“可移动光标”(即使对象不可选择)。

I had to add "evented": false .我不得不添加"evented": false Here is an example:这是一个例子:

this.canvas.add(new fabric.Text("Hello world !", {
            "selectable": false,
            "evented": false
}));

You can play with different control options here: http://fabricjs.com/controls-customization您可以在此处使用不同的控制选项:http: //fabricjs.com/controls-customization

You can make all the elements un-selectable using below code您可以使用以下代码使所有元素都无法选择

canvas.deactivateAll();
canvas.renderAll();
canvas.forEachObject(function(object){ 
       object.selectable = false; 
});

There is a way like this in option -选项中有这样的方法 -

selectable: false

      or 

object.set({selectable:false})

      or


 object.selectable = false;

On a parent HTML element use css property pointer-events :在父 HTML 元素上使用 css 属性pointer-events

.locked {
    pointer-events: none;
}

To set this property from javascript:要从 javascript 设置此属性:

let canvasElement = document.getElementsByClassName("canvas-container")[0]
canvasElement.classList.add("locked")

To unlock canvas:解锁画布:

canvasElement.classList.remove("locked")
canvas._objects.forEach(obj => {obj.selectable = false;});
canvas.discardActiveObject();

This should do the trick!这应该可以解决问题! discardActiveObject should fire events that request a rerender, so you don't need to manually invoke renderAll . discardActiveObject应该触发请求重新呈现的事件,因此您不需要手动调用renderAll In general, you should always use requestRenderAll instead of renderAll .通常,您应该始终使用requestRenderAll而不是renderAll

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM