【问题标题】:Show/hide all paragraphs with same css class via javascript toggle通过javascript切换显示/隐藏具有相同css类的所有段落
【发布时间】:2021-03-18 19:56:01
【问题描述】:

作为一个 javascript 新手,我需要一些帮助。我正在构建具有某些多个元素(在我的情况下是圣经的不同翻译)的 html 页面,这些元素会根据用户的偏好进行切换。我需要通过单击按钮在“display:block”和“display:none”之间更改给定css类的显示属性。我当前的代码适用于更改 css 类中段落的第一个实例,但我想要的是能够通过单击按钮来更改 css 的所有实例的显示属性。我的研究告诉我,我的 javascript 中可能需要一个“for”循环,但我无法弄清楚如何编写和实现它的正确语法,以便按钮单击将显示/隐藏相同的所有实例css 类。这是我的代码:

<style>
p.niv {display:block;}
p.esv {display:none;}
p.kjv {display:none;}
</style>

<p>Click the buttons to display your preferred Bible version:</p>

<button onclick="niv()">NIV</button>
<button onclick="kjv()">KJV</button>
<button onclick="esv()">ESV</button>

<p>Regular paragraph, blah blah</p>
<p class="niv">this NIV paragraph will become hidden when the KJV or ESV button is clicked</p>
<p class="niv">but this NIV paragraph stays visible even though I want it to be hidden too</p>
<p class="kjv">this KJV paragraph will become hidden when the NIV or ESV button is clicked</p>
<p class="kjv">but this KJV paragraph stays visible even though I want it to be hidden too</p>
<p class="esv">this ESV paragraph will become hidden when the KJV or NIV button is clicked</p>
<p class="esv">but this ESV paragraph stays visible even though I want it to be hidden too</p>

<script>
    var n = document.getElementsByClassName("niv") [0];
    var k = document.getElementsByClassName("kjv") [0] ;
    var e = document.getElementsByClassName("esv") [0];
         
function niv() {

    n.style.display = "block";
    k.style.display = "none";
    e.style.display = "none";
  }

function kjv() {
 
    n.style.display = "none";
    k.style.display = "block";
    e.style.display = "none";    
  }

function esv() {
  
    n.style.display = "none";
    k.style.display = "none";
    e.style.display = "block";
  }

</script>

如何循环我的 javascript 函数来更改 css 类的每个实例的显示属性?提前感谢您帮助新手!

【问题讨论】:

  • (因为你的类名数量非常有限,而且是静态的,这也可以在没有任何循环的情况下完成 - 通过在你的样式表中创建规则,隐藏某个类的所有这些元素,当共同祖先分配了一个特定的类 - 然后你只需要在一个地方设置/删除一个类。)
  • CBroe 感谢您的回复。由于 html 只是我拥有的众多工作之一,恐怕我的知识还不够丰富,无法理解我在您迄今为止提供的示例中所看到的内容。我猜你已经回答了我的问题,但我不够敏锐,不知道如何处理它!
  • stackoverflow.com/a/6523513/1427878 有一个非常简单的示例,说明如何使用简单的for 循环遍历 getElementsByClassName 的结果,并展示如何通过循环计数器变量访问元素。
  • CBroe 谢谢你,我会摆弄一下,看看我是否能理解它。我非常感谢您的回复。如果我解决了,我会告诉你的。

标签: javascript css for-loop


【解决方案1】:

我建议将这项工作委托给浏览器,而不是选择所有段落并遍历它们。因此,您可以将段落包装在容器中并使用其类名进行操作。

<p>Click the buttons to display your preferred Bible version:</p>

<button onclick="changeVersion('niv')">NIV</button>
<button onclick="changeVersion('kjv')">KJV</button>
<button onclick="changeVersion('esv')">ESV</button>

<p>Regular paragraph, blah blah</p>

<div id='container' class='niv-active'>
    <p class="niv">this NIV paragraph will become hidden when the KJV or ESV button is clicked</p>
    <p class="niv">but this NIV paragraph stays visible even though I want it to be hidden too</p>
    <p class="kjv">this KJV paragraph will become hidden when the NIV or ESV button is clicked</p>
    <p class="kjv">but this KJV paragraph stays visible even though I want it to be hidden too</p>
    <p class="esv">this ESV paragraph will become hidden when the KJV or NIV button is clicked</p>
    <p class="esv">but this ESV paragraph stays visible even though I want it to be hidden too</p>
</div>
.niv, .esv, .kjv {
  display: none;
}
#container.niv-active .niv {
  display: block;
}
#container.kjv-active .kjv {
  display: block;
}
#container.esv-active .esv {
  display: block;
}
const container = document.getElementById("container");
         
function changeVersion(v) {
    container.className = v + '-active';
  }

【讨论】:

  • 这是一个有趣的解决方案!
  • 也感谢您的回答。我避免将我的段落类包装在 div 或容器中,因为(在我的用例中)我需要显示/隐藏的段落将散布在整个文档中多个位置的许多其他文本中,并且基于我的理解有限,我需要将要显示/隐藏的每个段落都包装在容器中。很可能我只是不理解你的解决方案,但我当然很感激!我有很多东西要学!
  • @imaginizer,gubnich 的解决方案也可以在您的场景中使用,因为它只针对类列表中包含所需段落的段落(nivkjvesv)。你可以在这里测试它:jsfiddle.net/8p6uLnys/1
  • 啊哈!现在我明白了。这很光滑!谢谢古比尼奇!再次感谢secan!你真的帮助我理解了我在看什么。非常感谢大家的帮助!
【解决方案2】:

我可以建议一种不同的方法,需要更少的代码行吗?

<style>
  /*1. you create a single class whose only purpose is to hide the element*/
  .hide {
    display: none;
  }
</style>

<p>Click the buttons to display your preferred Bible version:</p>

<button onclick="showVersion('.niv')">NIV</button>
<button onclick="showVersion('.kjv')">KJV</button>
<button onclick="showVersion('.esv')">ESV</button>

<p>Regular paragraph, blah blah</p>
<p class="niv">this NIV paragraph will become hidden when the KJV or ESV button is clicked</p>
<p class="niv">but this NIV paragraph stays visible even though I want it to be hidden too</p>
<p class="kjv hide">this KJV paragraph will become hidden when the NIV or ESV button is clicked</p>
<p class="kjv hide">but this KJV paragraph stays visible even though I want it to be hidden too</p>
<p class="esv hide">this ESV paragraph will become hidden when the KJV or NIV button is clicked</p>
<p class="esv hide">but this ESV paragraph stays visible even though I want it to be hidden too</p>

<script>
  /* 2. you create a single function that hides all versions but the selected one */
  function showVersion(selector) {
    // first hide all versions...
    document.querySelectorAll('.niv, .kjv, .esv').forEach(elem => elem.classList.add('hide'));
    // ... then show only the desired one
    document.querySelectorAll(selector).forEach(elem => elem.classList.remove('hide'));
  }
</script>

【讨论】:

  • 太棒了。这正是我所需要的。我知道这对你来说似乎很简单,但对于这位同时处理 javascript 的牧师来说,你是祈祷的答案。非常感谢您花时间向我展示这个!
  • 嗯,我很确定你对 JavaScript 的了解胜过我对圣经的了解。 :)) 除了笑话,我很高兴能帮上忙。
【解决方案3】:

如果你是初学者,你应该尝试使用此代码@secan 使用 ES6,这对新手来说并不容易理解

 var n = document.getElementsByClassName("niv");
 var k = document.getElementsByClassName("kjv");
 var e = document.getElementsByClassName("esv");
   

//This hideTag and showTag is use to hide your niv,kjv,esv

function hideTag(tagName) {
    for(let i=0;i<tagName.length;i++){
        tagName[i].style.display = 'none'
    } 
}

function showTag(tagName) {
    for(let i=0;i<tagName.length;i++){
        tagName[i].style.display = 'block'
    } 
}
   
function niv() {
  showTag(n)
  hideTag(k)
  hideTag(e)
}

function kjv() {
  showTag(k)
  hideTag(n)
  hideTag(e)
}

function esv() {
  showTag(e)
  hideTag(k)
  hideTag(n)
}
p.niv {display:block;}
p.esv {display:none;}
p.kjv {display:none;}
<p>Click the buttons to display your preferred Bible version:</p>

<button onclick="niv()">NIV</button>
<button onclick="kjv()">KJV</button>
<button onclick="esv()">ESV</button>

<p>Regular paragraph, blah blah</p>
<p class="niv">this NIV paragraph will become hidden when the KJV or ESV button is clicked</p>
<p class="niv">but this NIV paragraph stays visible even though I want it to be hidden too</p>
<p class="kjv">this KJV paragraph will become hidden when the NIV or ESV button is clicked</p>
<p class="kjv">but this KJV paragraph stays visible even though I want it to be hidden too</p>
<p class="esv">this ESV paragraph will become hidden when the KJV or NIV button is clicked</p>
<p class="esv">but this ESV paragraph stays visible even though I want it to be hidden too</p>

【讨论】:

  • 我可以问你为什么你认为 ES6 语法比 ES6 之前的语法更难理解,对于新手来说?我个人的看法是,情况可能恰恰相反:“经验丰富”的开发人员,用“旧”语法编写了很多时间,可能需要一些时间来适应和采用新语法,但对于新手来说,这不是问题和 ES6 语法本身更清晰/直观,IMVHO。
  • 感谢 Isaac.mm 的输入。作为一个只“经常”使用代码的新手,我对它的了解还不够深入,无法真正理解我在做什么,因为我不是真正的网络开发人员,而只是一个了解我需要什么的人为了完成一个特定的目标。你可能会说,我只知道够危险!感谢您花时间帮助我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多