---
# System prepended metadata

title: 【自學筆記】konva入門 - Selectors
tags: [javascript, canvas, konva]

---

###### tags: `konva`, `canvas`, `javascript`
# 【自學筆記】konva入門 - Selectors

`Konva`是個`HTML5 Canvas JavaScript`的框架，透過`2d context`的擴展實現各種圖形功能，正好可以實現最近工作需求，就來研究看看囉

---

### Konva的Selectors

Konva可以使用`find()`，輕鬆得找到元素
共有三種方式：[範例](https://codepen.io/niodoshaba-the-flexboxer/pen/YzaKeQR)
:::info
Select By Id
:::
在創建圖形的時候，給他一個id的屬性，就可以透過`findOne('#id')`找到他了
```htmlembedded=
<div id="container"></div>
<div id="buttons">
<!-- 用來觸發find() -->
    <input type="button" id="RectId" value='RectId'/>
</div>
```
```javascript=
// 先創建一個Stage
var stage = new Konva.Stage({
    container: 'container',
    width: 500,
    height: 500
});

// 然後創建一個layer
var layer = new Konva.Layer();

// 用創建一個圖形，並設定Id
 var rect = new Konva.Rect({
    x: 300,
    y: 90,
    width: 100,
    height: 50,
    fill: 'green',
    strokeWidth: 3,
    offset: {
        x: 50,
        y: 25,
    },
    draggable: true,
    id: 'RectId',
 });
layer.add(rect);
stage.add(layer);
// 畫出來
layer.draw();

// 用find()找到id
document.getElementById('RectId').addEventListener('click',function () {
    var find_id = layer.findOne('#RectId');
    console.log(RectId)
});
```

:::info
Select By Type
:::
透過find()也可以找到所有相同的圖形種類
```htmlembedded=
<div id="container"></div>
```
```javascript=
// 先創建一個Stage
var stage = new Konva.Stage({
    container: 'container',
    width: 500,
    height: 500
});

// 然後創建一個layer
var layer = new Konva.Layer();

// 用迴圈創建一堆circle
for (var n = 0; n < 10; n++) {
var circle = new Konva.Circle({
    x: Math.random() * stage.width(),
    y: Math.random() * stage.height(),
    radius: Math.random() * 50 + 25,
    fill: 'red',
    strokeWidth: 3,
    stroke: 'black',
    });
  layer.add(circle);
}

stage.add(layer);
// 畫出來
layer.draw();

// 用find()找到所有的circle
var find_circle = layer.find('Circle');
console.log(find_circle)
```

:::info
Select By Name
:::
在創建圖形的時候，給他一個name的屬性，就可以透過`find('.name')`找到他了
(類似`css class`)


```htmlembedded=
<div id="container"></div>
<div id="buttons">
<!-- 用來觸發find() -->
    <input type="button" id="RectName" value='RectName'/>
</div>
```
```javascript=
// 先創建一個Stage
var stage = new Konva.Stage({
    container: 'container',
    width: 500,
    height: 500
});

// 然後創建一個layer
var layer = new Konva.Layer();

// 用創建多個圖形，並設定name
var name1 = new Konva.Rect({
    x: 100,
    y: 20,
    width: 12,
    height: 33,
    fill: 'blue',
    strokeWidth: 3,
    offset: {
        x: 50,
        y: 25,
    },
    draggable: true,
    name: 'blue',
});
layer.add(name1);

// 用創建多個圖形，並設定name
var name2 = new Konva.Rect({
    x: 120,
    y: 40,
    width: 12,
    height: 33,
    fill: 'blue',
    strokeWidth: 3,
    offset: {
        x: 50,
        y: 25,
    },
    draggable: true,
    name: 'blue',
});
layer.add(name2);

// 用創建多個圖形，並設定name
var name3 = new Konva.Rect({
    x: 140,
    y: 60,
    width: 12,
    height: 33,
    fill: 'blue',
    strokeWidth: 3,
    offset: {
        x: 50,
        y: 25,
    },
    draggable: true,
    name: 'blue',
});
layer.add(name3);

stage.add(layer);
// 畫出來
layer.draw();

// 用find()找到所有的name (類似css class)
document.getElementById('name').addEventListener('click',function () {
    var find_class = layer.find('.blue')
    console.log(find_class)
});
```

---

*參考資料: https://konvajs.org/docs/*

*新手工程師的筆記，純粹記錄學了些啥東西
如果有前輩高人讀了我的文，文中有任何錯誤再麻煩指教指教*