Home > OS >  Cannot read properties of undefined (reading 'display')
Cannot read properties of undefined (reading 'display')

Time:10-07

I'm trying to toggle text showing when I click a button for each item I have in a Carousel.

When I use "getElementByID" it works fine, but I need to use "getElementsByClassName" because it's a repeater field in the backend and there are several buttons in the whole carousel.

Anyway here is my code -

 function toggleText(){
  var x = document.getElementsByClassName("figure-caption-test");
  if (x.style.display === "none") {
    x.style.display = "block";
  } else {
    x.style.display = "none";
  }
}

<button class="figure-button" id="figure-button" onclick="toggleText()">
REVEAL ANSWER
</button>

<figcaption class="figure-caption-test" id="reveal-text" style="display: none;">
Text that appears
</figcaption>

And the error i'm getting is - Cannot read properties of undefined (reading 'display')

Any help is greatly appreciated, thanks

CodePudding user response:

getElementsByClassName returns array of elements. this is my solution:

 function toggleText(){
  var elms = document.getElementsByClassName("figure-caption-test");

  Array.from(elms).forEach((x) => {
    if (x.style.display === "none") {
      x.style.display = "block";
    } else {
      x.style.display = "none";
    }
  })
}
<button class="figure-button" id="figure-button" onclick="toggleText()">
REVEAL ANSWER
</button>

<figcaption class="figure-caption-test" id="reveal-text" style="display: none;">
Text that appears
</figcaption>

CodePudding user response:

I think there is a for loop missing and a counting variable.

Your code should look like this:

var x = document.getElementsByClassName("figure-caption-test");
var i;
for (i=0; i < x.length; i  ) { 

if (x.style.display === "none") {
    x.style.display = "block";
  } else {
    x.style.display = "none";
  }

}

CodePudding user response:

"getElementsByClassName" returns an array-like object, not a single object.

You can iterate over the object using a forEach:

x.forEach(element => {
  if (element.style.display === "none") {
      element.style.display = "block";
    } else {
      element.style.display = "none";
    }
  }
)

You can find more on that here: https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName

  • Related