2010-01-08 38 views
6

Tengo algunos div en mi página (compilación con php + jquery) y deseo filtrarlos según sus atributos (si hay más de 1 filtrado de atributos, se reducirá el buscar). Los div's este aspecto:Múltiples filtros con Jquery

<div id="solicitacoes"> 
    <div id='1' title='Mike' status='18' analista='23'>Whatever content 1</div> 
    <div id='2' title='John' status='16' analista='46'>Whatever content 2</div> 
    <div id='3' title='Tom' status='2' analista='49'>Whatever content 3</div> 
    <div id='4' title='Mike' status='4' analista='23'>Whatever content 4</div> 
    <div id='5' title='Kate' status='3' analista='32'>Whatever content 5</div> 
    <div id='6' title='Steve' status='1' analista='14'>Whatever content 6</div> 
</div> 

Entonces, tengo una forma de filtrar los div's atributos:

<div id="filtros"> 
<form id="filtroSolicitacoes" type="post" name="filtroSolicitacoes"> 
Protocolo: <input type="text" name="filtroProtocolo" id="filtroProtocolo" size="5"/> 
Solicitante: <input type="text" name="filtroSolicitante" id="filtroSolicitante" size="10"/> 
Status: 
<select name="filtroStatus" id="filtroStatus"> 
<option value="0">-- Selecione Status--</option> 
<option value="3">Aguardando Aprova&ccedil;&atilde;o</option> 
<option value="18">Encaminhado</option> 
<option value="2">Iniciado</option> 
<option value="1">N&atilde;o Iniciado</option> 
<option value="4">Pendente de Esclarecimento</option> 
<option value="16">Reiniciado</option> 
<option value="6">Reprovado</option> 
</select> 
Analista: 
<select name="filtroAnalista" id="filtroAnalista"> 
    <option value="23">Robert</option> 
    <option value="46">Allan</option> 
    <option value="49">Edward</option> 
    <option value="32">Jake</option> 
    <option value="14">Stella</option> 
</select> 
<button type="submit" id="filtrar" style="float:right; margin-right:10px">:: Filtrar ::</button> 
</form> 
</div> 

Ahora, he hecho todavia la mayor parte de la parte jQuery y el filtro está funcionando ---> Pero Quiero limitar la búsqueda si HAY atributo más de 1 filtrado, NO a concatenarlo, y eso es Cómo pasando con mi código abajo:

$("#filtroSolicitacoes").submit(function() { 
    $("#solicitacoes > div").show(); 
    var filtroProtocolo = $("#filtroProtocolo").val(); 
    var filtroSolicitante = $("#filtroSolicitante").val().toUpperCase(); 
    var filtroStatus = $("#filtroStatus").val(); 
    var filtroAnalista = $("#filtroAnalista").val(); 
    var filtroResultado = $("#filtroResultado:checked").length; 

    var filtros = "[id=filtros]"; 

    if(filtroStatus !== "0"){ 
     filtros +=",[status='"+filtroStatus+"']"; 
    } 
    if(filtroProtocolo !== ""){ 
     filtros +=",[id='"+filtroProtocolo+"']"; 
    } 
    if(filtroSolicitante !== ""){ 
     filtros +=",[title*='"+filtroSolicitante+"']"; 
    } 
    if(filtroAnalista !== "0"){ 
     filtros +=",[analista='"+filtroAnalista+"']"; 
    } 

    if(filtros !== "[id=filtros]"){ 
     $("#solicitacoes > div:not("+filtros+")").hide(); 
    } 
    return false; 
}); 

he intentado utilizar "& &" en lugar de "" en

filtros +=",[analista='"+filtroAnalista+"']"; 

Pero Dejase't trabajo.

¿Alguna idea?

PD: Lo siento por mi mala Inglés, estoy :) brasileño

Respuesta

8

Se debe utilizar la función de filtro():

var filteredList = elements 
         .filter("[status=status1]") 
         .filter("[title*=something]"); 
// and so on 

En tu ejemplo:

$("#filtroSolicitacoes").submit(function() { 
    $("#solicitacoes > div").show(); 
    var filtroProtocolo = $("#filtroProtocolo").val(); 
    var filtroSolicitante = $("#filtroSolicitante").val().toUpperCase(); 
    var filtroStatus = $("#filtroStatus").val(); 
    var filtroAnalista = $("#filtroAnalista").val(); 
    var filtroResultado = $("#filtroResultado:checked").length; 

    var elements = $("[id=filtros]"); 

    if(filtroStatus !== "0"){ 
     elements = elements.filter("[status='"+filtroStatus+"']"); 
    } 
    if(filtroProtocolo !== ""){ 
     elements = elements.filter("[id='"+filtroProtocolo+"']"); 
    } 

    // and so on 

    $("#solicitatcoes > div").not(elements).hide(); 

    return false; 
}); 
+0

Pregunta idiota (lo sé, así que perdónenme de antemano): La función de filtro funciona a la inversa, por lo que var filtersList sería el div's que quiero mostrar, ¿verdad? ¿Entonces simplemente lo reemplazaría aquí? $ ("# solicitecódigos> div: no (" + filtros + ")"). Hide(); >> $ ("# soliciteclas> div: not (" + filteredList + ")"). Hide(); –

+0

Gracias Philippe !!!!!!!!!!!!!! –

+0

@ Philippe: ¡Le di un punto por su respuesta porque he estado buscando una solución para este mismo problema durante meses! ¡Gracias! – dac

2

Basta con retirar las comas.

Así que en lugar de:

filtros +=",[status='"+filtroStatus+"']"; 

Uso

filtros +="[status='"+filtroStatus+"']"; 

usted quiere que su parecerse a esta consulta resultante:

"[status=status][title*='whatever']" 

Además, la forma en la que está llamando ISN' t filtrándolo correctamente. Se trata de cómo iba a cambiar su función de hacer que funcione (Puede ver una working demo de su código, y play with it.):

$("#filtroSolicitacoes").submit(function() { 
    var filtroProtocolo = $("#filtroProtocolo").val(); 
    var filtroSolicitante = $("#filtroSolicitante").val().toUpperCase(); 
    var filtroStatus = $("#filtroStatus").val(); 
    var filtroAnalista = $("#filtroAnalista").val(); 
    var filtroResultado = $("#filtroResultado:checked").length; 

    var filtros = ""; 

    if(filtroStatus !== "0"){ 
     filtros +="[status='"+filtroStatus+"']"; 
    } 
    if(filtroProtocolo !== ""){ 
     filtros +="[id='"+filtroProtocolo+"']"; 
    } 
    if(filtroSolicitante !== ""){ 
     filtros +="[title*='"+filtroSolicitante+"']"; 
    } 
    if(filtroAnalista !== "0"){ 
     filtros +="[analista='"+filtroAnalista+"']"; 
    } 

    if(filtros !== ""){ 
     $("#solicitacoes > div").hide().filter(filtros).show(); 
    } else { 
     $("#solicitacoes > div").show(); 
    } 
    return false; 
}); 
+0

Hummm ... He intentado esto, pero también se concatenan ... –

+0

@Let He actualizado mi respuesta ... lo siento no se dio cuenta el uso de 'not' la primera vez. También agregué una demostración funcional del código final usando JSBin. –

+0

Thank's Doug ... ¡ambas soluciones funcionan bien! –

1

poner el nombre del atributo en cada elemento y la solución será más dinámico, sólo se necesita la "forma de datos" atributo para seleccionar los elementos correctos:

$("#filtroSolicitacoes").on("submit", function(){ 

    $("#solicitacoes div").show(); 

    var filter = ""; 

    $(this).find("[data-form]").each(function(){ 

     if($(this).val() != "") filter += ("[" + $(this).attr("data-form") + "='" + $(this).val() + "']"); 

    }); 

    if(filter.length > 0) $("#solicitacoes div").not(filter).hide(); 

    return false; 

}); 

jsfiddle

Cuestiones relacionadas