Je suis un programmeur Java expérimenté, mais je regarde des trucs JavaScript / HTML5 pour la première fois depuis une dizaine d'années. Je suis complètement perplexe sur ce qui devrait être la chose la plus simple qui soit.
À titre d'exemple, je voulais juste dessiner quelque chose et y ajouter un gestionnaire d'événements. Je suis sûr que je fais quelque chose de stupide, mais j'ai cherché partout et rien de ce qui est suggéré (par exemple, la réponse à cette question: Ajouter une propriété onclick pour entrer avec JavaScript ) ne fonctionne. J'utilise Firefox 10.0.1. Mon code suit. Vous verrez plusieurs lignes commentées et à la fin de chacune se trouve une description de ce qui (ou de ce qui ne se passe pas) se produit.
Quelle est la syntaxe correcte ici? Je deviens fou!
<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
place deonClick
alert()
directement<script>
, au lieu de définir une fonction qui appelleraalert()
. Les autres ne font rien à cause de la capitalisation deonclick
.Réponses:
Lorsque vous dessinez sur un
canvas
élément, vous dessinez simplement une image bitmap en mode immédiat .Les éléments (formes, lignes, images) qui sont dessinés n'ont aucune représentation en dehors des pixels qu'ils utilisent et de leur couleur.
Par conséquent, pour obtenir un événement de clic sur un
canvas
élément (forme), vous devez capturer les événements de clic sur l'canvas
élément HTML et utiliser des mathématiques pour déterminer quel élément a été cliqué, à condition que vous stockiez la largeur / hauteur et le décalage x / y des éléments. .Pour ajouter un
click
événement à votrecanvas
élément, utilisez ...Pour déterminer quel élément a été cliqué ...
jsFiddle .
Ce code attache un
click
événement à l'canvas
élément, puis pousse une forme (appelée anelement
dans mon code) dans unelements
tableau. Vous pouvez en ajouter autant que vous le souhaitez ici.Le but de la création d'un tableau d'objets est que nous puissions interroger leurs propriétés plus tard. Une fois que tous les éléments ont été poussés sur le tableau, nous bouclons et rendons chacun d'eux en fonction de leurs propriétés.
Lorsque l'
click
événement est déclenché, le code parcourt les éléments et détermine si le clic était sur l'un des éléments duelements
tableau. Si tel est le cas, il déclenche unalert()
, qui pourrait facilement être modifié pour faire quelque chose comme supprimer l'élément de tableau, auquel cas vous auriez besoin d'une fonction de rendu distincte pour mettre à jour lecanvas
.Par souci d'exhaustivité, pourquoi vos tentatives n'ont pas fonctionné ...
Il s'agit d'attribuer la valeur de retour de
alert()
à laonClick
propriété deelem
. Il appelle immédiatement lealert()
.En JavaScript, les
'
et"
sont sémantiquement identiques, le lexer utilise probablement['"]
pour les guillemets.Vous affectez une chaîne à la
onClick
propriété deelem
.JavaScript est sensible à la casse. La
onclick
propriété est la méthode archaïque d'attachement de gestionnaires d'événements. Il n'autorise qu'un seul événement à être associé à la propriété et l'événement peut être perdu lors de la sérialisation du HTML.Encore une fois,
' === "
.la source
Probablement très tard pour la réponse, mais je viens de lire ceci en préparant mon
70-480
examen, et j'ai trouvé que cela fonctionnait -Notez l'événement comme
onclick
au lieu deonClick
.Exemple de JS Bin .
la source
Je recommande l'article suivant: Détection de zone de frappe pour le canevas HTML5 et comment écouter les événements de clic sur les formes de canevas qui passe par diverses situations.
Cependant, il ne couvre pas l'
addHitRegion
API, qui doit être le meilleur moyen (l'utilisation de fonctions mathématiques et / ou de comparaisons est assez sujette aux erreurs). Cette approche est détaillée sur developer.mozillala source
addHitRegion
] est obsolète. Bien qu'il puisse toujours fonctionner dans certains navigateurs, son utilisation est déconseillée car il peut être supprimé à tout moment. Essayez d'éviter de l'utiliser." - à partir du lien dev.moz que vous incluez, pour enregistrer les autres en un clic.Comme alternative à la réponse d'Alex:
Vous pouvez utiliser un dessin SVG au lieu d'un dessin Canvas. Là, vous pouvez ajouter des événements directement aux objets DOM dessinés.
voir par exemple:
Rendre un objet image svg cliquable avec onclick, en évitant le positionnement absolu
la source
Vous pouvez également placer des éléments DOM, comme
div
sur le dessus du canevas, qui représenteraient vos éléments de canevas et être positionnés de la même manière.Vous pouvez maintenant attacher des écouteurs d'événements à ces div et exécuter les actions nécessaires.
la source
En tant qu'autre alternative bon marché sur un canevas quelque peu statique, l'utilisation d'un élément img superposé avec une définition usemap est rapide et sale. Fonctionne particulièrement bien sur les éléments de canevas basés sur des polygones comme un graphique à secteurs.
la source
Alex Answer est assez soigné, mais lors de l'utilisation de la rotation de contexte, il peut être difficile de tracer les coordonnées x, y, j'ai donc fait une démo montrant comment garder une trace de cela.
Fondamentalement, j'utilise cette fonction et je lui donne l'angle et la distance parcourue dans cet ange avant de dessiner l'objet.
la source