Om Nigam
Om Nigam

Reputation: 150

Cannot read property "classList" of undefined

I am trying to make a facebook clone and 'm facing a problem in see more button it shows the hidden items on first click but does not hide them on another click also on each click it gives the error "Uncaught TypeError: Cannot read property 'classList' of undefined"

My javascript code

function showHidden() {
            // i = 0;
            let items = document.getElementsByClassName("hidden");
            if (items[0].classList.contains("hidden")) {
                for (i = 0; items.length > 0; i++) {
                    items[i].classList.add("unhidden");
                }
            } else if (items[0].classList.contains("unhidden") && items[0].classList.contains("hidden")) {
                for (i = 0; items.length > 0; i++) {
                    items[i].classList.remove("unhidden");
                }
            }
        }

My HTML Code

<li class="unhidden"><img
                    src="https://i.pinimg.com/originals/71/fc/47/71fc472790aa43f44555d08f4d4904c2.jpg"><a
                    href="#"><b>MR. X</b></a></li>
            <li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/yx/r/5rR6LRpNc5u.png"><a
                    href="#"><b>Covid 19 Information
                        Center</b></a></li>
            <li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/y8/r/S0U5ECzYUSu.png"><a
                    href="#"><b>Friends</b></a></li>
            <li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/yU/r/D2y-jJ2C_hO.png"><a
                    href="#"><b>Market Place</b></a>
            </li>
            <li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/y9/r/DHBHg9MEeSC.png"><a
                    href="#"><b>Ads</b></a></li>
            <li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/y5/r/duk32h44Y31.png"><a
                    href="#"><b>Watch</b></a></li>
            <li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/y8/r/he-BkogidIc.png"><a
                    href="#"><b>Memories</b></a>
            </li>
            <li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/y5/r/PrjLkDYpYbH.png"><a
                    href="#"><b>Groups</b></a></li>
            <li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png"><a
                    href="#"><b>Events</b></a></li>
            <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png" class="hidden"><a
                    href="#"><b></b></a></li>
            <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png" class="hidden"><a
                    href="#"><b></b></a></li>
            <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png" class="hidden"><a
                    href="#"><b></b></a></li>
            <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png" class="hidden"><a
                    href="#"><b></b></a></li>
            <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png" class="hidden"><a
                    href="#"><b></b></a></li>
            <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png" class="hidden"><a
                    href="#"><b></b></a></li>
            <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png" class="hidden"><a
                    href="#"><b></b></a></li>
            <li class="unhidden" onclick="showHidden();"><i class="fa fa-chevron-down"></i><a href="#"
                    style="padding-left: 21px;"><b>See More</b></a></li>

CSS :

#navbarHz {
    /* position: fixed; */
    top: 3rem;
    /* top: 0; */
    bottom:0;
    position:fixed;
    overflow-y:auto;
    overflow-x:hidden;
}

#navbarHz>ul {
    display: flex;
    width: 22vw;
    flex-direction: column;
    list-style: none;
    /* height: auto; */
    /* overflow-y: auto; */
}

#navbarHz>ul>li {
    padding: 10px;
    display: none;
    align-items: center;
    font-size: 18px;
}

#navbarHz>ul>li>i{
    /* width: 40px; */
    /* margin-left: 12px; */
    padding: 8px;
    border-radius: 30px;
    background-color: rgba(0, 0, 0, 0.1);
    display: block;
    /* margin-left: 12px; */
}

#navbarHz>ul>li>a {
    text-decoration: none;
    color: black;
}
#navbarHz>ul>li>img {
    width: 40px;
    height: 40px;
    border-radius: 50%;
    margin-right: 12px;
}

Upvotes: 1

Views: 3352

Answers (1)

DecPK
DecPK

Reputation: 25408

Error is because of wrong logic in the for statement.

You have used

for (i = 0; items.length > 0; i++) {

This will result in an infinte loop

which will always true if items.length is not equal to 0. So when i > items.length then it will be undefined and getting classList on undefined will produce error.

for ( i = 0; i < items.length; i++ ) {

function showHidden() {
  // i = 0;
  let items = document.getElementsByClassName("hidden");
  if (items[0].classList.contains("hidden")) {
    for (i = 0; i < items.length; i++) {
      items[i].classList.add("unhidden");
    }
  } else if (items[0].classList.contains("unhidden") && items[0].classList.contains("hidden")) {
    for (i = 0; i < items.length; i++) {
      items[i].classList.remove("unhidden");
    }
  }
}
#navbarHz {
  /* position: fixed; */
  top: 3rem;
  /* top: 0; */
  bottom: 0;
  position: fixed;
  overflow-y: auto;
  overflow-x: hidden;
}

#navbarHz>ul {
  display: flex;
  width: 22vw;
  flex-direction: column;
  list-style: none;
  /* height: auto; */
  /* overflow-y: auto; */
}

#navbarHz>ul>li {
  padding: 10px;
  display: none;
  align-items: center;
  font-size: 18px;
}

#navbarHz>ul>li>i {
  /* width: 40px; */
  /* margin-left: 12px; */
  padding: 8px;
  border-radius: 30px;
  background-color: rgba(0, 0, 0, 0.1);
  display: block;
  /* margin-left: 12px; */
}

#navbarHz>ul>li>a {
  text-decoration: none;
  color: black;
}

#navbarHz>ul>li>img {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  margin-right: 12px;
}
<li class="unhidden"><img src="https://i.pinimg.com/originals/71/fc/47/71fc472790aa43f44555d08f4d4904c2.jpg"><a href="#"><b>MR. X</b></a></li>
<li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/yx/r/5rR6LRpNc5u.png"><a href="#"><b>Covid 19 Information Center</b></a></li>
<li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/y8/r/S0U5ECzYUSu.png"><a href="#"><b>Friends</b></a></li>
<li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/yU/r/D2y-jJ2C_hO.png"><a href="#"><b>Market Place</b></a></li>
<li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/y9/r/DHBHg9MEeSC.png"><a href="#"><b>Ads</b></a></li>
<li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/y5/r/duk32h44Y31.png"><a href="#"><b>Watch</b></a></li>
<li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/y8/r/he-BkogidIc.png"><a href="#"><b>Memories</b></a></li>
<li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/y5/r/PrjLkDYpYbH.png"><a href="#"><b>Groups</b></a></li>
<li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png"><a href="#"><b>Events</b></a></li>
<li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png" class="hidden"><a href="#"><b></b></a></li>
<li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png" class="hidden"><a href="#"><b></b></a></li>
<li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png" class="hidden"><a href="#"><b></b></a></li>
<li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png" class="hidden"><a href="#"><b></b></a></li>
<li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png" class="hidden"><a href="#"><b></b></a></li>
<li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png" class="hidden"><a href="#"><b></b></a></li>
<li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png" class="hidden"><a href="#"><b></b></a></li>
<li class="unhidden" onclick="showHidden();"><i class="fa fa-chevron-down"></i><a href="#" style="padding-left: 21px;"><b>See More</b></a></li>

------------EDITED-------------

function showHidden() {
  let items = document.querySelectorAll(".hidden");

  for (let i = 0; i < items.length; i++) {
    items[i].classList.remove("hidden");
  }
}
#navbarHz {
  /* position: fixed; */
  top: 3rem;
  /* top: 0; */
  bottom: 0;
  position: fixed;
  overflow-y: auto;
  overflow-x: hidden;
}

#navbarHz>ul {
  display: flex;
  width: 22vw;
  flex-direction: column;
  list-style: none;
  /* height: auto; */
  /* overflow-y: auto; */
}

#navbarHz>ul>li {
  padding: 10px;
  display: none;
  align-items: center;
  font-size: 18px;
}

#navbarHz>ul>li>i {
  /* width: 40px; */
  /* margin-left: 12px; */
  padding: 8px;
  border-radius: 30px;
  background-color: rgba(0, 0, 0, 0.1);
  display: block;
  /* margin-left: 12px; */
}

#navbarHz>ul>li>a {
  text-decoration: none;
  color: black;
}

#navbarHz>ul>li>img {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  margin-right: 12px;
}

.hidden {
  display: none;
}

.unhidden {
  display: block;
}
<div id="navbarHz">
  <li class="unhidden"><img src="https://i.pinimg.com/originals/71/fc/47/71fc472790aa43f44555d08f4d4904c2.jpg"><a href="#"><b>MR. X</b></a></li>
  <li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/yx/r/5rR6LRpNc5u.png"><a href="#"><b>Covid 19 Information Center</b></a></li>
  <li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/y8/r/S0U5ECzYUSu.png"><a href="#"><b>Friends</b></a></li>
  <li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/yU/r/D2y-jJ2C_hO.png"><a href="#"><b>Market Place</b></a></li>
  <li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/y9/r/DHBHg9MEeSC.png"><a href="#"><b>Ads</b></a></li>
  <li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/y5/r/duk32h44Y31.png"><a href="#"><b>Watch</b></a></li>
  <li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/y8/r/he-BkogidIc.png"><a href="#"><b>Memories</b></a></li>
  <li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/y5/r/PrjLkDYpYbH.png"><a href="#"><b>Groups</b></a></li>
  <li class="unhidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png"><a href="#"><b>Events</b></a></li>
  <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png"><a href="#"><b></b></a></li>
  <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png"><a href="#"><b></b></a></li>
  <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png"><a href="#"><b></b></a></li>
  <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png"><a href="#"><b></b></a></li>
  <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png"><a href="#"><b></b></a></li>
  <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png"><a href="#"><b></b></a></li>
  <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png"><a href="#"><b></b></a></li>
  <li class="unhidden" onclick="showHidden();"><i class="fa fa-chevron-down"></i><a href="#" style="padding-left: 21px;"><b>See More</b></a></li>

</div>


Edited to toggle see more and hide

function showHidden() {
  let hidden = document.querySelectorAll(".hidden");
  let unHidden = document.querySelectorAll(".unhidden");
  let btn = document.querySelector(".see-more-btn").querySelector("a").firstElementChild;

  if (hidden.length > 0) {
    for (let i = 0; i < hidden.length; i++) {
      hidden[i].classList.remove("hidden");
      hidden[i].classList.add("unhidden");
      btn.textContent = "Hide"
    }
  } else if (unHidden.length > 0) {
    for (let i = 0; i < unHidden.length; i++) {
      unHidden[i].classList.remove("unhidden");
      unHidden[i].classList.add("hidden");
      btn.textContent = "See More"
    }
  }
}
#navbarHz {
  /* position: fixed; */
  top: 3rem;
  /* top: 0; */
  bottom: 0;
  position: fixed;
  overflow-y: auto;
  overflow-x: hidden;
}

#navbarHz>ul {
  display: flex;
  width: 22vw;
  flex-direction: column;
  list-style: none;
  /* height: auto; */
  /* overflow-y: auto; */
}

#navbarHz>li {
  padding: 10px;
  align-items: center;
  list-style-type: none;
  font-size: 18px;
}

#navbarHz>ul>li>i {
  /* width: 40px; */
  /* margin-left: 12px; */
  padding: 8px;
  border-radius: 30px;
  background-color: rgba(0, 0, 0, 0.1);
  display: block;
  /* margin-left: 12px; */
}

#navbarHz>ul>li>a {
  text-decoration: none;
  color: black;
}

#navbarHz>ul>li>img {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  margin-right: 12px;
}

.hidden {
  display: none;
}
<div id="navbarHz">
  <li><img src="https://i.pinimg.com/originals/71/fc/47/71fc472790aa43f44555d08f4d4904c2.jpg"><a href="#"><b>MR. X</b></a></li>
  <li><img src="https://www.facebook.com/rsrc.php/v3/yx/r/5rR6LRpNc5u.png"><a href="#"><b>Covid 19 Information Center</b></a></li>
  <li><img src="https://www.facebook.com/rsrc.php/v3/y8/r/S0U5ECzYUSu.png"><a href="#"><b>Friends</b></a></li>
  <li><img src="https://www.facebook.com/rsrc.php/v3/yU/r/D2y-jJ2C_hO.png"><a href="#"><b>Market Place</b></a></li>
  <li><img src="https://www.facebook.com/rsrc.php/v3/y9/r/DHBHg9MEeSC.png"><a href="#"><b>Ads</b></a></li>
  <li><img src="https://www.facebook.com/rsrc.php/v3/y5/r/duk32h44Y31.png"><a href="#"><b>Watch</b></a></li>
  <li><img src="https://www.facebook.com/rsrc.php/v3/y8/r/he-BkogidIc.png"><a href="#"><b>Memories</b></a></li>
  <li><img src="https://www.facebook.com/rsrc.php/v3/y5/r/PrjLkDYpYbH.png"><a href="#"><b>Groups</b></a></li>
  <li><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png"><a href="#"><b>Events</b></a></li>
  <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png"><a href="#"><b></b></a></li>
  <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png"><a href="#"><b></b></a></li>
  <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png"><a href="#"><b></b></a></li>
  <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png"><a href="#"><b></b></a></li>
  <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png"><a href="#"><b></b></a></li>
  <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png"><a href="#"><b></b></a></li>
  <li class="hidden"><img src="https://www.facebook.com/rsrc.php/v3/ys/r/8wTx0Eu2vRq.png"><a href="#"><b></b></a></li>
  <li onclick="showHidden();" class="see-more-btn">
    <i class="fa fa-chevron-down"></i>
    <a href="#" style="padding-left: 21px;">
      <b>See More</b>
    </a>
  </li>
</div>

Upvotes: 2

Related Questions