如何隐藏整个类而不产生错误

Posted

技术标签:

【中文标题】如何隐藏整个类而不产生错误【英文标题】:How to hide an entire class without creating errors 【发布时间】:2021-10-23 15:43:15 【问题描述】:

我正在尝试创建一些可以进行测验的东西。当我开始或回答问题时,我试图打开测验的每个“部分”。 这是测验的第 1 部分和第 2 部分。

function begin() 
  var b = document.getElementsByClassName("part2")
  var b2 = 0
  while (b.length >= b2) 
    b[b2].style.visibility = "visible";
    b2 += 1;
  
  return b

    function q1nextcorrect()
        document.getElementById("q1correctwrong").innerhtml="yes!"
    
        
    
    function q1nextwrong()
        document.getElementById("q1correctwrong").innerHTML="no"
    
.part2
        visibility: collapse;
    
<part1 class="part1">
  <h1 style="text-align: center" class="part1">Hello!</h1>
  This is a test. No pressure. Ok! Have fun!
  <div class="part1"></div>
  <button class="part1" onclick="begin()">Begin!</button>
  <div class="part1"></div>
</part1>
<part2 class="part2">
  1+1=?
  <div class="part2"></div>
  <button class="part2" onclick="q1nextwrong()">1</button>
  <button class="part2" onclick="q1nextcorrect()">2</button>
  <p class="part2" id="q1correctwrong"></p>
</part2>

它有效。但是它会引发错误: "message": "Uncaught TypeError: Cannot read property 'style' of undefined", "filename": "https://stacksnippets.net/js", "lineno": 31, "colno": 11 它是如何工作的,为什么会抛出错误?

【问题讨论】:

数组是从零开始的。最后一个元素位于索引array.length - 1。您的while 循环尝试访问索引array.length -> undefined 处的元素。 &gt;= 应该是 &gt; .querySelectorAll(".part2").forEach(...) 将是您的while 的更简单且防故障的版本 【参考方案1】:

改变

while (b.length >= b2) 
    b[b2].style.visibility = "visible";
    b2 += 1;
  

for (var x = 0; x < b.length; x++ ) 
    b[x].style.visibility = "visible";
  

片段 1

function begin() 
  var b = document.querySelectorAll(".part2")
  for (var x = 0; x < b.length; x++ ) 
    b[x].style.visibility = "visible";
  
  return b

    function q1nextcorrect()
        document.getElementById("q1correctwrong").innerHTML="yes!"
    
        
    
    function q1nextwrong()
        document.getElementById("q1correctwrong").innerHTML="no"
    
.part2
        visibility: collapse;
    
<part1 class="part1">
  <h1 style="text-align: center" class="part1">Hello!</h1>
  This is a test. No pressure. Ok! Have fun!
  <div class="part1"></div>
  <button class="part1" onclick="begin()">Begin!</button>
  <div class="part1"></div>
</part1>
<part2 class="part2">
  1+1=?
  <div class="part2"></div>
  <button class="part2" onclick="q1nextwrong()">1</button>
  <button class="part2" onclick="q1nextcorrect()">2</button>
  <p class="part2" id="q1correctwrong"></p>
</part2>

片段 2: 很简单

document.querySelector("[beginN]").addEventListener("click", begin);
function begin() 
  var b = document.querySelector(".p2");
  b.classList.toggle("d-none");

const answers = document.querySelector("#answers");
const a = answers.querySelectorAll("button");

for(var x = 0; x < a.length; x++)
  a[x].addEventListener("click", function()
    if(this.getAttribute("val") == 2)
      document.getElementById("result").innerHTML = "Hooray!";
    else
      document.getElementById("result").innerHTML = "Failed!";

  );
.d-none display:none; 
<div class="p1">
  <h1 style="text-align: center">Hello!</h1>
    This is a test. No pressure. Ok! Have fun!
    <button beginN>Begin!</button>
</div>
<div class="p2 d-none">
  1 + 1 = ? <br>
  <div id=answers>
  ? =
          <button val="1">1</button>
          <button val="2">2</button>
      </div>
  <p id=result></p>
</div>

【讨论】:

为什么 OP 要将 while 更改为 for 循环?唯一的问题是条件。 我认为for 循环看起来有点复杂。我会用固定条件坚持while 循环:) 我对@9​​87654333@循环不太了解,反正for循环对我来说容易多了

以上是关于如何隐藏整个类而不产生错误的主要内容,如果未能解决你的问题,请参考以下文章

初始化 C++ 基类而不键入整个基类类型两次

NHibernate 关联类而不从存储库中提取

如何创建 Python Pyramid 视图类而不需要为每个方法指定“名称”

如何在 JsDoc(VS Code / IntelliSense)中引用另一个文件中的类而不直接导入?

将参数从jsp页面传递给java类而不使用servlet [重复]

NodeJS 6:如何查看整个错误堆栈跟踪? [复制]