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