如何以编程方式选择 Fabric.js 对象

Posted

技术标签:

【中文标题】如何以编程方式选择 Fabric.js 对象【英文标题】:How to select Fabric.js object programmatically 【发布时间】:2013-12-04 12:07:28 【问题描述】:

我想以编程方式选择 Fabrics.js 对象。我需要做什么?例如,我正在添加两个这样的对象:

var canvas = new fabric.Canvas('canvas');
canvas.add(new fabric.Rect(
    left: 100,
    top: 100,
    width: 75,
    height: 50,
    fill: 'green',
    stroke: 'black',
    strokeWidth: 3,
    padding: 10
  ));

 canvas.add(new fabric.Circle(
    left: 200,
    top: 200,
    radius: 30,
    fill: 'gray',
    stroke: 'black',
    strokeWidth: 3
  ));

点击名为

的按钮时我有两个按钮
    选择矩形 选择第二个对象

当点击选择矩形按钮时,它应该选择矩形形状,当点击选择第二个对象按钮时,它应该选择第二个对象圆。

这是解决方法的Jsfiddle。

我看腻了,我在这里寻找一些如何开始。

编辑

我喜欢拥有每个对象的 ID,应该可以使用该 ID 选择对象,我问这个的原因是,在使用协作事物时,我们无法确定所有连接的节点都会有同一索引中的项目,因此唯一的 id 将很有用。

【问题讨论】:

@kangax 请帮忙 【参考方案1】:

你想使用:

 canvas.setActiveObject(canvas.item(0));

在按钮点击事件中

数字对应于对象添加到画布的顺序。

看这里:

http://jsfiddle.net/ThzXM/1/

【讨论】:

不错!我们不能在点击时获取项目编号,然后将其传递给canvas.setActiveObject(canvas.item(itemNumber)); 有没有办法让项目编号被选中(onclick)? @danbrown 有什么方法可以设置项目的 ID,因为我喜欢这样协作......所以如果您按项目位置进行选择,每个人都会有所不同,所以如果我们可以添加一些唯一的 id 并获取它会有什么好处。为您的宝贵建议 +1 我可能会使用函数将项目添加到画布,这样您就可以在每次调用添加项目函数时设置一个全局计数器。同时,我可能会使用一个选择框,每次调用 add 函数时都会添加一个新的 由于某种原因,后来我不得不打电话给canvas.renderAll();【参考方案2】:

是的,您可以通过在 all.js 中添加以下代码来为每个项目设置 id

在 fabric.js 构建版本 1.3.0 中:在对象声明中添加

 var object = 
   id:   this.id,
   remaining properties in all.js
  

现在您可以使用以下方法设置对象 ID:

canvas.getActiveObject().id=your id value;

您可以使用以下方法检索对象 ID:

Myid= canvas.getActiveObject().get('id');

【讨论】:

谢谢,现在我可以添加 id +1,你能告诉我是否可以使用该 id 选择对象?如果是,请给我一个例子 无论如何你必须遍历所有对象并检查当前对象id ==你需要的对象的id!简单..如果是的话做一些动作.. 是的,我首先想到的是,但如果我们拥有大量对象,我觉得这不是一个好方法,是吗? 嗨,我尝试用 id 保存对象的 JSON 字符串。但我找不到 id 值。 JSON 字符串不包含 id。有什么解决办法吗? @MiguelIke,迟到 3 年总比没有好。 . .您需要将一组额外属性传递给 toJSON 函数,以使其在 JSON 中包含这些属性。例如:canvas.toJSON(["id"])fabricjs.com/docs/fabric.Canvas.html#toJSON【参考方案3】:

要查找所选对象的织物对象编号(项目编号),请使用:

canvas.on(
    'object:selected': selectedObject
);

function selectedObject(e) 
    var id = canvas.getObjects().indexOf(e.target);

如果您按照 Dan Brown 的回复以编程方式设置对象,则 var id 是相同的数字:

canvas.setActiveObject(canvas.item(id)); //id = 0, 1, 2 etc.

【讨论】:

【参考方案4】:

为您的对象添加一个 id。

var canvas = new fabric.Canvas('canvas');

canvas.add(new fabric.Rect(
    id: 123,
    left: 100,
    top: 100,
    width: 75,
    height: 50,
    fill: 'green',
    stroke: 'black',
    strokeWidth: 3,
    padding: 10
));

canvas.add(new fabric.Circle(
    id: 456,
    left: 200,
    top: 200,
    radius: 30,
    fill: 'gray',
    stroke: 'black',
    strokeWidth: 3
));

function removeSpot(canvas, id) 
    canvas.forEachObject(function(obj) 
        if (obj.id && obj.id === id) canvas.remove(obj);
    );


// remove rect
removeSpot(canvas, 123);

// remove circle
removeSpot(canvas, 456);

【讨论】:

以上是关于如何以编程方式选择 Fabric.js 对象的主要内容,如果未能解决你的问题,请参考以下文章

Fabric.js:如何取消选择画布上的一个或多个对象?

以编程方式将 FAB 卷回

如何将 Fabric.js 与 React 一起使用?

fabric.js 组成员的属性不更新?

如何检测fabric js动画对象上的鼠标按下事件

使用 Fabric.js 选择画布上的所有对象