Wenn Sie zu einem canvasElement zeichnen, zeichnen Sie einfach eine Bitmap im Sofortmodus .
Die gezeichneten Elemente (Formen, Linien, Bilder) haben außer den verwendeten Pixeln und ihrer Farbe keine Darstellung.
Um ein Klickereignis für ein canvas Element (eine Form) zu erhalten, müssen Sie daher Klickereignisse für das canvasHTML-Element erfassen und mithilfe von Mathematik bestimmen, auf welches Element geklickt wurde, vorausgesetzt, Sie speichern die Breite / Höhe und den x / y-Versatz der Elemente .
Verwenden Sie ..., clickum Ihrem canvasElement ein Ereignis hinzuzufügen ...
canvas.addEventListener('click', function() { }, false);
Um festzustellen, auf welches Element geklickt wurde ...
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 .
Dieser Code hängt ein clickEreignis an das canvasElement an und überträgt dann eine Form ( elementin meinem Code als "Form" bezeichnet ) an ein elementsArray. Sie können hier so viele hinzufügen, wie Sie möchten.
Der Zweck des Erstellens eines Arrays von Objekten besteht darin, dass wir ihre Eigenschaften später abfragen können. Nachdem alle Elemente auf das Array verschoben wurden, durchlaufen wir jedes Element und rendern es basierend auf seinen Eigenschaften.
Wenn das clickEreignis ausgelöst wird, durchläuft der Code die Elemente und bestimmt, ob der Klick über einem der Elemente im elementsArray erfolgte. Wenn ja, feuert sie eine alert(), die leicht modifiziert werden könnte etwas wie entfernen Sie das Array - Element zu tun, in dem Fall , dass Sie eine separate bräuchten machen Funktion , um das Update canvas.
Der Vollständigkeit halber, warum Ihre Versuche nicht funktioniert haben ...
elem.onClick = alert("hello world"); // displays alert without clicking
Dies weist alert()der onClickEigenschaft von den Rückgabewert von zu elem. Es ruft sofort das auf alert().
elem.onClick = alert('hello world'); // displays alert without clicking
In JavaScript sind die 'und "semantisch identisch, die der Lexer wahrscheinlich ['"]für Anführungszeichen verwendet.
elem.onClick = "alert('hello world!')"; // does nothing, even with clicking
Sie weisen der onClickEigenschaft von eine Zeichenfolge zu elem.
elem.onClick = function() { alert('hello world!'); }; // does nothing
JavaScript unterscheidet zwischen Groß- und Kleinschreibung. Die onclickEigenschaft ist die archaische Methode zum Anhängen von Ereignishandlern. Es kann nur ein Ereignis an die Eigenschaft angehängt werden, und das Ereignis kann beim Serialisieren des HTML-Codes verloren gehen.
elem.onClick = function() { alert("hello world!"); }; // does nothing
Wieder ' === ".
onclickanstelle vononClick