#javascript #jquery
#javascript #jquery
Вопрос:
Я пытаюсь создать простой поисковик / маркер, и я сталкиваюсь с трудностями из-за противоречивых результатов / ничего не происходит, когда я его тестирую.
Я думаю, что самый большой пробел заключается в моем понимании того, как должны работать функции обратного вызова и чему могут соответствовать селекторы.
В идеале, когда кто-то нажимает на тег, все должно исчезать, и снова должны появляться только погружения с соответствующими тегами в них. Если ничего не совпадает, то должен появиться раздел «Ничего не найдено», а сброс должен очень быстро исчезнуть, и все разделы (без nomatch div) снова появятся без подсветки.
Кто-нибудь дает некоторые разъяснения о том, где я могу улучшить?
Редактировать: Смотрите ссылку в комментариях, чтобы увидеть мой код.
Дополнительные разъяснения по проблемам: Щелкните по тегу (старый, фотография, руководство), а затем нажмите на сброс. Все три части должны появиться снова, но появляются только две.
Случайным образом будет отображаться сообщение «Не найдено результатов».
Если вы выберете тег, а затем выполните поиск в другом, входы и выходы будут асинхронными.
Комментарии:
1. Можете ли вы предоставить скрипку?
2. Несомненно, было бы очень полезно, если бы вы описали, что идет не так (а также то, что идет правильно, если вообще что-либо) и о каких ошибках сообщается.
3. Вот ваш материал в виде jsfiddle . Я не могу понять, что это такое или не должно делать; это определенно что -то делает в данный момент.
4. Я обновил вставленный в jsfiddle указатель, чтобы немного больше осветить проблему.
Ответ №1:
Проблема в том, что .fadeout()
было на каждом .workshopentry
, поэтому на самом деле было бы 3 затухания. Следовательно, функция обратного вызова для завершения анимации вызывалась также 3 раза! Таким образом, логика определения того, какие новые записи показывать и скрывать, выполнялась 3 раза и вызывала странное многократное исчезновение.
Я обновил jsfiddle более надежным решением.
Дайте мне знать, если вам нужно больше объяснений того, что делает JavaScript.
Комментарии:
1. Похоже, работает отлично, и мне нужно еще кое-что переварить. Большое спасибо.
Ответ №2:
Вам нужно скопировать следующий код
if (toFadeIn.length < 1) { //No results found
toFadeIn.push(noResults);
}
$(toFadeIn).each(function(index, div){
div.fadeIn(1000);
});
внутри функции обратного вызова workshop.fadeout .. вот так :
workshop.fadeOut(1000, function() {
var tags = $('.left ul li', this);
tags.removeClass('searchMatch'); //reset the search results
tags.each(function() {
if ($(this).text().toLowerCase() === searchTerm.toLowerCase()) {
$(this).addClass('searchMatch');
toFadeIn.push($(this).parent().parent().parent());
}
});
if (searchTerm === "") {
toFadeIn.push(workshop);
}
if (toFadeIn.length < 1) { //No results found
toFadeIn.push(noResults);
}
$(toFadeIn).each(function(index, div){
div.fadeIn(1000);
});
});
Вы видите? Обратный вызов fadeout еще не был вызван, но вы уже начали просматривать toFadeIn
массив, чтобы показать результаты поиска. В то время он еще даже не просматривал записи.
Это связано только с тем, что мы в основном привыкли к последовательному коду, поэтому обратные вызовы требуют немного внимания. Но это действительно так работает. Вы просто продолжаете помещать код внутри обратного вызова .. а затем снова внутри другого обратного вызова и так далее.
Комментарии:
1. Я добавил в вас исправление, но оно не полностью решило проблему для меня.
2. с какой проблемой вы столкнулись сейчас?
3. Я обновил свой первоначальный пост примечаниями о том, что сейчас ломается.