Quando disegni a un canvas
elemento, stai semplicemente disegnando una bitmap in modalità immediata .
Gli elementi (forme, linee, immagini) che vengono disegnati non hanno rappresentazione oltre ai pixel che usano e al loro colore.
Pertanto, per ottenere un evento clic su un canvas
elemento (forma), è necessario acquisire eventi clic sul filecanvas
HTML e utilizzare alcuni calcoli per determinare quale elemento è stato selezionato, a condizione che si stiano memorizzando la larghezza / altezza degli elementi e l'offset x / y .
Per aggiungere un click
evento al tuo canvas
elemento, usa ...
canvas.addEventListener('click', function() { }, false);
Per determinare quale elemento è stato fatto 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 .
Questo codice collega un click
evento canvas
all'elemento, quindi inserisce una forma (chiamata an element
nel mio codice) in un elements
array. Puoi aggiungerne quanti ne desideri qui.
Lo scopo della creazione di una matrice di oggetti è così che possiamo interrogare le loro proprietà in un secondo momento. Dopo che tutti gli elementi sono stati inseriti nell'array, eseguiamo il loop e il rendering di ognuno in base alle loro proprietà.
Quando click
viene attivato l' evento, il codice scorre attraverso gli elementi e determina se il clic si trova su uno degli elementi elements
dell'array. In tal caso, genera un alert()
, che potrebbe essere facilmente modificato per fare qualcosa come rimuovere l'elemento dell'array, nel qual caso avresti bisogno di una funzione di rendering separata per aggiornare il canvas
.
Per completezza, perché i tuoi tentativi non hanno funzionato ...
elem.onClick = alert("hello world"); // displays alert without clicking
Questo sta assegnando il valore restituito alert()
alla onClick
proprietà di elem
. Richiama immediatamente il alert()
.
elem.onClick = alert('hello world'); // displays alert without clicking
In JavaScript, '
e "
sono semanticamente identici, il lexer probabilmente usa ['"]
per le virgolette.
elem.onClick = "alert('hello world!')"; // does nothing, even with clicking
Stai assegnando una stringa alla onClick
proprietà di elem
.
elem.onClick = function() { alert('hello world!'); }; // does nothing
JavaScript fa distinzione tra maiuscole e minuscole. La onclick
proprietà è il metodo arcaico di associare i gestori di eventi. Consente solo un evento da associare alla proprietà e l'evento può essere perso durante la serializzazione dell'HTML.
elem.onClick = function() { alert("hello world!"); }; // does nothing
Nuovamente, ' === "
.
onclick
invece dionClick