Dboss
Dboss

Reputation: 46

Uncaught typeEroor: Cannot read property of undefined

I have this code with which I am trying to truncate the innerHTML of elements with an id of title:

<script>
    var titles = document.querySelectorAll("#title")

    function truncate(input) {
        if (input.length > 10)
            return input.substring(0, 10) + '...';
        else
            return input;
    };


    for (i = 0; i < titles[i].length; i++) {
        titles[i].innerHTML = truncate(titles[i])
    }
</script>

<div class="container mx-auto px-4 mt-8">

    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Karma">



    <div class="w3-row-padding">

        <div class="w3-quarter w3-container w3-margin-bottom">


            <img class="card-img-top" src="https://www.w3schools.com//w3images/mountains.jpg" alt="Card image" style="">
            <div class="w3-container w3-white">
                <h5 class="card-title" id="title"><b>Hfe</b></h5>
                <p class="card-text">dvcd</p>

            </div>
        </div>
        <div class="w3-quarter w3-container w3-margin-bottom">


            <img class="card-img-top" src="https://www.w3schools.com//w3images/mountains.jpg" alt="Card image" style="">
            <div class="w3-container w3-white">
                <h5 class="card-title" id="title"><b>nbvn</b></h5>
                <p class="card-text">vbnv</p>

            </div>
        </div>
        <div class="w3-quarter w3-container w3-margin-bottom">


            <img class="card-img-top" src="https://www.w3schools.com//w3images/mountains.jpg" alt="Card image" style="">
            <div class="w3-container w3-white">
                <h5 class="card-title" id="title"><b>New post</b></h5>
                <p class="card-text">New</p>

            </div>
        </div>
        <div class="w3-quarter w3-container w3-margin-bottom">


            <img class="card-img-top" src="https://www.w3schools.com//w3images/mountains.jpg" alt="Card image" style="">
            <div class="w3-container w3-white">
                <h5 class="card-title" id="title"><b>Again</b></h5>
                <p class="card-text">mnmbmbm</p>

            </div>
        </div>
        <div class="w3-quarter w3-container w3-margin-bottom">


            <img class="card-img-top" src="https://www.w3schools.com//w3images/mountains.jpg" alt="Card image" style="">
            <div class="w3-container w3-white">
                <h5 class="card-title" id="title"><b>mn,</b></h5>
                <p class="card-text">m</p>

            </div>
        </div>
        <div class="w3-quarter w3-container w3-margin-bottom">


            <img class="card-img-top" src="https://www.w3schools.com//w3images/mountains.jpg" alt="Card image" style="">
            <div class="w3-container w3-white">
                <h5 class="card-title" id="title"><b>Reacting to the the funniest breakup texts</b></h5>
                <p class="card-text">sfd</p>

            </div>
        </div>
        <div class="w3-quarter w3-container w3-margin-bottom">


            <img class="card-img-top" src="https://www.w3schools.com//w3images/mountains.jpg" alt="Card image" style="">
            <div class="w3-container w3-white">
                <h5 class="card-title" id="title"><b>.m,m,</b></h5>
                <p class="card-text">nvb, ,bmvbcv
                    vcnbcm mbnmnbm,.mnm,,m.m,m,</p>

            </div>
        </div>
        <div class="w3-quarter w3-container w3-margin-bottom">


            <img class="card-img-top" src="https://www.w3schools.com//w3images/mountains.jpg" alt="Card image" style="">
            <div class="w3-container w3-white">
                <h5 class="card-title" id="title"><b>DVGGGGGGGGGGHDGGGGGGGGGHHHHHHGGGGGGGGGGGGGGGGGGGGGGGGGGG</b></h5>
                <p class="card-text">GGGGGG</p>

            </div>
        </div>

    </div>
</div>

It gives me this error:

Uncaught TypeError: Cannot read property 'length' of undefined

Upvotes: 0

Views: 427

Answers (2)

Aleksej
Aleksej

Reputation: 479

There are few things. First your title is returning the object, not the string. As it is an HTML element. In the loop titles[i].length is checking for length of current HTML element which is not possible, length checks for Array or string length. So you should use titles.length which is an array collection of HTML elements.

This also means for truncate function, you are sending an HTML element to the function, not the string. To pass the string, you should target b element inside the title, so you do not omit the HTML structure, and then get the textContent for further processing -> const text = titles[i].querySelector('b').textContent

So your function will look like this:

var titles = document.querySelectorAll("#title")

function truncate(input) {
   if (input.length > 10)
      return input.substring(0,10) + '...';
   else
      return input;
};


for(i=0; i < titles.length; i++){
    const text = titles[i].querySelector('b').textContent
    titles[i].querySelector('b').textContent =  truncate(text)
}
   <div class="container mx-auto px-4 mt-8">

    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Karma">



       <div class="w3-row-padding">

  <div class="w3-quarter w3-container w3-margin-bottom">


      <img class="card-img-top" src="https://www.w3schools.com//w3images/mountains.jpg" alt="Card image" style="">
      <div class="w3-container w3-white">
        <h5 class="card-title" id = "title"><b>Hfe</b></h5>
        <p class="card-text">dvcd</p>

      </div>
    </div>
<div class="w3-quarter w3-container w3-margin-bottom">


      <img class="card-img-top" src="https://www.w3schools.com//w3images/mountains.jpg" alt="Card image" style="">
      <div class="w3-container w3-white">
        <h5 class="card-title" id = "title"><b>nbvn</b></h5>
        <p class="card-text">vbnv</p>

      </div>
    </div>
<div class="w3-quarter w3-container w3-margin-bottom">


      <img class="card-img-top" src="https://www.w3schools.com//w3images/mountains.jpg" alt="Card image" style="">
      <div class="w3-container w3-white">
        <h5 class="card-title" id = "title"><b>New post</b></h5>
        <p class="card-text">New</p>

      </div>
    </div>
<div class="w3-quarter w3-container w3-margin-bottom">


      <img class="card-img-top" src="https://www.w3schools.com//w3images/mountains.jpg" alt="Card image" style="">
      <div class="w3-container w3-white">
        <h5 class="card-title" id = "title"><b>Again</b></h5>
        <p class="card-text">mnmbmbm</p>

      </div>
    </div>
<div class="w3-quarter w3-container w3-margin-bottom">


      <img class="card-img-top" src="https://www.w3schools.com//w3images/mountains.jpg" alt="Card image" style="">
      <div class="w3-container w3-white">
        <h5 class="card-title" id = "title"><b>mn,</b></h5>
        <p class="card-text">m</p>

      </div>
    </div>
<div class="w3-quarter w3-container w3-margin-bottom">


      <img class="card-img-top" src="https://www.w3schools.com//w3images/mountains.jpg" alt="Card image" style="">
      <div class="w3-container w3-white">
        <h5 class="card-title" id = "title"><b>Reacting to the the funniest breakup texts</b></h5>
        <p class="card-text">sfd</p>

      </div>
    </div>
<div class="w3-quarter w3-container w3-margin-bottom">


      <img class="card-img-top" src="https://www.w3schools.com//w3images/mountains.jpg" alt="Card image" style="">
      <div class="w3-container w3-white">
        <h5 class="card-title" id = "title"><b>.m,m,</b></h5>
        <p class="card-text">nvb, ,bmvbcv
vcnbcm mbnmnbm,.mnm,,m.m,m,</p>

      </div>
    </div>
<div class="w3-quarter w3-container w3-margin-bottom">


      <img class="card-img-top" src="https://www.w3schools.com//w3images/mountains.jpg" alt="Card image" style="">
      <div class="w3-container w3-white">
        <h5 class="card-title" id = "title"><b>DVGGGGGGGGGGHDGGGGGGGGGHHHHHHGGGGGGGGGGGGGGGGGGGGGGGGGGG</b></h5>
        <p class="card-text">GGGGGG</p>

      </div>
    </div>

  </div>

Upvotes: 1

ellipsis
ellipsis

Reputation: 12152

In the for loop use titles.length and not titles[i].length. titles[i] will give the element and no element has .length method associated with it. Hence the error

Upvotes: 1

Related Questions