Reputation: 46
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
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
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