Soy un programador Java experimentado pero estoy viendo algunas cosas de JavaScript / HTML5 por primera vez en aproximadamente una década. Estoy completamente perplejo con lo que debería ser lo más simple.
Como ejemplo, solo quería dibujar algo y agregarle un controlador de eventos. Estoy seguro de que estoy haciendo algo estúpido, pero he buscado por todas partes y nada de lo que se sugiere (por ejemplo, la respuesta a esta pregunta: Agregar propiedad onclick para ingresar con JavaScript ) funciona. Estoy usando Firefox 10.0.1. Mi código sigue. Verá varias líneas comentadas y al final de cada una encontrará una descripción de lo que (o lo que no) sucede.
¿Cuál es la sintaxis correcta aquí? ¡Me estoy volviendo loco!
<html>
<body>
<canvas id="myCanvas" width="300" height="150"/>
<script language="JavaScript">
var elem = document.getElementById('myCanvas');
// elem.onClick = alert("hello world"); - displays alert without clicking
// elem.onClick = alert('hello world'); - displays alert without clicking
// elem.onClick = "alert('hello world!')"; - does nothing, even with clicking
// elem.onClick = function() { alert('hello world!'); }; - does nothing
// elem.onClick = function() { alert("hello world!"); }; - does nothing
var context = elem.getContext('2d');
context.fillStyle = '#05EFFF';
context.fillRect(0, 0, 150, 100);
</script>
</body>
onclick
lugar deonClick
alert()
directamente<script>
, en lugar de definir una función que llamealert()
. El resto no hace nada debido a la capitalización deonclick
.Respuestas:
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 elcanvas
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 sucanvas
elemento, use ...Para determinar en qué elemento se hizo clic ...
jsFiddle .
Este código adjunta un
click
evento alcanvas
elemento y luego empuja una forma (llamadaelement
en mi código) a unaelements
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 laelements
matriz. Si es así, dispara unalert()
, 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 elcanvas
.Para completar, por qué tus intentos no funcionaron ...
Esto es asignar el valor de retorno de
alert()
a laonClick
propiedad deelem
. Invoca de inmediato elalert()
.En JavaScript,
'
y"
son semánticamente idénticos, el lexer probablemente usa['"]
para las comillas.Estás asignando una cadena a la
onClick
propiedad deelem
.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.Una vez más,
' === "
.fuente
Probablemente sea muy tarde para la respuesta, pero acabo de leer esto mientras me preparaba para mi
70-480
examen y descubrí que esto funciona:Observe el evento como en
onclick
lugar deonClick
.JS Bin ejemplo.
fuente
Recomiendo el siguiente artículo: Detección de región de hit para HTML5 Canvas y cómo escuchar eventos de clic en formas de Canvas que atraviesan varias situaciones.
Sin embargo, no cubre la
addHitRegion
API, que debe ser la mejor manera (el uso de funciones matemáticas y / o comparaciones es bastante propenso a errores). Este enfoque se detalla en developer.mozillafuente
addHitRegion
] está obsoleto. Aunque todavía puede funcionar en algunos navegadores, se desaconseja su uso, ya que podría eliminarse en cualquier momento. Intente evitar usarlo". - desde el enlace dev.moz que incluye, para guardar a otros un clic.Como alternativa a la respuesta de alex:
Puede usar un dibujo SVG en lugar de un dibujo de Canvas. Allí puede agregar eventos directamente a los objetos DOM dibujados.
ver por ejemplo:
Hacer clic en un objeto de imagen svg con onclick, evitando el posicionamiento absoluto
fuente
También puede colocar elementos DOM, como
div
en la parte superior del lienzo, que representarían los elementos del lienzo y se colocarían de la misma manera.Ahora puede adjuntar oyentes de eventos a estos divs y ejecutar las acciones necesarias.
fuente
Como otra alternativa barata en un lienzo algo estático, usar un elemento img superpuesto con una definición de mapa de uso es rápido y sucio. Funciona especialmente bien en elementos de lienzo basados en polígonos como un gráfico circular.
fuente
Alex Answer es bastante ordenado, pero cuando se usa la rotación de contexto, puede ser difícil rastrear las coordenadas x, y, así que hice una demostración que muestra cómo hacer un seguimiento de eso.
Básicamente estoy usando esta función y le doy el ángulo y la cantidad de distancia recorrida en ese ángel antes de dibujar el objeto.
fuente