- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个执行以下代码而不重复自身的函数。我想根据您单击的选项卡制作显示内容的选项卡,如下所示:https://www.w3schools.com/howto/howto_js_tabs.asp但在 HTML 中没有 onClick。我可以切换按钮的类以向它们添加事件类,但我不知道如何更改 tabcontent 的 style.display 属性。第一段代码执行我想要的,但我知道有一个更清洁的解决方案。
如何让我的 openTab 函数做我想做的事?
有没有更好的方法将事件监听器添加到按钮?
document.getElementById("btn1").addEventListener("click", function() {
document.getElementById("content1").className ="show";
document.getElementById("content2").className ="tabcontent";
document.getElementById("content3").className ="tabcontent";
});
document.getElementById("btn2").addEventListener("click", function() {
document.getElementById("content1").className ="tabcontent";
document.getElementById("content2").className ="show";
document.getElementById("content3").className ="tabcontent";
});
document.getElementById("btn3").addEventListener("click", function() {
document.getElementById("content1").className ="tabcontent";
document.getElementById("content2").className ="tabcontent";
document.getElementById("content3").className ="show";
});
function openTab(evt) {
// Declare all variables
var i, tabcontent, tablinks;
// Get all elements with class="tabcontent" and hide them
tabcontent = document.getElementsByClassName("tabcontent");
for (i = 0; i < tabcontent.length; i++) {
tabcontent[i].style.display = "none";
console.log('first')
}
// Get all elements with class="tablinks" and remove the class "active"
tablinks = document.getElementsByClassName("tablinks");
for (i = 0; i < tablinks.length; i++) {
tablinks[i].className = tablinks[i].className.replace(" active", "");
}
// Show the current tab, and add an "active" class to the button that opened the tab
evt.currentTarget.className += " active";
//this loop adds a style.display = "block" to every tabcontent class.
for (i=0; tabcontent.length; i++) {
tabcontent[i].style.display = "block";
}
//if I make the id's for all the divs "content" this line adds the style.display = "block" to
only the first tabcontent class
//document.getElementById("content").style.display = "block";
}
document.getElementById("btn1").addEventListener("click", openTab);
document.getElementById("btn2").addEventListener("click", openTab);
document.getElementById("btn3").addEventListener("click", openTab);
<div class="tab-container">
<button class="tablinks" id="btn1">Fit Guide</button>
<button class="tablinks" id="btn2">Care</button>
<button class="tablinks" id="btn3">Material</button>
</div>
<div id="content1" class="tabcontent">
<p>Integer vel arcu ac dolor tincidunt dapibus..</p>
</div>
<div id="content2" class="tabcontent">
<p>Integer vel arcu ac dolor tincidunt dapibus..</p>
</div>
<div id="content3" class="tabcontent">
<p>Integer vel arcu ac dolor tincidunt dapibus..</p>
</div>
最佳答案
至于将事件监听器添加到类似元素的集合中的问题,确实有一种更简洁的方法。您可以通过类名获取所有元素,并在向每个元素添加事件监听器的同时迭代每个元素。这将如下所示:
const buttons = [...document.getElementsByClassName("tablinks")];
buttons.forEach(button => {
button.addEventListener("click", () => {
// Some Code Here
});
});
需要注意的是
getElementsByClassName
返回
HTML Collection
const toggleActive = (buttonId) => {
const buttonClicked = document.getElementById(buttonId);
const currentActiveBtn = document.getElementsByClassName("active")[0];
currentActiveBtn.classList.remove("active");
buttonClicked.classList.add("active")
}
const toggleShow = (contentId) => {
const contentToShow = document.getElementById(contentId);
const currentShownContent = document.getElementsByClassName("show")[0];
currentShownContent.classList.remove("show");
contentToShow.classList.add("show")
}
const buttons = [...document.getElementsByClassName("tablinks")];
buttons.forEach(button => {
button.addEventListener("click", () => {
toggleActive(button.id)
const contentId = "content" + button.id.charAt(button.id.length - 1);
toggleShow(contentId);
});
})
.tabcontent {
display: none;
}
.active {
color: red;
}
.show {
display: block
}
<div class="tab-container">
<button class="tablinks active" id="btn1">Fit Guide</button>
<button class="tablinks" id="btn2">Care</button>
<button class="tablinks" id="btn3">Material</button>
</div>
<div id="content1" class="tabcontent show">
<p>Content for Tab 1</p>
<p>Hello World from Tab 1!</p>
</div>
<div id="content2" class="tabcontent">
<p>Content for Tab 2</p>
<p>Hello Again from Tab 2!!</p>
</div>
<div id="content3" class="tabcontent">
<p>Content for Tab 3</p>
<p>Okay Bye now!</p>
</div>
关于javascript - 编写一个函数来更改 div 的 style.display 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66116962/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!