Kiedy rysujesz do canvaselementu, po prostu rysujesz bitmapę w trybie natychmiastowym .
Te elementy (kształty, linie, obrazy), które są wystawione nie mają reprezentacji oprócz pikseli, których używają, a ich kolor.
Dlatego, aby uzyskać zdarzenie kliknięcia canvas elementu (kształtu), musisz przechwycić zdarzenia kliknięcia canvaselementu HTML i użyć matematyki, aby określić, który element został kliknięty, pod warunkiem, że przechowujesz szerokość / wysokość i przesunięcie x / y elementów .
Aby dodać clickzdarzenie do swojego canvaselementu, użyj ...
canvas.addEventListener('click', function() { }, false);
Aby określić, który element został kliknięty ...
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 .
Ten kod dołącza clickzdarzenie do canvaselementu, a następnie wypycha jeden kształt (nazywany elementw moim kodzie) do elementstablicy. Możesz tutaj dodać tyle, ile chcesz.
Celem tworzenia tablicy obiektów jest umożliwienie nam późniejszego zbadania ich właściwości. Po wypchnięciu wszystkich elementów do tablicy wykonujemy pętlę i renderujemy każdy z nich na podstawie ich właściwości.
Po clickwyzwoleniu zdarzenia kod przechodzi przez elementy w pętli i określa, czy kliknięcie dotyczy któregokolwiek z elementów elementstablicy. Jeśli tak, uruchamia plik alert(), który można łatwo zmodyfikować, aby zrobić coś takiego, jak usunięcie elementu tablicy, w takim przypadku potrzebna byłaby oddzielna funkcja renderująca, aby zaktualizować canvas.
Dla kompletności, dlaczego twoje próby nie zadziałały ...
elem.onClick = alert("hello world"); // displays alert without clicking
To jest przypisanie wartości zwracanej alert()do onClickwłaściwości elem. Natychmiast wywołuje alert().
elem.onClick = alert('hello world'); // displays alert without clicking
W JavaScript, 'i "są semantycznie identyczne, lekser prawdopodobnie używa ['"]cudzysłowów.
elem.onClick = "alert('hello world!')"; // does nothing, even with clicking
Przypisujesz ciąg do onClickwłaściwości elem.
elem.onClick = function() { alert('hello world!'); }; // does nothing
JavaScript rozróżnia wielkość liter. onclickNieruchomość jest archaiczna metoda mocowania obsługi zdarzeń. Umożliwia dołączenie tylko jednego zdarzenia do właściwości, a zdarzenie może zostać utracone podczas serializacji kodu HTML.
elem.onClick = function() { alert("hello world!"); }; // does nothing
Ponownie ' === ".
onclickzamiastonClick