Kiedy rysujesz do canvas
elementu, 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 canvas
elementu 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ć click
zdarzenie do swojego canvas
elementu, 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 click
zdarzenie do canvas
elementu, a następnie wypycha jeden kształt (nazywany element
w moim kodzie) do elements
tablicy. 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 click
wyzwoleniu zdarzenia kod przechodzi przez elementy w pętli i określa, czy kliknięcie dotyczy któregokolwiek z elementów elements
tablicy. 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 onClick
wł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 onClick
właściwości elem
.
elem.onClick = function() { alert('hello world!'); }; // does nothing
JavaScript rozróżnia wielkość liter. onclick
Nieruchomość 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 ' === "
.
onclick
zamiastonClick