Quando você desenha para um canvas
elemento, está simplesmente desenhando um bitmap no modo imediato .
Os elementos (formas, linhas, imagens) desenhados não têm representação além dos pixels que usam e de suas cores.
Portanto, para obter um evento de clique em um canvas
elemento (forma), é necessário capturar eventos de clique no canvas
elemento HTML e usar um pouco de matemática para determinar qual elemento foi clicado, desde que você esteja armazenando a largura / altura e deslocamento x / y dos elementos .
Para adicionar um click
evento ao seu canvas
elemento, use ...
canvas.addEventListener('click', function() { }, false);
Para determinar qual elemento foi clicado ...
var elem = document.getElementById('myCanvas'),
elemLeft = elem.offsetLeft + elem.clientLeft,
elemTop = elem.offsetTop + elem.clientTop,
context = elem.getContext('2d'),
elements = [];
// Add event listener for `click` events.
elem.addEventListener('click', function(event) {
var x = event.pageX - elemLeft,
y = event.pageY - elemTop;
// Collision detection between clicked offset and element.
elements.forEach(function(element) {
if (y > element.top && y < element.top + element.height
&& x > element.left && x < element.left + element.width) {
alert('clicked an element');
}
});
}, false);
// Add element.
elements.push({
colour: '#05EFFF',
width: 150,
height: 100,
top: 20,
left: 15
});
// Render elements.
elements.forEach(function(element) {
context.fillStyle = element.colour;
context.fillRect(element.left, element.top, element.width, element.height);
});
jsFiddle .
Esse código anexa um click
evento ao canvas
elemento e envia uma forma (chamada element
no meu código) para uma elements
matriz. Você pode adicionar quantas quiser aqui.
O objetivo de criar uma matriz de objetos é para que possamos consultar suas propriedades posteriormente. Depois que todos os elementos foram inseridos na matriz, fazemos um loop e renderizamos cada um deles com base em suas propriedades.
Quando o click
evento é acionado, o código percorre os elementos e determina se o clique foi sobre algum dos elementos da elements
matriz. Nesse caso, ele dispara um alert()
, que poderia ser facilmente modificado para fazer algo como remover o item da matriz; nesse caso, você precisaria de uma função de renderização separada para atualizar o canvas
.
Para ser completo, por que suas tentativas não funcionaram ...
elem.onClick = alert("hello world"); // displays alert without clicking
Isso está atribuindo o valor de retorno de alert()
à onClick
propriedade de elem
. Está chamando imediatamente o alert()
.
elem.onClick = alert('hello world'); // displays alert without clicking
Em JavaScript, '
e "
são semanticamente idênticos, o lexer provavelmente usa ['"]
para aspas.
elem.onClick = "alert('hello world!')"; // does nothing, even with clicking
Você está atribuindo uma sequência à onClick
propriedade de elem
.
elem.onClick = function() { alert('hello world!'); }; // does nothing
JavaScript diferencia maiúsculas de minúsculas. A onclick
propriedade é o método arcaico de anexar manipuladores de eventos. Ele permite apenas que um evento seja anexado à propriedade e o evento pode ser perdido ao serializar o HTML.
elem.onClick = function() { alert("hello world!"); }; // does nothing
Mais uma vez ' === "
.
onclick
vez deonClick