javascript - 如何在父元素中专门调用一个 ID 并忽略具有相同 ID 的所有其他元素(使用纯 JS)?
问题描述
我对JS相当陌生。所以,请原谅我问了这么愚蠢的问题。
我想根据这篇文章实现一个阅读更多/更少按钮。
这工作得很好,因为它有唯一的 id。但是,当我在具有相同 id的多个读取更多块中实现此功能时,它仅触发第一个元素。
我有两个带有 id的 divcard1
和card2
class 的父 div wrapper
。我想显示点击阅读更多的 div(比如说card1
)并完全隐藏另一个 div(card2
)(反之亦然)。
这是我的代码。
如您所见,它对第一个 div ( )非常card1
有效,但由于使用相同 id 的矛盾,它不适用于其他 div。
可以在单击按钮的地方专门调用父 div 的 id 并忽略具有相同 id 的其他 div 的元素。有没有其他简单的方法来解决我的问题?
到目前为止我还不懂jQuery,所以,用纯JS解决问题会很有帮助。
谢谢你。
function myFunction(t) {
var x = document.getElementById(t.id).parentNode;
var y = x.parentNode;
var dots = document.getElementById("dots");
var moreText = document.getElementById("more");
var btnText = document.getElementById("myBtn");
if (dots.style.display === "none") {
dots.style.display = "inline";
btnText.innerHTML = "Read more";
moreText.style.display = "none";
y.style.visibility = "visible";
} else {
y.style.visibility = "hidden";
x.style.visibility = "visible";
dots.style.display = "none";
btnText.innerHTML = "Read less";
moreText.style.display = "inline";
}
}
#more {
display: none;
}
<div class="wrapper">
<div id="card1">
<h2>Read More Read Less </h2>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus imperdiet, nulla et dictum interdum, nisi lorem egestas vitae scel<span id="dots">...</span><span id="more">erisque enim ligula venenatis dolor. Maecenas nisl est, ultrices nec congue eget, auctor vitae massa. Fusce luctus vestibulum augue ut aliquet. Nunc sagittis dictum nisi, sed ullamcorper ipsum dignissim ac. In at libero sed nunc venenatis imperdiet sed ornare turpis. Donec vitae dui eget tellus gravida venenatis. Integer fringilla congue eros non fermentum. Sed dapibus pulvinar nibh tempor porta.</span></p>
<button onclick="myFunction(this)" id="myBtn">Read more</button>
</div>
<div id="card2">
<h2>Read More Read Less 2</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus imperdiet, nulla et dictum interdum, nisi lorem egestas vitae scel<span id="dots">...</span><span id="more">erisque enim ligula venenatis dolor. Maecenas nisl est, ultrices nec congue eget, auctor vitae massa. Fusce luctus vestibulum augue ut aliquet. Nunc sagittis dictum nisi, sed ullamcorper ipsum dignissim ac. In at libero sed nunc venenatis imperdiet sed ornare turpis. Donec vitae dui eget tellus gravida venenatis. Integer fringilla congue eros non fermentum. Sed dapibus pulvinar nibh tempor porta.</span></p>
<button onclick="myFunction(this)" id="myBtn">Read more</button>
</div>
</div>
解决方案
几件事
- ID 需要是唯一的,使用一个类
- 不建议使用内联事件处理程序 - 您的代码是委托的完美目标
所以我
- 创建了一个隐藏类并将其添加到需要从一开始就隐藏的内容中
- 切换课程
- 根据隐藏类的存在更改文本
document.getElementById("wrapper").addEventListener("click", function(e) {
const tgt = e.target.closest("button"); // in case you want something inside the button
if (tgt && tgt.classList.contains("readMoreBtn")) {
const parent = tgt.closest(".card");
const dots = parent.querySelector(".dots");
const moreText = parent.querySelector(".more");
dots.classList.toggle("hide")
moreText.classList.toggle("hide")
tgt.innerHTML = moreText.classList.contains("hide") ? "Read more" : "Read less";
}
})
body {
background: #111;
color: #eee;
}
.hide {
display: none;
}
<div id="wrapper">
<div class="card" id="card1">
<h2>Read More Read Less </h2>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus imperdiet, nulla et dictum interdum, nisi lorem egestas vitae scel<span class="dots">...</span><span class="more hide">erisque enim ligula venenatis dolor. Maecenas nisl est, ultrices nec congue eget, auctor vitae massa. Fusce luctus vestibulum augue ut aliquet. Nunc sagittis dictum nisi, sed ullamcorper ipsum dignissim ac. In at libero sed nunc venenatis imperdiet sed ornare turpis. Donec vitae dui eget tellus gravida venenatis. Integer fringilla congue eros non fermentum. Sed dapibus pulvinar nibh tempor porta.</span></p>
<button type="button" class="readMoreBtn">Read more</button>
</div>
<div class="card" id="card2">
<h2>Read More Read Less 2</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus imperdiet, nulla et dictum interdum, nisi lorem egestas vitae scel<span class="dots">...</span><span class="more hide">erisque enim ligula venenatis dolor. Maecenas nisl est, ultrices nec congue eget, auctor vitae massa. Fusce luctus vestibulum augue ut aliquet. Nunc sagittis dictum nisi, sed ullamcorper ipsum dignissim ac. In at libero sed nunc venenatis imperdiet sed ornare turpis. Donec vitae dui eget tellus gravida venenatis. Integer fringilla congue eros non fermentum. Sed dapibus pulvinar nibh tempor porta.</span></p>
<button type="button" class="readMoreBtn">Read more</button>
</div>
</div>
推荐阅读
- scala - 适用于 Play 2.6 和 Scala 2.12 的兼容 SBT 版本
- python - 为什么resample()后枚举多列时使用单括号不报错
- checkbox - 如何在可重复使用的 pug 模板中解析来自外部源(例如 json)的链接(或任何 HTML 标签)?
- c# - 关于多租户设置的分区策略问题
- mysql - 将 .csv 文件加载到 MySQL 数据库问题
- javascript - 在查看模式时停止滚动
- android - android上是否有任何通用API可以在任何前台窗口文本视图或编辑器上设置新字体
- php - 语法错误,Laravel 视图中出现意外的 '?>':D:..\WEB3\WEB\Pics\resources\views\home.blade.php
- java - 类型不匹配:数字、日期或字符串预期休眠 LocalDate
- javascript - Codemirror 不能使用变量来获取或设置值