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

Thi*_*gan 27 javascript canvas fabricjs

我想以编程方式选择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
  }));
Run Code Online (Sandbox Code Playgroud)

当我点击名为的按钮时,我有两个按钮

  1. 选择矩形
  2. 选择第二个对象

单击选择矩形按钮时,应选择矩形形状,单击选择第二个对象按钮时,应选择第二个对象圆.

这是解决方法的Jsfiddle.

我瞪着眼睛,厌倦了,在这里,我正在寻找一些如何开始.

编辑

我喜欢为每个对象提供ID,应该可以使用该ID选择对象,为什么我要问这是,在使用协作的东西时我们无法确定所有连接的节点都将具有相同的项目索引,所以唯一的ID将是有用的.

Dan*_*own 71

你想用:

 canvas.setActiveObject(canvas.item(0));
Run Code Online (Sandbox Code Playgroud)

在按钮单击事件中

该数字对应于将对象添加到画布的顺序.

看这里:

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

  • 由于某种原因,我不得不随后调用 `canvas.renderAll();` (3认同)
  • 太好了!我们不能得到项目编号onclick然后传递给`canvas.setActiveObject(canvas.item(itemNumber));` (2认同)

Joh*_*ohn 21

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

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

 var object = {
   id:   this.id,
   remaining properties in all.js
  }
Run Code Online (Sandbox Code Playgroud)

现在您可以使用以下命令设置对象ID:

canvas.getActiveObject().id=your id value;
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令检索对象ID:

Myid= canvas.getActiveObject().get('id');
Run Code Online (Sandbox Code Playgroud)

  • 嗨,我尝试用id保存对象的JSON字符串.但我找不到id值.JSON字符串不包含id.有解决方案吗 (3认同)
  • @MiguelIke,迟到三年总比不到好。。。您需要将一组额外属性传递给“toJSON”函数,以使其在 JSON 中包含这些属性。例如:`canvas.toJSON(["id"])` http://fabricjs.com/docs/fabric.Canvas.html#toJSON (2认同)

Dra*_*dge 8

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

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

function selectedObject(e) {
    var id = canvas.getObjects().indexOf(e.target);
}
Run Code Online (Sandbox Code Playgroud)

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

canvas.setActiveObject(canvas.item(id)); //id = 0, 1, 2 etc.
Run Code Online (Sandbox Code Playgroud)