#jquery
#jquery
Вопрос:
У меня есть этот код, чтобы скрыть каждый .flip
элемент, кроме того, который я искал:
var $rows = $('.flip');
$('#search').keyup(function()
{
var val = $.trim($(this).val()).replace(/ /g, ' ').toLowerCase();
$rows.show().filter(function()
{
var text = $(this).text().replace(/s /g, ' ').toLowerCase();
return !~text.indexOf(val);
}).hide();
});
Проблема с этим заключается в том, что он выполняет поиск каждый раз, когда я отпускаю ключ. Как я могу заставить его ждать, пока я не перестану печатать
Спасибо!
Комментарии:
1. Используйте
change
событие вместоkeyup
.2. @Azim
change
является рискованным, некоторые браузеры / платформы запускают его только после того, как элемент теряет фокус, что обычно не то, что вы хотели бы использовать в функции поиска.3.
keyup
иchange
не будет вставлять текст, например, с помощью мыши, поэтому он должен использоватьinput
событие.
Ответ №1:
Просто используйте setTimeout
$(document).ready(function() {
var timer;
var $rows = $('.flip');
var $self = $(this);
$('#search').keyup(function() {
clearTimeout(timer);
timer = setTimeout(function() {
$('#test').text(Math.floor(Math.random() * 1000));
var val = $.trim($self.val()).replace(/ /g, ' ').toLowerCase();
$rows.show().filter(function() {
var text = $(this).text().replace(/s /g, ' ').toLowerCase();
return !~text.indexOf(val);
}).hide();
}, 300);
});
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="search"/>
<span id="test"></span>
Комментарии:
1. @Hiroo17 Мой пример вам не подходит? Ошибки консоли?
2. Ваш пример работает нормально, но в тот момент, когда я внедряю его в свой код, он не работает.
3. Должно быть, у меня где-то есть fckd. В любом случае. Ваш код должен работать, поэтому я отмечаю его как решение.
Ответ №2:
Вам нужно использовать debounce, я предлагаю для этого Lodash.
Я использую его следующим образом:
var debounce = _.debounce(search, 500, false);
$('#search-input').on('change', function() {
debounce(this);
});
function search(input) {
if(input.value.length > 2) {
...
}
}
_.debounce выполнит работу по ожиданию, пока пользователь перестанет вставлять значение.
Первый параметр — это функция, которую вы хотите вызвать после того, как она дождется, когда пользователь прекратит вставлять значение.
Второй параметр — это время в миллисекундах, в течение которого будет ожидаться вставка следующего значения.
Третий параметр — это опция для настройки, использование false заставит его отправлять последнее введенное значение.