La valeur de this dans le gestionnaire utilisant addEventListener
En JavaScript, this fait référence à l'objet sur lequel la méthode est invoquée. Cependant, lors de la gestion d'événements à l'aide de addEventListener, cela peut faire référence à l'élément qui a déclenché l'événement plutôt qu'à l'objet contenant la fonction de gestionnaire d'événements.
Considérez l'exemple suivant :
<code class="javascript">function ticketTable(tickets) { this.tickets = tickets; } ticketTable.prototype.render = function (element) { var tbl = document.createElement("table"); for (var i = 0; i < this.tickets.length; i++) { var row = document.createElement("tr"); var cell1 = document.createElement("td"); var cell2 = document.createElement("td"); cell1.appendChild(document.createTextNode(i)); cell2.appendChild(document.createTextNode(this.tickets[i])); cell1.addEventListener("click", this.handleCellClick, false); row.appendChild(cell1); row.appendChild(cell2); tbl.appendChild(row); } element.appendChild(tbl); }; ticketTable.prototype.handleCellClick = function () { // PROBLEM! In the context of this function, "this" is the element that triggered the event. alert(this.innerHTML); // Works fine alert(this.tickets.length); // Does not work };</code>
Dans le fonction handleCellClick, cela fait référence à la cellule cliquée, pas à l'objet ticketTable. Ce problème peut être résolu en utilisant la méthode bind.
bind vous permet de spécifier la valeur de this pour une fonction. Dans ce cas, vous pouvez lier la valeur this à l'objet ticketTable :
<code class="javascript">cell1.addEventListener("click", this.handleCellClick.bind(this), false);</code>
La fonction liée aura le bon contexte lorsque l'événement est déclenché :
<code class="javascript">ticketTable.prototype.handleCellClick = function () { alert(this.innerHTML); // Still works fine alert(this.tickets.length); // Now works as expected };</code>
Alternativement, vous pouvez utiliser la méthode handleEvent, spécialement conçue pour gérer les événements. Dans ce cas, this fera toujours référence à l'objet implémentant la méthode :
<code class="javascript">ticketTable.prototype.handleEvent = function (event) { console.log(this.name); // 'Something Good' switch (event.type) { case 'click': // Some code here... break; case 'dblclick': // Some code here... break; } };</code>
bind et handleEvent fournissent des solutions au problème de cette référence dans les gestionnaires d'événements, vous permettant d'accéder au contexte d'objet correct dans votre fonctions du gestionnaire d'événements.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!