Home >Web Front-end >JS Tutorial >How Does the \'this\' Keyword Behave In JavaScript\'s `addEventListener` and How Can We Ensure Proper Context?
The Value of this Within the Handler Using addEventListener
In JavaScript, this refers to the object on which the method is invoked. However, when handling events using addEventListener, this can refer to the element that raised the event rather than the object containing the event handler function.
Consider the following example:
<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>
In the handleCellClick function, this refers to the clicked cell, not the ticketTable object. This issue can be resolved using the bind method.
bind allows you to specify the value of this for a function. In this case, you can bind the this value to the ticketTable object:
<code class="javascript">cell1.addEventListener("click", this.handleCellClick.bind(this), false);</code>
The bound function will have the correct this context when the event is raised:
<code class="javascript">ticketTable.prototype.handleCellClick = function () { alert(this.innerHTML); // Still works fine alert(this.tickets.length); // Now works as expected };</code>
Alternatively, you can use the handleEvent method, which is specifically designed to handle events. In this case, this will always refer to the object implementing the method:
<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>
Both bind and handleEvent provide solutions to the problem of this reference in event handlers, allowing you to access the correct object context within your event handler functions.
The above is the detailed content of How Does the \'this\' Keyword Behave In JavaScript\'s `addEventListener` and How Can We Ensure Proper Context?. For more information, please follow other related articles on the PHP Chinese website!