Коли ви звертаєтесь до 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