2012-08-14 19 views
6

Estoy tratando de contar el número de opciones en una lista. Sin embargo, algunas de las opciones se han ocultado debido al texto de búsqueda ingresado en un cuadro de entrada.Cuenta el número de opciones en una lista

Comencé a buscar en .size() y .length pero solo obtenía la lista completa en lugar de las que no estaban ocultas. Para simplificar, lo he cambiado para tratar de encontrar las opciones ocultas (puedo usar: no más tarde).

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

También he intentado: console.log ('opción # selContactLists: oculto' $()); Nunca consigo el número que estoy esperando. ¿Alguien puede ver dónde me estoy equivocando?

Aún más extraño, es que si cambio el "tamaño" de la selección para que se muestre más de un elemento por defecto, en cromo nunca oculta ninguna de las opciones.

+0

¿También puede publicar un ejemplo de HTML? – Stefan

+0

Nota lateral sobre 'size()' porque lo ha mencionado. Ha sido marcado como depravado. De los documentos: 'El método .size() es funcionalmente equivalente a la propiedad .length; sin embargo, se prefiere la propiedad .length porque no tiene la sobrecarga de una llamada de función. (http://api.jquery.com/size/) – Nope

+0

¿En qué se ocultan las opciones o se muestran? –

Respuesta

3

Esto funciona para mí, pero es posible que desee agregar y quitar manualmente la pantalla css: ninguno de los elementos, en lugar de utilizar mostrar/ocultar, por razones de compatibilidad ...

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

Casi ignoro tu respuesta, parecía demasiado fácil. Estaba equivocado.¡Bien hecho y gracias! – David

3

Use el selector :visible de jQuery.

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

Hola James, esto siempre vuelve con cero. Usé .hide() para ocultarlos de la vista en primer lugar, pero en un ejemplo donde la lista se ha filtrado de 3 opciones a 2, sigo obteniendo 0 – David

+0

@David, publique su marcado. Mejor aún, pon un ejemplo [fiddle] (http://jsfiddle.net) juntos para nosotros. –

+0

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

1

Un enfoque que parece que funciona es la siguiente, a pesar de que hace trampa, en cierta medida, mediante la asignación de las opciones que están ocultos, y se muestra, para las variables y luego mediante la propiedad .length de esas variables:

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

Tenga en cuenta que lo anterior es una reescritura relativamente grande de su código original. He usado algunos caché de selectores para reducir el número de veces que se accede al DOM desde el método keyup y, actualmente, debido a los métodos .toLowerCase(), esta es una búsqueda que no distingue entre mayúsculas y minúsculas, y también cambia el selectedIndex al primero de las opciones no ocultas (en Chromium esto parecía ser necesario para permitir que one se oculte mientras se mostraba en el select mientras se escribe t).

+0

Esto todavía no funciona para mí. Recibo recuentos incorrectos tanto para los mostrados como para los ocultos. Todos los intentos anteriores producen resultados diferentes en cada navegador. Creo que el almacenamiento de las opciones en una matriz separada y luego rellenar o eliminar los elementos es el camino a seguir. Traté de aumentar el tamaño del cuadro de selección también para que se muestre más de un elemento a la vez y en este caso ninguno de los elementos está oculto. Creo que ocultar no es una buena idea, la eliminación es la respuesta. He respondido +1 en su respuesta, ya que no está del todo bien (al menos para mí), pero me ha colocado en el camino correcto. – David

Cuestiones relacionadas