2012-08-14 9 views
6

Próbuję policzyć liczbę opcji na liście. Niektóre opcje zostały jednak ukryte z powodu wpisania tekstu do pola wprowadzania.Policz liczbę opcji na liście

Zacząłem patrząc .size() i .length ale tylko coraz pełną listę aniżeli te, które nie zostały ukryte. Aby uprościć, zmieniłem go, aby spróbować znaleźć ukryte opcje (mogę użyć: nie później).

$('#txtListSearch').keyup(function(evt) { 
    if($(this).val().length < 1) { 
     $('#selContactLists option').show(); 
    } else { 
     $('#selContactLists option:not(:contains("' + $(this).val() + '"))').hide(); 

     if($('#selContactLists').size()) { 
      $('#selContactLists option:contains("' + $(this).val() + '")').first().attr('selected', 'selected');     
     } else { 
     } 
    } 
    console.log($('#selContactLists option').filter(':hidden')); 
}); 

Próbowałem również: console.log ($ ('# selContactLists opcja: hidden')); Nigdy nie dostaję liczby, której się spodziewam. Czy ktoś może zobaczyć, gdzie idę źle?

Jeszcze bardziej dziwne jest to, że jeśli zmienię „wielkość” select tak, że więcej niż jeden element jest domyślnie wyświetlane na chromie nie ukrywa żadnej z opcji.

+0

Czy możesz również zamieścić przykład HTML? – Stefan

+0

Boczna uwaga dotycząca 'size()' powoduje, że je wprowadziłeś. Został oznaczony jako pozbawiony danych. Z dokumentacji: 'Metoda .size() jest funkcjonalnie równoważna właściwości .length; Jednak właściwość .length jest preferowana, ponieważ nie ma narzutów wywołania funkcji. "(http://api.jquery.com/size/) – Nope

+0

Na jakiej podstawie opcje ukrywają się lub pokazują? –

Odpowiedz

3

Działa to dla mnie, ale może chcesz ręcznie dodawać i usuwać wyświetlacz css: żaden z elementów, zamiast korzystania pokazać/ukryć, ze względu na kompatybilność ...

alert($('#selContactLists option:not([style*=none])').length); 
+1

Niemal zignorowałem twoją odpowiedź, wydawało się to zbyt łatwe. Myliłem się.Dobra robota i dzięki! – David

3

Użyj selektora jQuery's :visible.

$('#selContactLists option:visible').length; 
+1

Cześć James, to zawsze wraca z zerem. Użyłem .hide(), aby ukryć je przed wzrokiem, ale w przykładzie, w którym lista została przefiltrowana z 3 opcji w dół do 2, nadal otrzymuję 0 – David

+0

@David, opublikuj swój znacznik. Nawet lepiej, zrób dla nas przykład [skrzypiec] (http://jsfiddle.net). –

+0

http://jsfiddle.net/kcRUB/3/ – David

1

Jedno podejście, które wydaje się działać jest następujący, choć zdradza, nieco, przypisując opcje, które są ukryte i widoczne, do zmiennych, a następnie za pomocą właściwości .length tych zmiennych:

$('#txtListSearch').keyup(
    function(e) { 
     var val = $(this).val().toLowerCase(), 
      sel = $('#selContactLists'); 
     if (val.length < 1) { 
      sel.find('option').show(); 
     } 
     else { 
      var shown = sel.find('option').filter(

       function() { 
        return $(this).text().toLowerCase().indexOf(val) !== -1; 
       }).show().first().prop('selected',true), 
       hidden = sel.find('option').filter(

       function() { 
        return $(this).text().toLowerCase().indexOf(val) == -1; 
       }).hide(); 
      console.log(shown.length, hidden.length); 
     } 
    });​ 

JS Fiddle demo.

Należy pamiętać, że powyższe jest stosunkowo dużym ponownym zapisaniem oryginalnego kodu. Użyłem trochę buforowanie selektorów, aby zmniejszyć liczbę razy DOM jest dostępne od wewnątrz metody keyup, a obecnie, z powodu metod .toLowerCase() to poszukiwanie wielkości liter, a także przesuwa selectedIndex do pierwszego niewidoczne opcje (w Chromium to wydawało się być wymagane, aby umożliwić ukrycie one, gdy zostało to pokazane w select podczas pisania t).

+0

To nadal nie działa dla mnie. Otrzymuję niepoprawne liczby dla pokazanych i ukrytych. Wszystkie powyższe próby dają różne wyniki w każdej przeglądarce. Myślę, że przechowywanie opcji w osobnej tablicy, a następnie zapełnianie lub usuwanie elementów jest drogą do zrobienia. Próbowałem zwiększać rozmiar pola wyboru, więc więcej niż jeden element jest wyświetlany w tym samym czasie iw tym przypadku żaden z elementów nie jest ukryty. Myślę, że ukrywanie nie jest dobrym pomysłem, usunięcie jest odpowiedzią. Dałem +1 Twojej odpowiedzi, ponieważ nie jest to właściwe (przynajmniej dla mnie), ale ustawiło mnie na właściwej ścieżce. – David

Powiązane problemy