javascript - 重置 radio 表格的正确方法

标签 javascript html forms

我在这里尝试运行一个函数“renderQuestion”,它将随机化问题并在单击“下一步”按钮后显示下一个选项。通过“getSelectedValue”,我试图获取选定的单选按钮。

但我正在获取的是它显示我第一次按下“下一步”按钮时选择了哪个按钮,但它无法继续工作。它给出了一些错误“无法读取 null 的属性‘值’”。

如果我不使用“renderForm.reset()”,我每次点击下一步都能得到值。现在,我在这里做错了什么?

const renderForm = document.querySelector("#renderForm");
const next = document.querySelector("#next");

// const q = document.querySelector("#question");
// const ans1 = document.querySelector("#ans1");
// const ans2 = document.querySelector("#ans2");
// const ans3 = document.querySelector("#ans3");
// const ans4 = document.querySelector("#ans4");

renderQuestion = async () => {
  const timeout = async (ms) => new Promise((res) => setTimeout(res, ms));
  let userClicked = false;

  let arr = [ans1, ans2, ans3, ans4]; //array of options
  for (let i = arr.length - 1; i > 0; i--) {    ////randomizing array
    const j = Math.floor(Math.random() * (i + 1));
    const temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
  }


  // q.innerHTML =
  // `${totalQ}/${ongoing}` + `    ` + qID.data().question;
  // arr[0].innerHTML = qID.data().a;
  // arr[1].innerHTML = qID.data().b;
  // arr[2].innerHTML = qID.data().c;
  // arr[3].innerHTML = qID.data().d;

  next.addEventListener("click", (e) => {
    console.log("inside next");
    let getSelectedValue = document.querySelector('input[name="ans"]:checked');
    console.log(getSelectedValue.value);
    getSelectedValue.checked = false;
    userClicked = true;
    e.preventDefault();
    // renderForm.reset();
  });
  while (userClicked === false) await timeout(50);
};
start = async () =>
{
  for(let i=0;i<4;i++)
  {
    await renderQuestion();
  }
}

start();
#renderForm p {
  display: inline;
}

.option {
  /* display: inline-block; */
  font-size: 1.5rem;
  margin-block: 2rem;
  margin-left: 1rem;
}

.button {
  border: none;
  outline: none;
  font-size: 1rem;
  margin-top: 1rem;
  background-color: #081b0a;
  color: #ffffff;
  padding: 0.75rem 1rem;
  border-radius: 0.5rem;
  font-weight: 100;
  font-family: monospace;
  margin-bottom:8rem;
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <link rel="stylesheet" href="/style.css" />
  <title>Document</title>
</head>

<body>
  <section>
    <form action="" id="renderForm">
      <p id="question"></p>
      <div class="option">
        <input type="radio" name="ans" id="option1" value="ans1" required />
        <p id="ans1">1</p>
      </div>
      <div class="option">
        <input type="radio" name="ans" id="option2" value="ans2" required />
        <p id="ans2">2</p>
      </div>
      <div class="option">
        <input type="radio" name="ans" id="option3" value="ans3" required />
        <p id="ans3">3</p>
      </div>
      <div class="option">
        <input type="radio" name="ans" id="option4" value="ans4" required />
        <p id="ans4">4</p>
      </div>

      <button class="button" id="next" type="submit">Next</button>
    </form>
  </section>

  <script src="/js.js"></script>
</body>

</html>

最佳答案

eventlistener 移出循环。您只需要应用一次,如果您委托(delegate)它(意思是将监听器应用到静态父对象,例如document,然后测试目标ID),它将适用于您添加到 DOM 的任何 #next 按钮。

document.addEventListener("click", (e) => {
  if (e.target.id !== 'next') return
  console.log("inside next");
  let getSelectedValue = document.querySelector('input[name="ans"]:checked');
  console.log(getSelectedValue.value);
  getSelectedValue.checked = false;
  userClicked = true;
  e.preventDefault();
  // renderForm.reset();
});

const renderForm = document.querySelector("#renderForm");
const next = document.querySelector("#next");

document.addEventListener("click", (e) => {
  if (e.target.id !== 'next') return
  console.log("inside next");
  let getSelectedValue = document.querySelector('input[name="ans"]:checked');
  console.log(getSelectedValue.value);
  getSelectedValue.checked = false;
  userClicked = true;
  e.preventDefault();
  // renderForm.reset();
});

renderQuestion = async() => {
  const timeout = async(ms) => new Promise((res) => setTimeout(res, ms));
  let userClicked = false;

  let arr = [ans1, ans2, ans3, ans4]; //array of options
  for (let i = arr.length - 1; i > 0; i--) { ////randomizing array
    const j = Math.floor(Math.random() * (i + 1));
    const temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
  }


  while (userClicked === false) await timeout(50);
};
start = async() => {
  for (let i = 0; i < 4; i++) {
    await renderQuestion();
  }
}

start();
#renderForm p {
  display: inline;
}

.option {
  /* display: inline-block; */
  font-size: 1.5rem;
  margin-block: 2rem;
  margin-left: 1rem;
}

.button {
  border: none;
  outline: none;
  font-size: 1rem;
  margin-top: 1rem;
  background-color: #081b0a;
  color: #ffffff;
  padding: 0.75rem 1rem;
  border-radius: 0.5rem;
  font-weight: 100;
  font-family: monospace;
  margin-bottom: 8rem;
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <link rel="stylesheet" href="/style.css" />
  <title>Document</title>
</head>

<body>
  <section>
    <form action="" id="renderForm">
      <p id="question"></p>
      <div class="option">
        <input type="radio" name="ans" id="option1" value="ans1" required />
        <p id="ans1">1</p>
      </div>
      <div class="option">
        <input type="radio" name="ans" id="option2" value="ans2" required />
        <p id="ans2">2</p>
      </div>
      <div class="option">
        <input type="radio" name="ans" id="option3" value="ans3" required />
        <p id="ans3">3</p>
      </div>
      <div class="option">
        <input type="radio" name="ans" id="option4" value="ans4" required />
        <p id="ans4">4</p>
      </div>

      <button class="button" id="next" type="submit">Next</button>
    </form>
  </section>

  <script src="/js.js"></script>
</body>

</html>

关于javascript - 重置 radio 表格的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68108325/

相关文章:

javascript - css/javascript 表单 onfocus 占位符文本仍然存在,在键入时消失

javascript - 如何在node.js中设置grpc客户端超时

php - 如何在codeigniter中获取提交的表单数据?

javascript - 如何在嵌套主控中的 asp.net 异步回发后维护滚动位置?

javascript - Dropzone 文件未处理

javascript - JS querySelector 只有第一个 child 没有迭代 child

javascript - 自定义谷歌自定义搜索引擎。特别是更改标题字体

forms - 标准下拉箭头在 Firefox 中可见,但在 Chrome 中不可见

javascript - 单击 href 链接时如何将查询字符串参数添加到同一 URL

javascript - 向图像平移添加缓动