Cuando dibuja a un canvaselemento, simplemente está dibujando un mapa de bits en modo inmediato .
Los elementos (formas, líneas, imágenes) que se dibujan no tienen representación además de los píxeles que usan y su color.
Por lo tanto, para obtener un evento de clic en un canvas elemento (forma), debe capturar eventos de clic en el canvaselemento HTML y usar algunas matemáticas para determinar en qué elemento se hizo clic, siempre que almacene el ancho / alto de los elementos y el desplazamiento x / y .
Para agregar un clickevento a su canvaselemento, use ...
canvas.addEventListener('click', function() { }, false);
Para determinar en qué elemento se hizo clic ...
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 .
Este código adjunta un clickevento al canvaselemento y luego empuja una forma (llamada elementen mi código) a una elementsmatriz. Puede agregar tantos como desee aquí.
El propósito de crear una matriz de objetos es para que podamos consultar sus propiedades más adelante. Después de que todos los elementos se han insertado en la matriz, recorremos y representamos cada uno en función de sus propiedades.
Cuando clickse activa el evento, el código recorre los elementos y determina si el clic se realizó sobre alguno de los elementos de la elementsmatriz. Si es así, dispara un alert(), que podría modificarse fácilmente para hacer algo como eliminar el elemento de la matriz, en cuyo caso necesitaría una función de renderización separada para actualizar el canvas.
Para completar, por qué tus intentos no funcionaron ...
elem.onClick = alert("hello world"); // displays alert without clicking
Esto es asignar el valor de retorno de alert()a la onClickpropiedad de elem. Invoca de inmediato el alert().
elem.onClick = alert('hello world'); // displays alert without clicking
En JavaScript, 'y "son semánticamente idénticos, el lexer probablemente usa ['"]para las comillas.
elem.onClick = "alert('hello world!')"; // does nothing, even with clicking
Estás asignando una cadena a la onClickpropiedad de elem.
elem.onClick = function() { alert('hello world!'); }; // does nothing
JavaScript distingue entre mayúsculas y minúsculas. La onclickpropiedad es el método arcaico de adjuntar controladores de eventos. Solo permite adjuntar un evento con la propiedad y el evento se puede perder al serializar el HTML.
elem.onClick = function() { alert("hello world!"); }; // does nothing
Una vez más, ' === ".
onclicklugar deonClick