Skip to content
Advertisement

while updating class name of an element why “this” keyword is needed?

I’m referring to example

// Get the container element
var btnContainer = document.getElementById("myDIV");

// Get all buttons with class="btn" inside the container
var btns = btnContainer.getElementsByClassName("btn");

// Loop through the buttons and add the active class to the current/clicked button
for (var i = 0; i < btns.length; i++) {
  btns[i].addEventListener("click", function() {
    var current = document.getElementsByClassName("active");
    current[0].className = current[0].className.replace(" active", "");
    this.className += " active";
  });
}
.btn {
  border: none;
  outline: none;
  padding: 10px 16px;
  background-color: #f1f1f1;
  cursor: pointer;
}

/* Style the active class (and buttons on mouse-over) */
.active, .btn:hover {
  background-color: #666;
  color: white;
}
<div id="myDIV">
  <button class="btn">1</button>
  <button class="btn active">2</button>
  <button class="btn">3</button>
  <button class="btn">4</button>
  <button class="btn">5</button>
</div>

In this to replace active class to nil, current[0].className is used as below

current[0].className = current[0].className.replace(" active", "");

But to add classname, this keyword is used

this.className += " active";

Why can’t I add new classname as below

current[0].className += " active"; ?

Advertisement

Answer

Because this in your current context is the clicked button. Another way to do it is with e.target.classList.add('active');, but before doing so you should pass e to the callback function parameter like that

  btns[i].addEventListener("click", function(e) {
    var current = document.getElementsByClassName("active");
    current[0].className = current[0].className.replace(" active", "");
    e.target.classList.add('active');
  });
User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement