Итак, я пытаюсь создать фильтр для этого списка магазинов, чтобы отображались только те, содержимое которых равно значению поля ввода. К сожалению, мой фильтр работает некорректно. Во-первых, все, что я набираю в поле ввода, заставляет все элементы моего магазина добавлять класс «display», что приводит к тому, что мои элементы получают стиль «display: none;». Во-вторых, он не обновляется каждый раз при нажатии клавиши.
HTML:
<li class = "p-3 clearfix store display">
<div class='float-left w-50'>
<div class='mb-1'><strong>Store Number:</strong><span class = "store-info">
<?php
if (strlen($row['store_num']) < 4) {
if (strlen($row['store_num']) == 3) {
echo '0' . $row['store_num'];
} else if (strlen($row['store_num']) == 2) {
echo '00' . $row['store_num'];
}
} else {
echo $row['store_num'];
}
?>
</span></div>
<div class='mb-1'><strong>Store Name: </strong><span class='store-info'><?php echo $row['store_name']; ?></span></div>
<div class='clearfix mb-1'>
<p class='float-left'><strong>Address: </strong></p>
<span class='d-block store-info float-left'><?php echo $row['store_street']; ?></span>
<br>
<span class='d-block store-info float-left'><?php echo $row['store_city']; ?>, <?php echo strtoupper($row['store_state']); ?> <?php echo $row['store_zip']; ?></span>
</div> <!-- mb-1 -->
</div> <!-- float-left -->
<div class = "float-left w-50 clearfix">
<div class = "d-inline float-right">
<div class='mb-1'>
<strong>Time Zone: </strong><span class='time-zone store-info'><?php echo strtoupper($row['time_zone']); ?></span>
</div>
<div class='mb-1'>
<strong>Current Time: </strong><time>3:45pm</time>
</div>
<div class='mb-1'>
<strong>Phone Number:</strong><span class='store-info'>
<?php
$phone = $row['store_phone'];
$area = substr($phone, 0, 3);
$prefix = substr($phone, 4, 3);
$line = substr($phone, 6, 4);
echo '(' . $area . ') ' . $prefix . '-' . $line;
?>
</span>
</div>
<div class='mb-1'>
<strong>Fax Number:</strong><span class='store-info'>
<?php
$phone = $row['store_fax'];
$area = substr($phone, 0, 3);
$prefix = substr($phone, 4, 3);
$line = substr($phone, 6, 4);
echo '(' . $area . ') ' . $prefix . '-' . $line;
?>
</span>
</div>
</div> <!-- d-inline -->
</div> <!-- float-right -->
</li> <!-- clearfix -->
JavaScript:
var search = document.getElementById('search');
var stores = document.querySelectorAll('.store');
search.addEventListener('keyup', function (e) {
var data = e.target.value.toLowerCase();
stores.forEach(function(store) {
var spans = document.querySelectorAll('.store-info');
for(var i = 0; i < spans.length; i++) {
if (spans[i].innerText.toLowerCase() != data) {
store.classList.remove('display');
} else {
store.classList.add('display');
}
}
});
});
Я понимаю это, но у меня есть класс под названием «display», в котором есть только стиль display: none. Извините, если это сбивает с толку. Буду редактировать.



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


Если я правильно понял ваш вопрос, вы можете внести следующие изменения в свой javascript, чтобы решить проблемы, с которыми вы столкнулись. См. Комментарии в коде для объяснения того, что происходит:
search.addEventListener('keyup', function (e) {
var query = e.target.value.toLowerCase();
if (search.value.length >= 0) {
search.classList.add('focused');
label.classList.add('focused');
} else {
search.classList.remove('focused');
label.classList.remove('focused');
}
// recommend performing this query in the keyup event to ensure
// that you're working with the most up to date state of the DOM
var stores = document.querySelectorAll(".store");
stores.forEach(function(store) {
// query .store-info from current store
var spans = store.querySelectorAll(".store-info");
// hide the store by default
store.style.display = 'none';
for (var i = 0; i < spans.length; i++) {
var storeInfoText = spans[i].innerText.toLowerCase();
// consider revising search logic like so
if (storeInfoText.indexOf(query) !== -1 || !query) {
// display the store if some match was found
store.style.display = 'block';
}
}
});
});
Ссылка на рабочий jsFiddle здесь
К сожалению, это не работает. Это не приводит к тому, что все элементы удаляют класс отображения, но он не фильтруется правильно.
.display {display: none; }
Извините за путаницу. Изначально у меня было display: block, но перед публикацией я изменил его на display: none.
Хм, все еще не работает. По сути, все, что я набираю, вызывает все магазины, а затем не обновляет список, когда я удаляю значение. Например, если я ввожу «80», и только одно хранилище из трех, с которыми я тестирую, имеет этот номер, все три будут заполнены и отображены. Если я удалю вход в ничто, все они продолжат отображаться.
Я проверил, но, к сожалению, их нет.
Нет, к сожалению, тоже самое.
Как вы думаете, может ли он искать какие-либо экземпляры строки символов в любом порядке? Теперь, когда я печатаю знак '+', все исчезают, но когда я вообще что-то набираю, например, диск, не во всех магазинах есть диск, всего пара, но во всех них есть хотя бы одна буква
Можете ли вы взять копию html, которая отображается в вашем браузере, и загрузить ее в jsFiddle, чтобы я мог рассмотреть ее поближе?
Да, конечно, один момент.
Ладно, дело дошло до одного персонажа! См. Обновленный ответ. store.style.display = 'none' не должен содержать ;. Я также включил рабочий jsFiddle - надеюсь, это поможет!
О боже, лол. Не могу поверить, что мы оба упустили это из виду! Спасибо много!
I think your issue with it showing everything is because of the add remove... if a store already has display it will re add it and then only remove it once where as if it doesn’t you will get an error so try toggle
var search = document.getElementById ('поиск'); var store = document.querySelectorAll ('. store');
search.addEventListener('keyup', function (e) {
var data = e.target.value.toLowerCase();
stores.forEach(function(store) {
var spans = document.querySelectorAll('.store-info');
spans.filter(span=>{
if (span.innerText.toLowerCase().includes(data)){
store.classList.toggle('display');
}else{store.classList.toggle('display')
})
});
display: none- это не класс. Это побочный эффект от вашего классаdisplay?