Jquery按两个值过滤

时间:2016-01-14 07:29:36

标签: javascript jquery html

这次我遇到了jQuery过滤问题。

$( document ).ready(function() {
    $('#search').keyup(function() {
         var s = new RegExp(this.value);
         $('#support-tasks-table tbody tr').each(function() {
             if(s.test(this.cells[8].innerHTML))
                 $(this).show();
             else $(this).hide();
         });
    });
    $('select#sel-supporttask-projects').change(function() {
        var s = new RegExp(this.value);
        $('#support-tasks-table tbody tr').each(function() {
            if(s.test(this.cells[3].innerHTML)) $(this).show();
            else $(this).hide();
        });
    });
})

每个功能都按单元格值隐藏或显示表格,并且工作正常。但是当我在搜索上设置了一些内容之后,我选择了select中的选项,它忽略了tr隐藏并从表中的所有tr中搜索。是否有任何简单的方法可以将此代码更改为只显示tr'

1 个答案:

答案 0 :(得分:3)

简单的答案是将:visible添加到选择器:

$('select#sel-supporttask-projects').change(function() {
    var s = new RegExp(this.value);
    $('#support-tasks-table tbody tr:visible').each(function() {
        if(s.test(this.cells[3].innerHTML)) $(this).show();
        else $(this).hide();
    });
});

但它突出了一个设计缺陷:如果你选择一个不同的选项,你会想要一些以前看不见的答案变得可见。

基本上,您需要一个包含搜索过滤器的searchParameters类:

var searchParameters = {
    supportTask: null,
    searchRegex: null
};

function shouldRowBeVisible(row) {
   if(searchParameters.supportTask) {
      if(!(searchParameters.supportTask.test(row.cells[3].innerHTML))) {
          return false;
       }
   }
   if(searchParameters.searchRegex) {
                if(!(searchParameters.searchRegex.test(row.cells[3].innerHTML))) {
          return false;
       }
   }
   return true;
}


function updateVisibility() {
   $('#support-tasks-table tbody tr').each(function() {
       if(shouldRowBeVisible(this) {
         $(this).show();
       } else {
         $(this).hide();
       }
    });
}

 $('#search').keyup(function() {
     searchParameters.searchRegex = new RegExp(this.value);
     updateVisibility();
});
$('select#sel-supporttask-projects').change(function() {
    searchParameters.supportTask = new RegExp(this.value);
    updateVisibility();
});