[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