【问题标题】:Make Regex only filter table based on a single column使正则表达式仅基于单个列过滤表
【发布时间】:2017-07-31 08:13:33
【问题描述】:

我制作了一个电话簿供内部使用。所有结果都显示在表格中。我以前只是将此作为我在该表上过滤的功能:

function LiveSearch() {
    $('input#srch-field').on('keyup', function () {
        var rex = new RegExp($(this).val(), 'i');
        $('.srch-table tr').hide();
        $('.srch-table tr').filter(function () {
            return rex.test($(this).text());
        }).show();
    });
}

但是我的用户显然对这个请求的功能不满意,所以他们想要一个过滤器。所以我做了一个应该像过滤器一样的下拉菜单。然后我在查看我的函数并在想“我怎样才能修改它,以使其工作大致相同?”,所以我想出了这个:

function LiveSearch() {
    $('input#srch-field').on('keyup', function () {
        var rex = new RegExp($(this).val(), 'i');
        var e = document.getElementById("srchFilter");
        var filter = e.options[e.selectedIndex].value;
        if (filter === 'all') {
            $('.srch-table tr').hide();
            $('.srch-table tr').filter(function () {
                return rex.test($(this).text());
            }).show();
        } else {
            $('.srch-table tr[id=' + filter + ']').hide();
            $('.srch-table tr[id=' + filter + ']').filter(function () {
                return rex.test($(this).text());
            }).show();
        }
    });
}

这个想法是我选择的每个值:

<div class="form-group">
    <select id="srchFilter" class="form-control">
        <option value="all" selected="selected">No Filter</option>
        <option value="name">Name</option>
        <option value="title">Title</option>
        <option value="department">Department</option>
        <option value="private-phone">Private Phone</option>
        <option value="work-email">Work Email</option>
        <option value="work-phone-land">Work Phone Landline</option>
        <option value="work-phone-mobile">Work Phone Mobile</option>
    </select>
</div>

对应于我表中的列 ID。但是,如果我的过滤器不是all,它根本不会进行任何过滤。我可能只是误解了正则表达式的工作原理。有人能解释一下吗?

编辑

我的表的代码作为请求:

<div class="col-lg-6" id="customtable">
    <table class="table table-striped" id="tablesorter">
        <thead>
            <tr>
                <th class="col-xs-4" id="name">
                    Name<span class="glyphicon glyphicon-filter"></span>
                </th>
                <th class="col-xs-4" id="title">
                    Title<span class="glyphicon glyphicon-filter"></span>
                </th>
                <th class="col-xs-4" id="department">
                    Department<span class="glyphicon glyphicon-filter"></span>
                </th>
                <th style="display: none;" id="private-phone">
                    Private Phone
                </th>
                <th style="display: none;" id="work-email">
                    Work Email
                </th>
                <th style="display: none;" id="work-phone-land">
                    Work Phone Landline
                </th>
                <th style="display: none;" id="work-phone-mobile">
                    Work Phone Mobile
                </th>
            </tr>
        </thead>
        <tbody class="srch-table" id="srch-table">
            <tr>
                <td class="col-xs-12"><b>Please Wait...</b></td>
            </tr>
        </tbody>
    </table>
    <div class="fl-separator"></div>
</div>

【问题讨论】:

  • 请分享您的表格代码。
  • @31piy 我已经添加了 :)

标签: javascript jquery livesearch


【解决方案1】:

请注意,您正在为表格元素分配重复的 ID(正如我从您的 JavaScript 代码中嗅出的那样)。 ID 在 HTML 页面中应该是唯一的,这就是您的过滤器无法按预期工作的原因。

您可以尝试分配一个类(或者建议使用 HTML 数据属性)。因此,例如,与 name 相关的 td 将有一个类 name 而不是 id name

然后,可以像这样更改您的 JavaScript 代码,以便它可以利用 classes 而不是 ids:

// ... code truncated for brevity

if (filter === 'all') {
  $('.srch-table tr').hide();
  $('.srch-table tr').filter(function () {
    return rex.test($(this).text());
  }).show();
} else {
  $('.srch-table tr').hide();
  $('.srch-table tr').filter(function () {
    return rex.test($(this).find('td.' + filter).text());
  }).show();
}

// ... code truncated for brevity

注意点选择器的使用与trs 匹配,而tds 仅具有指定类。

奖励:由于您使用的是 jQuery,因此这些行:

var e = document.getElementById("srchFilter");
var filter = e.options[e.selectedIndex].value;

可以简单地用这一行代替:

var filter = $("#srchFilter").val();

更新

This 是你的小提琴的一个分叉版本。

【讨论】:

  • 那么当我制作这些类时,我是否必须将它们放在我的行上?它们是用另一个 javascript 函数制作的。
  • @Vipar -- 由于表格列包含具体的细节,而row是列的集合,需要在tds上应用类。
  • 这并不完全正确。例如,当我选择“部门”,然后写“IT”时,我可以看到它似乎在移动行值,使表格完全无法使用:/
  • @Vipar -- 你能创建一个工作小提琴之类的吗?考虑它无法正常工作的所有可能性太麻烦了。
  • 我尝试设置一个示例,但由于某种原因它不会听我的文本字段:/ jsfiddle.net/5pkaxdnu/4
猜你喜欢
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多