Я запускаю файл PHP, который использует JavaScript для добавления в список элементов, извлеченных из базы данных sql. Фильтр поиска не влияет на элементы, взятые из базы данных sql. Как я могу добавить элементы sql в ul, чтобы они правильно фильтровались?
Index.php, HTML-код, содержащий «зашитые» элементы — элементы 1 и 2.
<section>
<h2>Item Selection</h2>
<form>
<input type = "text" id = "itemSearch" placeholder = "Search for items">
</form>
<ul id = "itemList">
<li>
<span>Item 1</span>
</li>
<li>
<span>Item 2</span>
</li>
</ul>
</section>
Index.php, PHP-код, который добавляет элементы из sql в ul
fetch('get_data.php')
.then(response => response.json())
.then(data => {
const itemList = document.getElementById('itemList');
data.forEach(item => {
const li = document.createElement('li');
li.innerHTML = "<span></span>";
li.querySelector('span').textContent = item['ItemName'];
itemList.appendChild(li);
});
Index.php, js-код, фильтрующий список
const itemList = document.getElementById('itemList');
const items = itemList.querySelectorAll('li');
const itemSearchInput = document.getElementById('itemSearch');
// Filter item list based on search input
itemSearchInput.addEventListener('input', function() {
const searchQuery = itemSearchInput.value.trim().toLowerCase();
items.forEach(item => {
const itemName = item.querySelector('span').textContent.toLowerCase();
if (itemName.includes(searchQuery)) {
item.style.display = 'block';
} else {
item.style.display = 'none';
}
});
});
Переместите объявление items внутри функции прослушивателя событий, чтобы она получила текущий список элементов, добавленных кодом AJAX.
Да, я сейчас перечитываю это, и @Barmar прав. Вы не «делаете что-то после PHP», вы «делаете что-то после получения JavaScript». Тот факт, что выборка обращается к PHP, не имеет отношения к проблеме.
@Бармар, похоже, это сработало, если ты ответишь, я подтвержу это. Кроме того, почему это работает — перемещается только объявление элементов, а не объявление itemList?
Причина: метод querySelectorAll() возвращает все элементы, соответствующие селекторам CSS, поэтому каждый раз, когда он вызывается, он получает самые последние данные (если область действия не указана, это применяется ко всему документу).



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


Переместите items в функцию прослушивателя, чтобы она всегда получала текущий набор элементов, а не элементы, которые были на странице при первой загрузке (это пустой список, поскольку они добавляются динамически).
const itemList = document.getElementById('itemList');
const itemSearchInput = document.getElementById('itemSearch');
// Filter item list based on search input
itemSearchInput.addEventListener('input', function() {
const items = itemList.querySelectorAll('li');
const searchQuery = itemSearchInput.value.trim().toLowerCase();
items.forEach(item => {
const itemName = item.querySelector('span').textContent.toLowerCase();
if (itemName.includes(searchQuery)) {
item.style.display = 'block';
} else {
item.style.display = 'none';
}
});
});
Я думаю, что это как-то связано с функцией onload(), но я перепробовал кучу версий и так и не заработал.