javascript - javascript选项卡没有传递任何参数来运行
问题描述
您好,所以我有使用 javascript 的标签:
function openScreen(screen, button) {
let i;
const tabContent = document.getElementsByClassName("tab-content");
const tabButton = document.getElementsByClassName("tab-button");
for (i = 0; i < tabContent.length; i++) {
tabContent[i].style.display = "none";
}
document.getElementById(screen).style.display = "block";
for (i = 0; i < tabButton.length; i++) {
tabButton[i].classList.remove('active');
}
document.getElementById(button).classList.add('active');
}
<div class="tab-links">
<button id="login-button" class="active tab-button" onclick="openScreen('Login', 'login-button')">Login</button>
<button id="register-button" class="tab-button" onclick="openScreen('Register', 'register-button')">Register</button>
</div>
<div>
<div id="Login" class="tab-content">
<p>Login</p>
</div>
<div id="Register" class="tab-content" style="display:none">
<p>Register</p>
</div>
</div>
这是可行的,但我想在不向函数传递任何参数的情况下执行此操作,并且不使用onclick
函数来执行此操作。但我不知道我应该如何实现这一目标。
解决方案
这是事件委托的完美任务。您为包装按钮和内容的元素上的单击事件注册了一个偶数侦听器。在该事件侦听器中,您可以使用e.target
事件起源的元素。e.currentTarget
是侦听器所附加的那个。
在侦听器中,您需要确定它是否真的是按钮。这可以通过检查某个属性来完成(在这种情况下是data-target
属性)
function openScreen(tabContainer, button) {
// remove active class from tab-content and tab-button in the current tab container
tabContainer.querySelectorAll(".tab-content.active, .tab-button.active").forEach(elm => {
elm.classList.remove('active');
})
// add the active class to the button and the container set by the target
let screen = button.dataset.target;
document.getElementById(screen).classList.add('active');
button.classList.add('active');
}
// Add the delegate event listener to all tab-conainers
document.querySelectorAll(".tab-container").forEach(container => {
container.addEventListener('click', (e) => {
// check if the event happened on an element with the `data-target` attribute
if (e.target.dataset.target) {
const tabContainer = e.currentTarget
const button = e.target
openScreen(tabContainer, button)
}
})
})
.tab-content {
display: none;
}
.tab-content.active {
display: block;
}
<div class="tab-container">
<div class="tab-links">
<button id="login-button" data-target="Login" class="tab-button active">Login</button>
<button id="register-button" data-target="Register" class="tab-button">Register</button>
</div>
<div>
<div id="Login" class="tab-content active">
<p>Login</p>
</div>
<div id="Register" class="tab-content">
<p>Register</p>
</div>
</div>
</div>
<hr>
<div class="tab-container">
<div class="tab-links">
<button id="login-button2" data-target="Login2" class="tab-button active">Login2</button>
<button id="register-button2" data-target="Register2" class="tab-button">Register2</button>
</div>
<div>
<div id="Login2" class="tab-content active">
<p>Login2</p>
</div>
<div id="Register2" class="tab-content">
<p>Register2</p>
</div>
</div>
</div>
推荐阅读
- c# - 使用 InMemoryDatabase 返回计数为 0 的 NUnit 测试
- angular - 如何使用 Angular 路由器模块在 Ionic 5 中显示选项卡
- android - 分支 IO 深层链接自定义别名不起作用。相同的链接不在两个不同的应用程序中共享?
- zfs - 物理端口移动后 ZFS 路径不匹配
- html - 如何在拖放角度中制作一个空的输入文本框
- c - *(long *) 和 *(int*) 是什么意思?
- node.js - 在 React Native 和 NodeJS 后端使用 Google 登录
- java - Tomcat 9 和 Spring 5 邮件库问题
- python - selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:-下拉项目 ID,XPATH 不起作用
- django - Django - 如何将 URL 模式正则表达式与附加参数匹配?