如何合并/清理 .querySelector 元素

Posted

技术标签:

【中文标题】如何合并/清理 .querySelector 元素【英文标题】:How to consolidate/clean up .querySelector elements 【发布时间】:2021-11-04 06:15:22 【问题描述】:

我有多个相同的功能toggleImage。我将它们全部写在单独的代码行中,它们都运行良好,但我确信有一种更有效的方法来编写它。

我尝试了document.querySelectorAll('#H01Overlay', '#H02Overlay', '#H03Overlay', '#H04Overlay'),但后来我的功能都停止工作了......

function toggleImage()
  document.querySelector('#H01Overlay').classList.toggle('img-hidden');


function toggleImage()
  document.querySelector('#H02Overlay').classList.toggle('img-hidden');


function toggleImage()
  document.querySelector('#H03Overlay').classList.toggle('img-hidden');


function toggleImage()
  document.querySelector('#H04Overlay').classList.toggle('img-hidden');

【问题讨论】:

.querySelector().querySelectorAll() 期望 one 字符串包含一个或多个 css 选择器。 '#H01Overlay', '#H02Overlay', '#H03Overlay', '#H04Overlay' 是四个单独的字符串(选择器)。让它成为一个,它会工作的。 您能否分享足够多的“minimal reproducible examplehtml 以便我们重现您的问题?除了使用元素的 id 之外,还有很多方法可以选择元素并实现您想要的,包括利用 DOM 结构使您的 javascript 更加 DRY。 【参考方案1】:

第一:函数名称必须是唯一的。但是您可以将它们组合成一个功能:

function toggleImage()
  document.querySelector('#H01Overlay').classList.toggle('img-hidden');
  document.querySelector('#H02Overlay').classList.toggle('img-hidden');
  document.querySelector('#H03Overlay').classList.toggle('img-hidden');
  document.querySelector('#H04Overlay').classList.toggle('img-hidden');


如前所述,您可以在逗号分隔的字符串中使用多个选择器(使用querySelectorAll)。您需要一个循环来切换此选择中每个元素的类。

工作示例:

function toggleImage()
  let elms = document.querySelectorAll('#H01Overlay, #H02Overlay, #H03Overlay, #H04Overlay');
  
  for(i = 0; i < elms.length; i++) 
    elms[i].classList.toggle('img-hidden');
  
.img-hidden 
  display: none;
<div id="H01Overlay">test</div>
<div id="H02Overlay">test</div>
<div id="H03Overlay">test</div>
<div id="H04Overlay">test</div>
<div id="H05Overlay">test</div>

<button type="button" onclick="toggleImage();">toggle</button>

【讨论】:

谢谢你,比伯曼!这个例子是一个巨大的帮助。【参考方案2】:

querySelectorAll 需要一个参数,但选择器可以是多个。你试过了吗?

document.querySelectorAll('#H01Overlay,#H02Overlay,#H03Overlay,#H04Overlay');

【讨论】:

以上是关于如何合并/清理 .querySelector 元素的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QuerySelector 获得第二个匹配项?

querySelector 与 getElementById [关闭]

如何使用 .querySelector 选择器定位 .style 属性?

如何选择包含引号的元素?

querySelector() 方法

querySelector() - 第一个内部元素