Ich bin ein erfahrener Java-Programmierer, schaue mir aber zum ersten Mal seit etwa einem Jahrzehnt einige JavaScript / HTML5-Inhalte an. Ich bin völlig ratlos darüber, was das Einfachste überhaupt sein sollte.
Als Beispiel wollte ich nur etwas zeichnen und einen Ereignishandler hinzufügen. Ich bin mir sicher, dass ich etwas Dummes mache, aber ich habe überall gesucht und nichts, was vorgeschlagen wird (z. B. die Antwort auf diese Frage: Onclick-Eigenschaft zur Eingabe mit JavaScript hinzufügen ), funktioniert. Ich benutze Firefox 10.0.1. Mein Code folgt. Sie sehen mehrere kommentierte Zeilen und am Ende jeder Zeile finden Sie eine Beschreibung dessen, was passiert (oder was nicht).
Was ist hier die richtige Syntax? Ich werde verrückt!
<html>
<body>
<canvas id="myCanvas" width="300" height="150"/>
<script language="JavaScript">
var elem = document.getElementById('myCanvas');
// elem.onClick = alert("hello world"); - displays alert without clicking
// elem.onClick = alert('hello world'); - displays alert without clicking
// elem.onClick = "alert('hello world!')"; - does nothing, even with clicking
// elem.onClick = function() { alert('hello world!'); }; - does nothing
// elem.onClick = function() { alert("hello world!"); }; - does nothing
var context = elem.getContext('2d');
context.fillStyle = '#05EFFF';
context.fillRect(0, 0, 150, 100);
</script>
</body>
onclick
anstelle vononClick
alert()
direkt anrufen<script>
, anstatt eine Funktion zu definieren, die aufgerufen wirdalert()
. Der Rest tut nichts wegen der Großschreibung vononclick
.Antworten:
Wenn Sie zu einem
canvas
Element 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 dascanvas
HTML-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 ...,
click
um Ihremcanvas
Element ein Ereignis hinzuzufügen ...Um festzustellen, auf welches Element geklickt wurde ...
jsFiddle .
Dieser Code hängt ein
click
Ereignis an dascanvas
Element an und überträgt dann eine Form (element
in meinem Code als "Form" bezeichnet ) an einelements
Array. 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
click
Ereignis ausgelöst wird, durchläuft der Code die Elemente und bestimmt, ob der Klick über einem der Elemente imelements
Array erfolgte. Wenn ja, feuert sie einealert()
, 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 Updatecanvas
.Der Vollständigkeit halber, warum Ihre Versuche nicht funktioniert haben ...
Dies weist
alert()
deronClick
Eigenschaft von den Rückgabewert von zuelem
. Es ruft sofort das aufalert()
.In JavaScript sind die
'
und"
semantisch identisch, die der Lexer wahrscheinlich['"]
für Anführungszeichen verwendet.Sie weisen der
onClick
Eigenschaft von eine Zeichenfolge zuelem
.JavaScript unterscheidet zwischen Groß- und Kleinschreibung. Die
onclick
Eigenschaft 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.Wieder
' === "
.quelle
Wahrscheinlich sehr spät zur Antwort, aber ich habe dies gerade gelesen, als ich mich auf meine
70-480
Prüfung vorbereitete , und fand, dass dies funktioniert -Beachten Sie das Ereignis als
onclick
stattonClick
.JS Bin Beispiel.
quelle
Ich empfehle den folgenden Artikel: Trefferbereichserkennung für HTML5-Canvas und Anhören von Klickereignissen auf Canvas-Formen, die verschiedene Situationen durchlaufen.
Es wird jedoch nicht die
addHitRegion
API behandelt, was der beste Weg sein muss (die Verwendung von mathematischen Funktionen und / oder Vergleichen ist ziemlich fehleranfällig). Dieser Ansatz wird auf developer.mozilla detailliert beschriebenquelle
addHitRegion
] ist veraltet. Obwohl es in einigen Browsern möglicherweise noch funktioniert, wird von seiner Verwendung abgeraten, da es jederzeit entfernt werden kann. Versuchen Sie, die Verwendung zu vermeiden." - Über den Link dev.moz, den Sie einfügen, um anderen einen Klick zu ersparen.Als Alternative zu Alex 'Antwort:
Sie können eine SVG-Zeichnung anstelle einer Leinwandzeichnung verwenden. Dort können Sie Ereignisse direkt zu den gezeichneten DOM-Objekten hinzufügen.
siehe zum Beispiel:
Klicken Sie mit einem Klick auf ein SVG-Bildobjekt, um eine absolute Positionierung zu vermeiden
quelle
Sie können auch DOM-Elemente wie
div
oben auf der Leinwand platzieren, die Ihre Leinwandelemente darstellen und auf die gleiche Weise positioniert werden.Jetzt können Sie Ereignis-Listener an diese Divs anhängen und die erforderlichen Aktionen ausführen.
quelle
Als weitere billige Alternative auf etwas statischer Leinwand ist die Verwendung eines überlagerten img-Elements mit einer Usemap-Definition schnell und schmutzig. Funktioniert besonders gut auf polygonbasierten Canvas-Elementen wie einem Kreisdiagramm.
quelle
Alex Answer ist ziemlich ordentlich, aber bei Verwendung von Kontextdrehung kann es schwierig sein, x- und y-Koordinaten zu verfolgen. Deshalb habe ich eine Demo erstellt, die zeigt, wie man das verfolgt.
Grundsätzlich benutze ich diese Funktion und gebe ihr den Winkel und die zurückgelegte Entfernung in diesem Engel, bevor ich ein Objekt zeichne.
quelle