Список SELECT с фильтрацией. помогите!
Задача сделать список со строкой фильтрации сверху. Чтобы при вводе первых символов, элементы списка не содержащие этих символов скрывались, а если вообще подходящих элементов нет, список блокируется и в нем появляется строка "совпадений не найдено".
это работает, но только в mozilla. chrome и opera не скрывают элементы. почему?! еще хотелось бы чтобы в отфильтрованном списке выделялся первый элемент, вот с этим полная беда даже в mozille, хотя на первый взгляд может показаться что работает, если ввести букву П, все города кроме Пензы скоются, и Пенза выделится, но если потом стереть П, ввести Ж, тоже самое произойдет с Житомером, теперь стираем Ж, пробуем опять П, Пенза отфильтруется но уже не выделяется ... голова дымится, помогите разобраться, что делаю не так? ниже привожу код, и вот "рабочий" пример на JSfiddle http://jsfiddle.net/macmacins/wb5EF/4/
<input style="display: block" id="Filter">
<select id="cityList" size="8">
<option>Брянск</option>
<option>Житомер</option>
<option>Пенза</option>
<option>Бердянск</option>
</select>
$("#Filter").keyup(function()
{
var search_str = this.value.toLowerCase();
var conc = 0;
if (($("#cityList").attr("disabled")=="disabled"))
{
$("#cityList option[value='-1']").remove();
$("#cityList").attr("disabled", false);
}
$("#cityList option").each(function()
{
if (this.text.toLowerCase().indexOf(search_str)==0)
{
$(this).toggle(true);
}
else
{
$(this).toggle(false);
conc ++;
}
});
if (conc == $("#cityList option").size())
{
$("#cityList").append($('<option value="-1">Совпадейний не найдено</option>'));
$("#cityList").attr("disabled", true);
}
//здесь пытаюсь выделять первый элемент видимого списка
$("#cityList :visible:first").attr("selected", "selected");
})
|
Pedro Garciya Lopez,
:write:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title> - jsFiddle demo by macmacins</title>
<script type='text/javascript' src='http://code.jquery.com/jquery-1.9.1.js'></script>
<script>
$(window).load(function(){
var ops = $("#cityList option");
$("#Filter").on('input',function()
{
var search_str = this.value.toLowerCase(), conc;
$("#cityList option").remove();
ops.each(function(indx, element){
this.text.toLowerCase().indexOf(search_str)==0 && ($("#cityList").append($(this)))
});
conc = !$("#cityList option").size()
conc && $("#cityList").append($('<option value="-1">Совпадейний не найдено</option>'));
$("#cityList").prop("disabled", conc);
$("#cityList :selected").prop("selected", false);
$("#cityList option:first").prop("selected", true);
})
});
</script>
</head>
<body>
<input style="display: block" id="Filter">
<select id="cityList" size="8">
<option>Брянск</option>
<option>Житомер</option>
<option>Пенза</option>
<option>Бердянск</option>
</select>
</body>
</html>
|
Рони, спасибо за ответ!
Ваш вариант превосходно работает в Chrome, но вот в Mozilla с выделением первого из отфильтрованных та же беда. Наглядно эту беду можно увидеть выполнив следующий алгоритм: 1. фильтруем по "Б" 2. потом по "Бе" до этого момента все работает как надо 3. теперь стираем "е" и оставляем "Б" но выделенным остается по прежнему Бердянск 4. стираем все символы, отображается весь список, но выделенным остается не первый элемент, а по прежнему Бердянск 5. фильтруем по "Ж", выделяется Житомер, стирам "Ж", опять выделяется Бердянск 6. снова фильтруем по "Ж", Житомер отфильтровывается но уже не выделяется ну и такая свистопляска продолжается до обновления страницы ... сейчас проверил еще в Opera, Safari и IE: в Opera работает идеально, как и в Chrome в Safari если фильтровать по "Б", потом по "Бе" то выделяются сразу два элемента ну а IE делает вид, что вообще ничего не происходит :) видимо надо держать весь список в массиве, нужные элементы отфильтровывать в другой массив и его просто отдавать в Select выделяя первый, ибо все браузеры работают с Select'ом по разному. |
Pedro Garciya Lopez,
исправил |
Большое человеческое спасибо!
Так действительно работает везде, забыл о том что атрибуты и свойства - разные вещи. я только начинаю осваивать jquery, и буду вам очень благодарен, если ответите еще на пару вопросов, это мне очень поможет в осмыслении :) вопоса три, и они комментами к строчкам, которые мне не понятны:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title> - jsFiddle demo by macmacins</title>
<script type='text/javascript' src='http://code.jquery.com/jquery-1.9.1.js'></script>
<script>
$(window).load(function(){
// чем отличается от $(document).ready(function() ?
var ops = $("#cityList option");
$("#Filter").on('input',function()
{
var search_str = this.value.toLowerCase(), conc;
$("#cityList option").remove();
ops.each(function(indx, element){
// не понял для чего в фунции описаны вот эти параметры (indx, element)
this.text.toLowerCase().indexOf(search_str)==0 && ($("#cityList").append($(this)))
// эта строка эквивалентна вот этой:
// if (this.text.toLowerCase().indexOf(search_str)==0) $("#cityList").append($(this))
// ?? и почему так работает? :)
});
conc = !$("#cityList option").size();
conc && $("#cityList").append($('<option value="-1">Совпадейний не найдено</option>'));
$("#cityList").prop("disabled", conc);
$("#cityList :selected").prop("selected", false);
$("#cityList option:first").prop("selected", true);
})
});
</script>
</head>
<body>
<input style="display: block" id="Filter">
<select id="cityList" size="8">
<option>Брянск</option>
<option>Житомер</option>
<option>Пенза</option>
<option>Бердянск</option>
</select>
</body>
</html>
еще раз большое спасибо! |
Цитата:
Цитата:
Цитата:
если первый операнд false второй неисполняется |
Спасибо! помогли разобраться, все предельно ясно.
|
| Часовой пояс GMT +3, время: 21:48. |