我正在尝试创建一段javascript代码,它只会隐藏和显示页面上与其id属性相对应的每个表单。所以想象一下,页面上有4个按钮可见,表单元素默认为隐藏,一旦点击了一个与表单id相匹配的按钮,它只会切换该表单。下面是我尝试过的代码
function _(x) {
return document.getElementById(x);
}
const catBtn = _("catBtn");
const blogBtn = _("blogBtn");
const videoBtn = _("VideoBtn");
const prodBtn = _("prodBtn");
const catForm = _("catForm");
const blogForm = _("blogForm");
const videoForm = _("VideoForm");
const prodForm = _("prodForm");
document.addEventListener('click', function(e) {
if (e.target.id === catBtn) {
// catForm.classList.toggle("showHide");
console.log("you clicked the cat btn");
} else if (e.target.id === blogBtn) {
// blogForm.classList.toggle("showHide");
console.log("you clicked the blog btn");
} else if (e.target.id === videoBtn) {
// videoForm.classList.toggle("showHide");
console.log("you clicked the video btn");
} else if (e.target.id === prodForm) {
// prodForm.classList.toggle("showHide");
console.log("you clicked the product btn");
}
})
<div class="new__btn">
<button id="catBtn">New Category</button>
</div>
<div class="new__btn">
<button id="blogBtn">New Blog</button>
</div>
<div class="new__btn">
<button id="videoBtn">New Video</button>
</div>
<div class="new__btn">
<button id="prodBtn">New Product</button>
</div>
<div id="catForm">
Hide or show this div for the categories
<div class="panel">
<div class="panel__head">Panel Head</div>
<div class="panel__body">Panel Body</div>
<div class="panel__footer">Panel Footer</div>
</div>
</div>
<div id="blogForm">
Hide or show this div for the blogs
<div class="panel">
<div class="panel__head">Panel Head</div>
<div class="panel__body">Panel Body</div>
<div class="panel__footer">Panel Footer</div>
</div>
</div>
<div>
<div id="videoForm">
Hide or show this div for the videos
<div class="panel">
<div class="panel__head">Panel Head</div>
<div class="panel__body">Panel Body</div>
<div class="panel__footer">Panel Footer</div>
</div>
</div>
<div id="prodForm">
Hide or show this div for the products
<div class="panel">
<div class="panel__head">Panel Head</div>
<div class="panel__body">Panel Body</div>
<div class="panel__footer">Panel Footer</div>
</div>
</div>
5条答案
按热度按时间8ftvxx2r1#
如果你用containing元素 Package 你的按钮和表单,并且给按钮和表单都添加数据属性,你可以使用event delegation,这样你就可以给按钮容器附加一个监听器,当它的子元素在DOM中"冒泡"时,它会捕捉事件。
然后,处理程序可以检查被单击的是按钮,提取其数据id(它将对应于表单上的相同数据id),并在选择器中使用该id来定位该表单。
然后,只需使用CSS切换"show"类即可。
从示例中可以看到,也可以使用相同的方法将活动类切换到单击的按钮。
附加文件
querySelector
/-querySelectorAll
matches
sqxo8psd2#
对于这个问题,我会采取一种完全不同的方法。我建议使用数据属性标记按钮和表单,然后根据单击的按钮动态显示和隐藏表单。这将允许您轻松添加新表单。
下面是我的方法的一个实现,它使用了querySelectory和数据属性。如果你有任何问题,请随时提问,我会尽我所能为你详细阐述我的解决方案。
wbrvyc0a3#
前面的答案包含了解决这个问题的一个选项,但是点击也可以用你之前使用的方法检测,通过在文档中附加一个事件监听器,你所需要做的就是用
e.target
替换e.target.id
,因为代码应该比较元素和元素,而不是id和元素。r7knjye24#
首先,您将比较Nodes和字符串(
e.target.id
返回string
),字符串总是返回false。第二,将事件侦听器应用于文档,这意味着将eventListener添加到整个文档,无论您在何处单击它都将触发。
您需要为每个按钮添加一个eventListener。您可以这样做:
你也可以做一个document.querrySelectAll('button')并在元素上循环,应用上面的事件监听器。
这是多么有用啊!
toe950275#
好吧,我解决了这个问题,通过一点研究和微调,我能够使用它来使一切工作,因为我需要它。所以,如果其他人面临这个问题,这里是我使用的代码