2012-08-14 15 views
6

Ich versuche, die Anzahl der Optionen in einer Liste zu zählen. Einige der Optionen wurden jedoch aufgrund des in ein Eingabefeld eingegebenen Suchtextes ausgeblendet.Zählen Sie die Anzahl der Optionen in einer Liste

Ich begann mit der Suche nach .size() und .length, bekam aber nur die vollständige Liste und nicht die, die nicht versteckt waren. Um zu vereinfachen, habe ich es geändert, um zu versuchen, die versteckten Optionen zu finden (ich kann verwenden: nicht später).

$('#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')); 
}); 

Ich habe auch versucht: console.log ($ ('# selContactLists Option: versteckt')); Ich bekomme nie die Nummer, die ich erwarte. Kann jemand sehen, wo ich falsch liege?

Noch seltsamer ist, dass, wenn ich die "Größe" der Auswahl ändern, so dass mehr als ein Element standardmäßig angezeigt wird, auf Chrome nie eine der Optionen versteckt.

+0

können Sie auch ein HTML-Beispiel posten? – Stefan

+0

Side-Note auf 'size()', weil du es gefunden hast. Es wurde markiert. Aus der Dokumentation: 'Die .size() -Methode entspricht funktionell der Eigenschaft .length; Die .length-Eigenschaft wird jedoch bevorzugt, da sie nicht den Overhead eines Funktionsaufrufs hat. "(http://api.jquery.com/size/) – Nope

+0

Auf welcher Basis verbergen oder zeigen die Optionen? –

Antwort

3

Dies funktioniert für mich, aber möchten Sie vielleicht die CSS-Anzeige manuell hinzuzufügen und zu entfernen: keine von den Elementen, statt ein-/ausblenden verwenden, aus Kompatibilitätsgründen ...

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

Ich habe deine Antwort fast ignoriert, es schien zu einfach. Ich habe mich geirrt.Gut gemacht und danke! – David

3

Verwenden Sie jQuerys :visible Selektor.

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

Hallo James, das kommt immer mit Null zurück. Ich habe .hide() verwendet, um sie vor der Ansicht zu verbergen, aber in einem Beispiel, in dem die Liste von 3 Optionen auf 2 gefiltert wurde, bekomme ich immer noch 0 – David

+0

@David, poste dein Markup. Noch besser, werfen Sie ein Beispiel [Geige] (http://jsfiddle.net) für uns zusammen. –

+0

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

1

Ein Ansatz, der zu arbeiten scheint, ist die folgende, obwohl es betrügt, etwas, indem sie die Optionen zuweisen, die versteckt sind und gezeigt, auf Variablen und dann mit der .length Eigenschaft dieser Variablen:

$('#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.

Bitte beachten Sie, dass das oben genannte eine relativ große Umschreibung Ihres ursprünglichen Codes ist. Ich habe etwas Caching von Selektoren verwendet, um die Anzahl der Zugriffe auf das DOM von innerhalb der keyup Methode zu reduzieren, und derzeit wegen der .toLowerCase() Methoden ist dies eine Suche ohne Berücksichtigung der Groß- und Kleinschreibung, und verschiebt auch die auf die erste die nicht versteckten Optionen (in Chrom schien dies erforderlich zu sein, um one zu verbergen, während es in der select während der Eingabe t gezeigt wurde).

+0

Das funktioniert immer noch nicht für mich. Ich erhalte falsche Zählungen für sowohl angezeigt als auch ausgeblendet. Alle oben genannten Versuche führen zu unterschiedlichen Ergebnissen in jedem Browser. Ich denke, die Speicherung der Optionen in einem separaten Array und dann das Bestücken oder Entfernen der Elemente ist der Weg zu gehen. Ich habe versucht, die Größe der Auswahlbox auch so zu erhöhen, dass mehr als ein Element gleichzeitig angezeigt wird, und in diesem Fall ist keines der Elemente ausgeblendet. Ich denke, Verstecken ist keine gute Idee, Entfernung ist die Antwort. Ich habe deine Antwort gegeben, da es nicht ganz richtig ist (zumindest für mich), aber es hat mich auf den richtigen Weg gebracht. – David

Verwandte Themen