TransWikia.com

Не выполняется переход на страницу после активации трех input'ов

Stack Overflow на русском Asked on November 13, 2021

С помощью прикрепленного скрипта формируются JS-табы, второе слово в <li> становится вкладками.

Скрипт ищет <li> c одинаковыми вторыми словами и объединяет их в одну вкладку
Необходимо, чтобы при активации input’ов c name="a",name="b",name="c", выполнялся переход на сформированную по кусочкам <input value="" страницу.

Алгоритм:

  1. Сканируем детей <ul class="productdetails"> ищем второе слово в заголовке
  2. Делаем табы, где кнопки-вкладки – это общие вторые слова, сортируем по критерию совпадения второго слова контент вкладок
  3. клик по чекбоксу из первого блока
  4. клик по радио второго блока
  5. клик по чекбоксу третьего блока
  6. переход на сформированную страницу

    В коде прописано данное условие, но он не выполняется. Подсказали, что не слушается третий input, но не могу исправить это. В чем может быть проблема?

let letters = [];

const itemList = [];

document.querySelectorAll('.productdetails li').forEach((el, i) => {

  const letter = el.innerText.trim().split(' ')[1];

  letters.push(letter);

  letters = [...new Set(letters)];
  
  itemList.push({
    id: i,
    content: el.innerHTML,
    letter
  });
  
  const lettersMap = letters.map(el => {
    return `<label class="example-lk"><input name="b" type="radio" value=${el}>${el}</label>`
  });

  document.querySelector('.results .tabs').innerHTML = lettersMap.join('')

});

document.querySelectorAll('.tabs input').forEach(tab => {
  tab.onclick = (e) => {
  
  const FilteredList = itemList.filter(item => item.letter === e.target.value).map(item => `<li>${item.content}</li>`);
  
  document.querySelector('.results .content').innerHTML = FilteredList
      
  e.target.closest(".results").querySelector(".content").classList.add("show");

    const pd = document.querySelector(".productdetails")
    if (pd) {
      pd.remove()
    }
  }

});






///// ТУТ ВЫБОР ТРЕХ ПУНКТОВ /////
const inputs = document.querySelectorAll('input');

uncheckInputs(inputs);

const obj = {
  a: {
    path: '',
    isChecked: false
  },
  b: {
    path: '',
    isChecked: false
  },
    c: {
    path: '',
    isChecked: false
  }
}

inputs.forEach(addListener);

function addListener(input) {
  input.addEventListener('click', onClickHandler);
}

function onClickHandler(e) {
  changeObjectValues(obj[e.target.name], e.target.value, true);
  const checkedInputs = getСlosestCheckedInputs(e.target);

  if (checkedInputs.length > 0) uncheckInputs(checkedInputs);

  if (isAllChecked()) {
    const url = 'https://his-srvce.online/' + Object.keys(obj).map(getPath).join('');
    location.href = url;
    uncheckInputs(inputs);
  }
}

function getPath(key) {
  return obj[key].path;
}

function isAllChecked() {
  return Object.keys(obj).every(isChecked);
}

function isChecked(key) {
  return obj[key].isChecked === true;
}

function changeObjectValues(obj, path, isChecked) {
  obj.path = path;
  obj.isChecked = isChecked;
}

function getСlosestCheckedInputs(target) {
  const inputs = target.parentNode.parentNode.querySelectorAll('input[type="checkbox"]');
  const checkedInputs = [];

  inputs.forEach(function getCheckedInput(input) {
    if (input.checked && input != target) checkedInputs.push(input);
  });

  return checkedInputs;
}

function uncheckInputs(checkedInputs) {
  checkedInputs.forEach(function uncheck(input) {
    input.checked = false;
  })
}

////////////////////////////



document.querySelectorAll('input[type="checkbox"]').forEach(item => {
  item.addEventListener("change", function(e) {
    if (this.checked) {
      var clicked = this;
      this.closest(".rower").querySelectorAll('input[type="checkbox"]').forEach(item => {
        if (item != this)
          item.checked = false;
      });
    }
  });
});
.results {

  padding: 10px;
}

.results .tabs li {
  display: inline-flex;
  justify-content: center;
  align-items: center;
  width: 100px;
  height: 100px;
  border: 1px solid red;
}

.content {
  display: none;
}

.content.show {
  display: initial;
}
.tabs {
   display: flex;
   justify-content: space-around;
}
.productdetails {
  position: absolute;
  top: 0;
  left: 0;
  opacity: 0;
  z-index: -1000;
}
.example-lk {
display: block;
width: 50px;
height: 50px;
border: 1px solid;
}
.content li {
  border: 1px solid;
  width: 30%;
}
.ex-lb {
border: 1px solid black;
padding: 5px;
font-size: 13px;
}
h3 {
font-size: 14px;
}
<h4>Выберите поломку</h4>
<label class="ex-lb">
    <input type="checkbox" value="https://codepen.ru/" name="a">Не работает динамик</label>
<label class="ex-lb">
    <input type="checkbox" value="https://codepen.ru/" name="a">Не работает зарядка</label>
<label class="ex-lb">
    <input type="checkbox" value="https://codepen.ru/" name="a">Не работает экран</label>
<h4>Выберите бренд</h4>
<div class="results">
    <ul class="tabs"> </ul>
    <ul class="content">Контент</ul>
</div>
<ul class="productdetails">
    <li class="product-container">
        <label>
            <input type="checkbox" value="https://codepen.ru/" name="a">Чекбокс</label>
        <h3 class="prod-list-choose">Телефон Acer</h3> </li>
    <li class="product-container">
        <label>
            <input type="checkbox" value="https://codepen.ru/" name="a">
        </label>
        <h3 class="prod-list-choose">Телефон Samsung</h3> </li>
    <li class="product-container">
        <label>
            <input type="checkbox" value="https://codepen.ru/" name="a">
        </label>
        <h3 class="prod-list-choose">Телефон Vivo</h3> </li>
</ul>

One Answer

Скрипт движется сверху вниз. На момент получения всех инпутов "const inputs = document.querySelectorAll('input');", последнего инпута еще не существует. Создайте его до этой команды, как то так:

document.querySelector("body").insertAdjacentHTML("afterEnd", "<label  class='ender'><input  type='checkbox' name='c'>Модель A</label>");
const inputs = document.querySelectorAll('input');

Answered by fortavey on November 13, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP