Многоусловная фильтрация с флажками JavaScript - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь создать фильтр на основе флажков, который показывает и скрывает параметры из списка.Я пытался использовать ресурсы онлайн, чтобы соединить скрипт, но ничего не получается.

Чтобы скрыть или показать элементы списка
Я редактирую родительский элемент - class = "marker"
основанный на wether - class = "condtx" его дочернего элемента
соответствует массиву отмеченных полей "value" или нет.

Я включил комментарии о том, как я поступаю.

Может кто-нибудь указать мне правильное направление, пожалуйста?

function filterCondtn1() {
  var i, z;

  //"chekedVal" array Keeps returning "undefined" I have no idea why

  var chekedVal = document.getElementById("InputOpts").getElementsByTagName("input").checked.value;

  //Gathered all <h3> tag options into array to be tested against "chekedVal" for match

  var condt1 = document.getElementsByClassName("condtn1").innerHTML;

  //Parrent class that will be edited to show <div> or not if True or false.

  var parrentClss = document.getElementsByClassName("marker");

  //From here it's a blur. I've trying everything I can. I think I should be something of that sort.

  for {
    (var i = 0; i < condt1.length; i++) &&
    (var z = 0; z < parrentClss.length; z++)
    RemoveClass(parrentClss[z], "show");
    if (condt1[i].indexOf(chekedVal) > -1) AddClass(parrentClss[z], "show");
  }
}

//Currently using these two functions in my script and they work

function RemoveClass(element, name) {
  var i, arr1, arr2;
  arr1 = element.className.split(" ");
  arr2 = name.split(" ");
  for (i = 0; i < arr2.length; i++) {
    while (arr1.indexOf(arr2[i]) > -1) {
      arr1.splice(arr1.indexOf(arr2[i]), 1);
    }
  }
  element.className = arr1.join(" ");
}

function AddClass(element, name) {
  var i, arr1, arr2;
  arr1 = element.className.split(" ");
  arr2 = name.split(" ");
  for (i = 0; i < arr2.length; i++) {
    if (arr1.indexOf(arr2[i]) == -1) {
      element.className += " " + arr2[i];
    }
  }
}
.markerA {
  display: none;
}

.show {
  display: block;
}
<div id="InputOpts">
  <input type="checkbox" value="option 1" oninput="filterCondtn1();">Option 1
  <input type="checkbox" value="option 2" oninput="filterCondtn1();">Option 2
  <input type="checkbox" value="option 3" oninput="filterCondtn1();">Option 3
  <input type="checkbox" value="option 4" oninput="filterCondtn1();">Option 4
</div>

<div class="marker">
  <div class="necessary">
    <h3 class="condtn1">Option 1</h3>
  </div>
</div>

<div class="marker">
  <div class="necessary">
    <h3 class="condtn2">Option 3</h3>
  </div>
</div>
<div class="marker">
  <div class="necessary">
    <h3 class="condtn1">Option 2</h3>
  </div>
</div>
<div class="marker">
  <div class="necessary">
    <h3 class="condtn2">Option 4</h3>
  </div>
</div>

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Воспользуйтесь функцией onInput.Это может быть сделано с меньшим количеством кода, чем у вас есть.Вы можете просто получить элементы напрямую, не переключаясь между флажками и родительскими элементами.Вы также можете добавлять прямые стили, не прибегая к бессмысленному добавлению классов CSS.

Я не уверен на 100%, что вы хотели, поэтому вот два примера.

Если вы хотите скрыть выбранные параметры:

function filterCondtn1(event) {
  var element = event.target
  var condt1 = document.getElementsByClassName("option")
  for (var i = 0; i < condt1.length; i++) {
    if (condt1[i].innerHTML.toLowerCase() == element.value.toLowerCase()) {
      if (element.checked == true) {
        condt1[i].parentElement.style = "display:none"
      } else {
        condt1[i].parentElement.style = "display:block"
      }
    }
  }
}
<div id="InputOpts">
  <input type="checkbox" value="option 1" oninput="filterCondtn1(event);">Option 1
  <input type="checkbox" value="option 2" oninput="filterCondtn1(event);">Option 2
  <input type="checkbox" value="option 3" oninput="filterCondtn1(event);">Option 3
  <input type="checkbox" value="option 4" oninput="filterCondtn1(event);">Option 4
</div>

<div class="marker">
  <div class="necessary">
    <h3 class="option">Option 1</h3>
  </div>
</div>

<div class="marker">
  <div class="necessary">
    <h3 class="option">Option 3</h3>
  </div>
</div>
<div class="marker">
  <div class="necessary">
    <h3 class="option">Option 2</h3>
  </div>
</div>
<div class="marker">
  <div class="necessary">
    <h3 class="option">Option 4</h3>
  </div>
</div>

Если вы хотите показать только выбранные опции:

function filterCondtn1(event) {
  var element = event.target
  var condt1 = document.getElementsByClassName("option")
  for (var i = 0; i < condt1.length; i++) {
    if (condt1[i].innerHTML.toLowerCase() == element.value.toLowerCase()) {
      if (element.checked == true) {
        condt1[i].parentElement.style = "display:block"
      } else {
        condt1[i].parentElement.style = "display:none"
      }
    }
  }
}
.marker > .necessary {
  display: none;
}
<div id="InputOpts">
  <input type="checkbox" value="option 1" oninput="filterCondtn1(event);">Option 1
  <input type="checkbox" value="option 2" oninput="filterCondtn1(event);">Option 2
  <input type="checkbox" value="option 3" oninput="filterCondtn1(event);">Option 3
  <input type="checkbox" value="option 4" oninput="filterCondtn1(event);">Option 4
</div>

<div class="marker">
  <div class="necessary">
    <h3 class="option">Option 1</h3>
  </div>
</div>

<div class="marker">
  <div class="necessary">
    <h3 class="option">Option 3</h3>
  </div>
</div>
<div class="marker">
  <div class="necessary">
    <h3 class="option">Option 2</h3>
  </div>
</div>
<div class="marker">
  <div class="necessary">
    <h3 class="option">Option 4</h3>
  </div>
</div>
0 голосов
/ 14 февраля 2019

function selectOption(self){
  const value = self.value;
  unCheckPreviousOption(value);
  const element = document.getElementsByClassName(value)[0];
  element.classList.remove('marker');
  element.classList.add('show');
}

function unCheckPreviousOption(currentCheckbox){
  uncheckCheckboxes(currentCheckbox);
  const elementsDisplayed = document.getElementsByClassName('show');
  if(elementsDisplayed.length){
    [...elementsDisplayed].forEach((el) => {
      el.classList.remove('show');
      el.classList.add('marker');
    });
  }
}

function uncheckCheckboxes(currentCheckbox){
  const checkboxes = document.getElementsByTagName('input');
  if(checkboxes.length){
    [...checkboxes].forEach((el) => {
      if(el.checked && el.value !== currentCheckbox){
        el.checked = !el.checked;
      }
    });
  } 
}
.show { 
  display: block;
}

.marker { 
  display: none;
}
<div id="InputOpts">
  <input type="checkbox" onChange="selectOption(this)" value="one">Option 1
  <input type="checkbox" onChange="selectOption(this)" value="two">Option 2
  <input type="checkbox" onChange="selectOption(this)" value="three">Option 3
  <input type="checkbox" onChange="selectOption(this)" value="four">Option 4
</div>

<div class="marker one">
  <div class="necessary">
    <h3 class="condtn1">Option 1</h3>
  </div>
</div>

<div class="marker three">
  <div class="necessary">
    <h3 class="condtn2">Option 3</h3>
  </div>
</div>
<div class="marker two">
  <div class="necessary">
    <h3 class="condtn1">Option 2</h3>
  </div>
</div>
<div class="marker four">
  <div class="necessary">
    <h3 class="condtn2">Option 4</h3>
  </div>
</div>

Это может помочь вам, это другой способ достижения того, что вы хотите сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...