【发布时间】:2019-11-08 10:01:55
【问题描述】:
我正在为搜索引擎做前端,我有一个 div 会根据搜索结果重复多次。所有这些都需要截断文本并显示更多/更少按钮。我正在使用切换类来截断文本。我写了下面的代码,但是,它只适用于第一个 div,我不知道如何让它适用于所有这些。有人可以帮我解释一下吗?
我尝试过使用for 循环,但我认为我做错了什么
HTML
<p class="result-box-description truncate">Lorem ipsum dolor sit amet, magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptatelaboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptatelaboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptatelaboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptatelaboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptatelaboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit...</p>
<span class="show">show more</span>
<p class="result-box-description truncate">Lorem ipsum dolor sit amet, magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptatelaboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptatelaboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptatelaboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptatelaboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptatelaboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit...</p>
<span class="show">show more</span>
<p class="result-box-description truncate">Lorem ipsum dolor sit amet, magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptatelaboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptatelaboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptatelaboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptatelaboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptatelaboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit...</p>
<span class="show">show more</span>
CSS
p.result-box-description {
@include tipography(14);
color: #000;
margin-top: 15px;
margin-bottom: 15px;
line-height: 1.2em;
text-align: justify;
}
.truncate {
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
JavaScript
window.onload = function () {
document.querySelector('.show').addEventListener('click', textToggle);
};
function textToggle() {
const paragraphs = document.getElementsByClassName('result-box-description');
const btn = document.querySelector('.show');
for (var i = 0; i < paragraphs.length; i++) {
paragraphs[i].classList.toggle('truncate');
}
if (paragraphs.classList.contains('truncate')) {
btn.innerHTML = 'show more';
} else {
btn.innerHTML = 'show less';
}
}
我只是希望所有 div 都以相同的方式工作,因为我不知道实际的数字是多少。
【问题讨论】:
-
您可以使用
querySelectorAll和forEach(但forEach仅适用于数组,因此您也需要使用Array.from。)所以,类似于:Array.from(document.querySelectorAll('.show')).forEach( element => { element.addEventListener('click', textToggle); }); -
顺便说一句,虽然添加多个监听器可能更容易,但添加一个 (
document.addEventListener('click', textToggle)) 会快得多,使用if块来确保单击的元素是相关的,喜欢:function textToggle(event){ if(event.target.classList.contains('.somethingWorthClicking')){ do(stuff); } } -
@Cat 是的,我用过类似的东西。谢谢
标签: javascript json ajax frontend