2010-01-08 10 views
6

У меня есть некоторые div на моей странице (сборка с php + jquery), и я хочу их фильтровать в соответствии с их атрибутами (если есть более 1 фильтра атрибутов, чем это сужает поиск). В div's выглядеть следующим образом:Несколько фильтров с 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> 

Тогда у меня есть форма для фильтрации div's атрибуты:

<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> 

Теперь I've сделано большинство настроек уже детали Jquery и фильтр работает ---> Но я хочу сужать поиск, если there's атрибут более чем 1 фильтрация, НЕ сцепить его и that's происходит с как там мой код ниже:

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

I've пытался использовать "& &" вместо "" в

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

Но didn't работу.

любые идеи?

PS: Извините за мой плохой английский, I'm бразильские :)

ответ

8

Вы должны использовать функцию фильтра():

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

В ваш пример:

$("#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

Идиотический вопрос (я знаю, так простите меня заранее): Функция фильтра работает наоборот, поэтому var filterList будет div, который я хочу показать, не так ли? Так что я просто заменил бы его здесь? $ ("# solicitacoes> div: not (" + filtros + ")"). Hide(); >> $ ("# solicitacoes> div: not (" + filterList + ")"). Hide(); –

+0

Спасибо Филиппу !!!!!!!!!!!!!! –

+0

@ Philippe - Я дал вам точку для вашего ответа, потому что я искал решение этой проблемы в течение нескольких месяцев! Благодаря! – dac

2

Просто удалите запятые.

Таким образом, вместо:

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

Использование

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

Вы хотите, чтобы Ваш полученный запрос выглядеть следующим образом:

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

Кроме того, как вы вызываете его ISN» t фильтруя его правильно. Это, как я хотел бы изменить свою функцию, чтобы заставить его работать (Вы можете просмотреть working demo вашего кода, и 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 ... I've попытался это, но она также сцепляются его ... –

+0

@Let Я обновил свой ответ ... извините не заметил, использование 'not' первый раз через. Я также добавил рабочую демонстрацию готового кода с помощью JSBin. –

+0

Спасибо Doug ... и ваши решения работают нормально! –

1

Поместите имя атрибута каждого элемента и решение будет более динамичным, он должен только «данные-формы» атрибут, чтобы выбрать правильные элементы:

$("#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

Смежные вопросы