Фильтрация на сайте JS без jquery

179
20 ноября 2019, 04:10

Задача: есть несколько h3, при вводе в input букв - начать выводить подходящие h3. html-разметка

<input type="text" onkeyup="myFunction()" id="myInput" placeholder="Search for names">
<div class="subject" id="subject">
    <h3>Физика</h3>
    <h3>Алгебра</h3>
    <h3>Геометрия</h3>
    <h3>Биология</h3>
</div>

js:

function myFunction() {
    var input, filter, h3, i;
    input = document.getElementById('myInput');
    filter = input.value.toUpperCase();
    h3 = document.getElementsByTagName('h3');
    for (i=0; i<h3.length; i++){
        h3 = h3[i].getElementsByTagName("h3")[0];
        if (document.innerHTML.toUpperCase() .indexOf(filter) > -1) {
            h3[i].style.display = "";
        }
        else {
            h3[i].style.display = "none";
        }
    }
}

Можете подсказать, где я допускаю ошибку?

Answer 1

На самом деле у вас было много ошибок.

function myFunction() {
    var input, filter, h3, i;
    input = document.getElementById('myInput');
    filter = input.value.toUpperCase();
    h3 = document.getElementsByTagName('h3'); // Здесь в переменной h3 уже содержаться все элементы.
    for (i=0; i<h3.length; i++){
        h3 = h3[i].getElementsByTagName("h3")[0]; // Соответственно здесь не надо вызывать getElementsByTagName (1). К тому же, не надо переопределять h3 переменную, лучше создать новую (2)
        if (document.innerHTML.toUpperCase() .indexOf(filter) > -1) { // здесь не надо смотреть содержимое всего документа, надо смотреть h3(3)
            h3[i].style.display = ""; // здесь в  h3 уже содержится один нужный элемент h3 (4)
        }
        else {
            h3[i].style.display = "none";
        }
    }
}

Посмотрите пример:

function myFunction() { 
  var input, filter, h3s, i; 
  input = document.getElementById('myInput'); 
  filter = input.value.toUpperCase(); 
  h3s = document.getElementsByTagName('h3'); 
 
  for (i = 0; i < h3s.length; i++) { 
    let h3 = h3s[i]; 
    if (h3.innerHTML.toUpperCase().indexOf(filter) > -1) { 
      h3.style.display = ""; 
    } else { 
      h3.style.display = "none"; 
    } 
  } 
}
<input type="text" onkeyup="myFunction()" id="myInput" placeholder="Search for names"> 
<div class="subject" id="subject"> 
  <h3>Физика</h3> 
  <h3>Алгебра</h3> 
  <h3>Геометрия</h3> 
  <h3>Биология</h3> 
</div>

READ ALSO
Проблема с созданием файла в google drive service account через Api

Проблема с созданием файла в google drive service account через Api

На данном этапе, у меня получилось сделать авторизацию в service account по jwt, создать папку и пермишеныС файлами проблема: когда я перехожу по ссылке...

138
Скрытие меню при скроле

Скрытие меню при скроле

Есть появление меню при клике

125
помогите решить проблему с scrollBehavior vue js

помогите решить проблему с scrollBehavior vue js

у меня на странице с ограничением 20 новости, есть кнопка "загрузить еще" и когда нажимаешь на него показывает еще 20 новостей, но когда заходишь...

112
проблема c Fullpage

проблема c Fullpage

Сделал сайт и добавил в него библиотеку FullpageПроблема в следующем,при разрешении 16:9 все нормально

126