// Я получаю ошибку typeError a is undefined. Тем не менее, я пытался объявить свою переменную поверх своего кода, но она все еще не работает.
// Get input element
let filter = document.getElementById('filter');
// Add event listener
filter.addEventListener('keyup', filterNames);
function filterNames() {
// Get value of input
let filterValue = document.getElementById('filter').value.toUpperCase();
// Get names ul
let ul = document.getElementById('names');
// Get lis from ul
let li = ul.querySelectorAll('li.list-group-item');
// Loop through collection-item lis
for (let i = 0; i < li.length; i++) {
let a = li[i].getElementsByTagName('a')[0];
// If matched
if (a.innerHTML.toUpperCase().indexOf(filterValue) > -1) {
li[i].style.display = '';
} else {
li[i].style.display = 'none';
}
}
}
У вас может быть элемент li без каких-либо a. Таким образом, получение li[i].getElementsByTagName('a')[0] undefined.
Вероятно, вам следует проверить, возвращает ли a узел или нет, прежде чем продолжить



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Основываясь на вашем вопросе, я попытался воспроизвести то же самое
HTML
<input type = "text" id = "filter" />
<ul id = "names" class = "list-group">
<li class = "list-group-item"><a>First item</a></li>
<li class = "list-group-item"><a>Second item</a></li>
<li class = "list-group-item"><a>Third item</a></li>
</ul>
JS:
// Get input element
let filter = document.getElementById('filter');
// Add event listener
filter.addEventListener('keyup', filterNames);
function filterNames() {
// Get value of input
let filterValue = document.getElementById('filter').value.toUpperCase();
// Get names ul
let ul = document.getElementById('names');
// Get lis from ul
let li = ul.querySelectorAll('li.list-group-item');
// Loop through collection-item lis
for (let i = 0; i < li.length; i++) {
let a = li[i].getElementsByTagName('a')[0];
// If matched
if (a.innerHTML.toUpperCase().indexOf(filterValue) > -1) {
li[i].style.display = '';
} else {
li[i].style.display = 'none';
}
}
}
если в этой строке нет его ошибки бросания
let a = li[i].getElementsByTagName('a')[0];
поскольку нет
Скорее всего, проблема в том, что у вас нет a в каждом вашем li, и в результате let a = li[i].getElementsByTagName('a')[0]; вы получаете undefined. Так что вам лучше добавить чек, чтобы продолжить, например
for (let i = 0; i < li.length; i++) {
let a = li[i].getElementsByTagName('a')[0];
// If matched
if (a && a.innerHTML.toUpperCase().indexOf(filterValue) > -1) {
li[i].style.display = '';
} else {
li[i].style.display = 'none';
}
}
Вы уверены, что у вас есть
aв каждомli?