Когда вы рисуете canvasэлемент, вы просто рисуете растровое изображение в немедленном режиме .
Эти элементы (формы, линия, изображения) , которые нарисованы не имеют никакого представления , кроме пикселей , которые они используют , и их цвет.
Следовательно, чтобы получить событие щелчка на canvas элементе (фигуре), вам необходимо захватить события щелчка на canvasэлементе HTML и использовать некоторые математические вычисления, чтобы определить, какой элемент был нажат, при условии, что вы сохраняете ширину / высоту элементов и смещение x / y. ,
Чтобы добавить clickсобытие к вашему canvasэлементу, используйте ...
canvas.addEventListener('click', function() { }, false);
Чтобы определить, какой элемент был нажат ...
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 .
Этот код прикрепляет clickсобытие к canvasэлементу, а затем подталкивает одну фигуру (называемую elementв моем коде) в elementsмассив. Вы можете добавить сюда сколько угодно.
Цель создания массива объектов - чтобы мы могли позже запросить их свойства. После того, как все элементы были помещены в массив, мы перебираем и визуализируем каждый из них на основе их свойств.
Когда clickсобытие запускается, код перебирает элементы и определяет, был ли щелчок по любому из элементов в elementsмассиве. Если это так, он запускает объект alert(), который можно легко изменить, чтобы сделать что-то, например удалить элемент массива, и в этом случае вам понадобится отдельная функция визуализации для обновления файла canvas.
Для полноты, почему ваши попытки не сработали ...
elem.onClick = alert("hello world"); // displays alert without clicking
Это присвоение возвращаемого значения alert()к onClickсвойству elem. Он немедленно вызывает alert().
elem.onClick = alert('hello world'); // displays alert without clicking
В JavaScript символы 'и "семантически идентичны, лексер, вероятно, использует их ['"]для кавычек.
elem.onClick = "alert('hello world!')"; // does nothing, even with clicking
Вы назначаете строку onClickсвойству elem.
elem.onClick = function() { alert('hello world!'); }; // does nothing
JavaScript чувствителен к регистру. onclickСвойство является архаичным способом прикрепления обработчиков событий. Он позволяет прикрепить к свойству только одно событие, и событие может быть потеряно при сериализации HTML.
elem.onClick = function() { alert("hello world!"); }; // does nothing
Опять же , ' === ".
onclickвместоonClick