Les méthodes de la classe que les gestionnaires d'événements en JavaScript?
Est-il une bonne pratique ou de façon courante en JavaScript pour avoir des membres de la classe des gestionnaires d'événement?
Considérons l'exemple simple suivant:
<head>
<script language="javascript" type="text/javascript">
ClickCounter = function(buttonId) {
this._clickCount = 0;
document.getElementById(buttonId).onclick = this.buttonClicked;
}
ClickCounter.prototype = {
buttonClicked: function() {
this._clickCount++;
alert('the button was clicked ' + this._clickCount + ' times');
}
}
</script>
</head>
<body>
<input type="button" id="btn1" value="Click me" />
<script language="javascript" type="text/javascript">
var btn1counter = new ClickCounter('btn1');
</script>
</body>
Le gestionnaire d'événement buttoncliked est appelée, mais les _clickCount membre est inaccessible, ou ce points à un autre objet.
Des bons conseils/articles/ressources au sujet de ce genre de problèmes?
Vous devez vous connecter pour publier un commentaire.
MODIFIER près de 10 ans plus tard, avec l'ES6, flèche fonctions et propriétés de la classe
https://codepen.io/anon/pen/zaYvqq
Une fonction rattaché directement à la propriété surclic (onclick) auront le contexte d'exécution du
this
propriété pointant sur l'élément.Lorsque vous avez besoin d'un élément de l'événement à exécuter à l'égard d'une instance d'un objet (a la un délégué .NET), alors vous aurez besoin d'une clôture:-
Je ne sais pas pourquoi
Function.prototype.bind
n'était pas mentionné ici encore. Donc je vais juste laisser ça ici 😉Vous pouvez utiliser de la graisse de la flèche de la syntaxe, qui se lie à la portée lexicale de la fonction
Après que vous pouvez essayer
Vous pouvez l'essayer sur babel ou si votre navigateur prend en charge ES6 sur jsFiddle.
Malheureusement l'ES6 Classe -syntaxe ne semble pas permettre la création de la fonction sur le plan lexical lié à ce. Personnellement, je pense que ça pourrait bien le faire. EDIT: Il semble y avoir expérimentale ES7 fonctionnalité pour permettre.