Vanilla JS(无 jQuery)- 如何一次切换多个 class?

Vanilla JS (no jQuery) - How to toggle more than one class at once?

我正在处理遗留系统,我无法重写整个系统 css。

所以我发现自己需要在单击另一个元素时在同一元素上切换 2 个 classes(想象一下单击按钮以 hide/show 模式)。

以下是模态的代码。
默认情况下,模态 window 是 .hidden(没有 class "visible"),点击它是 .visible(没有 class "hidden").

function openModal(modalID) {
  document.getElementById(modalID)
    .classList.toggle('hidden');

  document.getElementById(modalID)
    .classList.toggle('visible');
}
I agree to accept the
<a href="#" 
   onclick="openModal('tandcmodal')">
       terms and conditions
</a>
of this website.



<div id="tandcmodal"
     class="hidden">
    Content of the modal
</div>

所以,我相信一定有一种方法可以使用 .toggle().
一次切换多个 class 还是不是?

不幸的是,.toggle accepts only one argument:您要切换的那个 class 名字。要 DRY,您必须遍历 class 名称数组,或者将 classList 保存在变量中并调用 .toggle 两次:

function openModal(modalID) {
  const { classList } = document.getElementById(modalID);
  classList.toggle('hidden');
  classList.toggle('visible');
}
.hidden {
  display: none;
}
.visible {
  display: block;
}
I agree to accept the
<a href="#" onclick="openModal('tandcmodal')">
       terms and conditions
</a> of this website.



<div id="tandcmodal" class="hidden">
  Content of the modal
</div>

但请注意,通常 不需要同时使用 hiddenvisible class。通常你可以 just a hidden class, 并添加/删除它,让默认显示样式在 hidden 未激活时生效:

function openModal(modalID) {
  document.getElementById(modalID).classList.toggle('hidden');
}
.hidden {
  display: none;
}
I agree to accept the
<a href="#" onclick="openModal('tandcmodal')">
       terms and conditions
</a> of this website.



<div id="tandcmodal" class="hidden">
  Content of the modal
</div>

另请注意,内联属性处理程序的行为 very 很奇怪,存在转义问题,并且通常被认为是非常糟糕的做法 - 在几乎所有情况下都应该避免使用它们。考虑使用 Javascript 添加事件侦听器:

document.querySelector('a').addEventListener('click', () => openModal('tandcmodal'));
function openModal(modalID) {
  document.getElementById(modalID).classList.toggle('hidden');
}
.hidden {
  display: none;
}
I agree to accept the
<a href="#">
       terms and conditions
</a> of this website.



<div id="tandcmodal" class="hidden">
  Content of the modal
</div>