【问题标题】:Multiple filters with Jquery使用 Jquery 的多个过滤器
【发布时间】:2011-01-03 01:01:45
【问题描述】:

我的页面中有一些 div(使用 php+jquery 构建),我想根据它们的属性过滤它们(如果有超过 1 个属性过滤,那么它会缩小搜索范围)。 div 看起来像这样:

<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 的属性:

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

现在,我已经完成了大部分 Jquery 部分并且过滤器正在工作 ---> 但是 如果有超过 1 个过滤属性,我想缩小搜索范围,而不是连接它,这就是我的代码所发生的事情 如下:

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

我尝试在

中使用“&&”而不是“,”
filtros +=",[analista='"+filtroAnalista+"']";

但它没有用。

有什么想法吗?

PS:对不起我的英语不好,我是巴西人:)

【问题讨论】:

    标签: jquery filtering


    【解决方案1】:

    只需删除逗号。

    所以而不是:

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

    使用

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

    您希望生成的查询如下所示:

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

    此外,您调用它的方式没有正确过滤它。这就是我将如何更改您的功能以使其工作的方式(您可以查看代码的working demoplay 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;
    });
    

    【讨论】:

    • @让我更新了我的答案...抱歉,第一次没有注意到not 的使用。我还使用 JSBin 添加了完成代码的工作演示。
    【解决方案2】:

    你应该使用 filter() 函数:

    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;
    });
    

    【讨论】:

    • 愚蠢的问题(我知道,所以请提前原谅我):过滤器功能相反,所以 var filteredList 将是我想要显示的 div,对吧?所以我会在这里替换它? $("#solicitacoes > div:not("+filtros+")").hide(); >> $("#solicitacoes > div:not("+filteredList +")").hide();
    • @Philippe--我给了你一个答案,因为几个月来我一直在寻找解决同样问题的方法!谢谢!
    【解决方案3】:

    把属性的名字放在每个元素上,解决方案会更加动态,只需要“data-form”属性就可以选择正确的元素:

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

    【讨论】:

      猜你喜欢
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      相关资源
      最近更新 更多