【问题标题】:Slice querySelector but modify DOM on Submit()切片 querySelector 但在 Submit() 上修改 DOM
【发布时间】:2020-08-06 17:30:21
【问题描述】:

在这篇文章的帮助下,以下是无线电输入的验证脚本:Validating Multiple Radio Button Groups in Vanilla JS

我现在需要在单选输入的 parentNode 被切片后添加一个类。这可能吗?下面的代码在这里工作:https://jsfiddle.net/arkjoseph/aw0kvfm5/49/ 但如果它没有验证,它需要一个错误类。有没有办法绕过切片数组或者我需要执行另一个循环?

编辑我原来的问题: 我怎样才能只访问带有 hasUnanswered 的元素,而不是每个可用的收音机。

给出这个代码:

    function submit(event) {
      const radio_htm = document.querySelectorAll('input[type=radio]');
      const radios_array = Array.prototype.slice.call(radio_htm);

      // Reduce to get an array of radio button sets
    const questions = Object.values(radios_array.reduce((result, el) => {
      return Object.assign(result, {[el.name]: (result[el.name] || []).concat(el)});
    }, {}));

    // Loop through each question, looking for any that aren't answered.
    const hasUnanswered = questions.some(question => {
      !question.some(el => {
        return el.checked;
      })
     });

    if (hasUnanswered) {
        radio_not_pass = false;
        // Retrieve DOM element from sliced array - radios_array and modify dom.
        // Suggestion works here.  
        // What about accessing only radios that = hasUnanswered
        radios.forEach(radio=>radio.parentNode.classList.add('error'))

    } else {
      radio_not_pass = true;

    }

    if (!radio_not_pass) {
     event.preventDefault();
    }

【问题讨论】:

  • 使用.slice有什么问题?
  • @hev1 - 我对如何检索切片的 html 元素的切片不够熟悉。能详细点吗?
  • 检索是什么意思?只需访问数组中的索引即可获取元素。
  • @hev1 - 对不起,但我不确定我是否理解你的建议。 “index 方法返回可以在数组中找到给定元素的第一个索引,如果不存在,则返回 -1。” - 我不确定这对我有什么帮助,因为我喜欢找到'hasUnanswered'的父节点
  • radios_array.forEach(radio=>radio.parentNode.classList.add('my-class'))

标签: javascript dom slice


【解决方案1】:

该数组包含所有元素,因此您可以遍历它并将类添加到每个元素的父级。

radios_array.forEach(radio=>radio.parentNode.classList.add('my-class'))

您可以使用forEachsome 有条件地添加错误类。

let hasUnanswered = false;
questions.forEach(question => {
  if(!question.some(el => {
    return el.checked;
  })){
    hasUnanswered = true;
    question.forEach(el => el.parentNode.classList.add('error'));
  } else {
    question.forEach(el => el.parentNode.classList.remove('error'));
  }
});

【讨论】:

  • 谢谢!你能看看我的问题编辑你的建议吗?
  • 看起来很棒。这么简单
猜你喜欢
  • 2022-10-06
  • 1970-01-01
  • 2016-01-05
  • 2016-10-20
  • 1970-01-01
  • 2016-08-28
  • 2017-07-09
  • 2019-07-21
  • 2021-08-26
相关资源
最近更新 更多