2010-04-18 19 views
6

Estoy experimentando con html5 y tengo una pequeña imagen desplegable, el usuario selecciona e imagen y la dibuja en el lienzo usando drawImage();html5, agregando un eventlistener a una imagen dibujada en lienzo

Parece que no puedo encontrar la manera de agregar un detector de eventos a la imagen recién dibujada en el lienzo.

He intentado poner en una variable de este modo:

var newImg = ctx.drawImage(myImage, 200, 200); 

y luego añadir una EventListener de eso, pero no parece funcionar.

newImg.addEventListener('mousedown', onImgClick, false); 

¿Cuál es la forma correcta de hacerlo?

Respuesta

5

La lona no es una superficie de dibujo . Es solo una imagen plana; no hay ningún objeto dentro para vincular eventos, y drawImage no devuelve nada.

Deberá detectar los clics en <canvas> y comprobar si se encuentran dentro del rectángulo [200, 200, 200 + w, 200 + h] manualmente. O bien, si desea un dibujo en modo retenido, considere usar SVG en lugar de un lienzo.

+0

Estoy confundido por esto, porque parece que hay muchos tutoriales sobre cómo manipular objetos dibujados en el lienzo. Incluso hay una biblioteca de juegos javascript que utiliza lienzo. http://www.kesiev.com/akihabara/ Parece que puede manipular las imágenes que coloca en el lienzo. – pfunc

+2

Puede pintar un círculo en un lienzo real, pero después solo hay pintura. No podrías recoger ese círculo y sacarlo del lienzo; no podrías moverlo encima de otra parte de la pintura; * es solo pintura *. Puede aplicar objetos como imágenes, rutas y textos a un ''. Pero una vez que tienes, esos objetos no tienen ninguna identidad o existencia; * son solo píxeles *. Por lo general, las bibliotecas de juegos mantienen su propia lista de objetos de nivel superior para dibujar, y los dibujan de nuevo en el lienzo de nuevo en cada fotograma nuevo. – bobince

7

Si está buscando este tipo de interactividad, probablemente <canvas> no es lo que quiere. Usted está buscando SVG. Hay una fantástica biblioteca llamada Raphaël que hace que trabajar con SVG sea pan comido en todos los navegadores, incluso en IE6. Es también totalmente compatible con jQuery, por lo que puede hacer:

var paper = Raphael(10, 50, 320, 200); 
var img = paper.image("/path/to/img.png", 10, 10, 80, 80); 
$(img).click(onImgClick); 

estoy bastante seguro de que esto va a tratar mejor y más fácil de usar que <canvas>.

Nota: Raphaël viene con algunos ayudantes para eventos básicos como el "clic" y "mousedown", acaba de hacer img.click(onImgClick), pero si usted ya está usando una biblioteca como jQuery, que es probable que se encuentre, lo recomiendo ser consistente y usar el manejo de eventos de la biblioteca.

+0

ahh, es bueno saberlo.Pensé que ese podría ser el caso, pero también pensé que, dado que podía ver el img agregado en la fuente, podría manipularlo. – pfunc

+0

la diferencia es que '' solo agrega píxeles al dibujar una imagen. SVG está basado en marcado, como HTML, por lo que hay un fragmento real de marcado agregado que es esencialmente como cualquier elemento HTML DOM, por lo que puede interactuar con él, clonarlo, moverlo, transformarlo y escuchar eventos en él. Sin embargo, a veces hay una sobrecarga de rendimiento de esto, en comparación con '', pero debería funcionar muy bien para la situación que describió. – bcherry

+0

genial. Ya comenzó a trabajar con él y es bastante simple. Y lo retomo, no puedo ver la fuente img en el elemento canvas, tenía un código sobrante de una prueba anterior. Gracias. – pfunc

0

Para hacer esto sin la ayuda de JS:

Aunque no se puede conectar un detector de eventos para el contexto en el que se llama a drawImage(); PUEDE adjuntar oyentes de eventos al propio Canvas.

myCanvasElement = document.getElementById('canvasElement'); 
myCanvasElement.addEventListener("click", someFunction, false); 

Si es necesario tener presente que cada imagen se dibuja, es probable que podría apilar los objetos de lona y crear uno nuevo para cada imagen que dibuja.

+1

que aún está usando JS aquí ... (@ "Para hacer esto sin la ayuda de JS: ...") – Peter