[Jquery-Es] Filtrado de elementos y sus complementarios

Choan Gálvez choan.galvez en gmail.com
Sab Jun 7 05:15:24 PDT 2008


Hola.

On 06/06/2008, at 20:21, stripTM wrote:

> Imaginamos que tenemos ul conjunto de elementos y a un grupo de  
> ellos les quiero hacer una cosa y a los restantes otra diferente.
> Por ejemplo en una lista quiero ocultar los que tienen un  
> class="maldito" y mostrar el resto.
> <ul>
>   <li class="maldito">1</li>
>   <li class="maldito">2</li>
>   <li>3</li>
>   <li>4</li>
>   <li class="maldito">5</li>
>   <li>6</li>
> </ul>
>
> Para ello estoy utilizando
> $("ul li")
>   .filter(".maldito")
>       .hide()
>       .end()
>   .not(".maldito")
>       .hide();
>
> Quizás el selector no sea tan sencillo y estoy haciendo currar al  
> programa dos veces para lo mismo.
>
> Lo que me pregunto es ¿es optimo? ¿existe algún 'filtro' que  
> devuelva los complementarios o técnica que lo mejor?

No hasta donde yo sé. Pero siempre puedes montártelo al gusto.

En este caso, lo suyo sería realizar una sola iteración en el filtrado  
y aplicación del callback, ¿no?

Se me ocurre pues que podrías escribir la cosa como

     $('ul li')
       .each(function() {
         var $el = $(this);
         if ($el.is('.maldito'))
           $el.unaCosa();
         else
           $el.otraCosa()
       });

Y si quieres idiomatizarlo/pluginizarlo, la cosa podría quedar en algo  
así:

     $.fn.split = function(selector, fn1, fn2) {
       return this.each(function() {
         if ($(this).is(selector))
           fn1.call(this);
         else
           fn2.call(this);
       });
     };

Y el uso:

     $('ul li')
       .split(
         '.maldito',
         function() { $(this).unaCosa(); },
         function() { $(this).otraCosa(); }
       );

Ahora, ni idea de cómo resultará esto en eficiencia.

(Me está viniendo a la cabeza que en los primeros tiempos de jQuery  
alguien hizo un plugin jif/jelse con un objetivo similar).


Salud.
-- 
Choan Gálvez
<choan.galvez en gmail.com>
<http://choangalvez.nom.es/>



Más información sobre la lista de distribución Jquery-Es