Cuando dibuja a un canvas
elemento, 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 canvas
elemento 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 click
evento a su canvas
elemento, 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 click
evento al canvas
elemento y luego empuja una forma (llamada element
en mi código) a una elements
matriz. 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 click
se activa el evento, el código recorre los elementos y determina si el clic se realizó sobre alguno de los elementos de la elements
matriz. 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 onClick
propiedad 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 onClick
propiedad de elem
.
elem.onClick = function() { alert('hello world!'); }; // does nothing
JavaScript distingue entre mayúsculas y minúsculas. La onclick
propiedad 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, ' === "
.
onclick
lugar deonClick