Maison > interface Web > js tutoriel > Comment le mot clé « this » se comporte-t-il dans « addEventListener » de JavaScript et comment pouvons-nous garantir un contexte approprié ?

Comment le mot clé « this » se comporte-t-il dans « addEventListener » de JavaScript et comment pouvons-nous garantir un contexte approprié ?

Susan Sarandon
Libérer: 2024-10-29 10:31:30
original
857 Les gens l'ont consulté

How Does the

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal