【问题标题】:How to limit search 'text input' results to return only those in selected 'category' filter drop down如何限制搜索“文本输入”结果仅返回选定“类别”过滤器下拉列表中的结果
【发布时间】:2020-05-29 19:38:19
【问题描述】:

我从这个论坛收集了一个脚本来帮助我从一个相当复杂的表格中过滤搜索结果。我希望用户能够 1. 选择类别并 2. 使用文本输入字段搜索表格。

我让这两个功能单独工作,但我希望搜索功能(文本输入)仅显示按所选类别类型过滤的结果。目前,搜索功能会覆盖类别输入并显示所有表行中的任何表行,而不考虑类别。

例如,在下面的代码中,我想将类别设置为“全部”并搜索 Taylor,返回 2 个结果。我还希望能够选择类别 3 并搜索 Taylor 并仅收到 1 个结果。

有人可以帮帮我吗? 谢谢!

<div class="container">

    <h2>Finder</h2>

     <div class="step1">
        <p>Show category:</p>
     </div>

     <select type="search" class="select-table-filter" data-table="order-table" id="searchInput">
        <option value="">All</option>  
        <option value="1">1</option>  
        <option value="2">2</option>  
        <option value="3">3</option>  
     </select>

<input type="search" class="light-table-filter" data-table="order-table" placeholder="Search ..." />
<table class="order-table" id="myTable">
   <thead>
      <tr class="header">
        <th>Category</th>
        <th>Name</th>
        <th>Last Name</th>
        <th>Phone</th>
        <th>Email</th>
      </tr>
    </thead>
    <tbody>
     <tr>
         <td>1</td>
         <td>Taylor</td>
         <td>Swift</td>
         <td>1234 5678</td>
         <td>taytay@gmail.com</td>
     </tr>
     <tr>
         <td>2</td>
         <td>John</td>
         <td>Smith</td>
         <td>1234 5678</td>
         <td>johnnyboy@gmail.com</td>
     </tr>
    <tr>
         <td>3</td>
         <td>Jane</td>
         <td>Doh</td>
         <td>1234 5678</td>
         <td>dohnut@gmail.com</td>
     </tr>
    <tr>
         <td>3</td>
         <td>Taylor</td>
         <td>Doh</td>
         <td>1234 5678</td>
         <td>td@gmail.com</td>
     </tr>
   </tbody>
</table>

这是我的脚本:

(function(document) {
'use strict';

var LightTableFilter = (function(Arr) {

var _input;
var _select;

    /***** FUNCTION FOR SEARCH INPUT *****/
    function _onInputEvent(e) {
        _input = e.target;
        var tables = document.getElementsByClassName(_input.getAttribute('data-table'));
        Arr.forEach.call(tables, function(table) {
            Arr.forEach.call(table.tBodies, function(tbody) {
                Arr.forEach.call(tbody.rows, _filter);
            });
        });
    }




    /***** INPUT CODE TO SEARCH ONLY FIRST COLUMN *****/
    function _onSelectEvent(e) {
          var input, filter, table, tr, td, i, txtValue;
      input = document.getElementById("searchInput");
      filter = input.value.toUpperCase();
      table = document.getElementById("myTable");
      tr = table.getElementsByTagName("tr");
      for (i = 0; i < tr.length; i++) {
        td = tr[i].getElementsByTagName("td")[0];
        if (td) {
          txtValue = td.textContent || td.innerText;
          if (txtValue.toUpperCase().indexOf(filter) > -1) {
            tr[i].style.display = "";
          } else {
            tr[i].style.display = "none";
          }
        }       
      }
    }


    function _filter(row) {

        var text = row.textContent.toLowerCase(), val = _input.value.toLowerCase();
        row.style.display = text.indexOf(val) === -1 ? 'none' : 'table-row';

    }


    return {
        init: function() {
            var inputs = document.getElementsByClassName('light-table-filter');
            var selects = document.getElementsByClassName('select-table-filter');
            Arr.forEach.call(inputs, function(input) {
                input.oninput = _onInputEvent;
            });
            Arr.forEach.call(selects, function(select) {
                select.onchange  = _onSelectEvent;
            });
                }
            };
        })(Array.prototype);

        document.addEventListener('readystatechange', function() {
            if (document.readyState === 'complete') {
                LightTableFilter.init();
            }
        });


        })(document);

【问题讨论】:

    标签: javascript search filter html-table


    【解决方案1】:

    试试这个:

    function _filter(row) {
                var input = document.getElementById("searchInput");
                var category = row.getElementsByTagName('td')[0].textContent;
                var filter = input.value.toUpperCase();
                var text = row.textContent.toLowerCase(), val = _input.value.toLowerCase();
                row.style.display = text.indexOf(val) === -1 ? 'none' : ((filter === '' || category === filter) && 'table-row');
    }
    

    【讨论】:

    • 哇,谢谢外安!太棒了!如果用户在搜索中更改类别,您知道是否有办法清除搜索“文本输入”?目前,您可以在搜索框中保留文本的情况下更改类别,它看起来好像仍在使用文本输入和类别进行过滤,但事实并非如此。
    • @Nic 在函数 _onSelectEvent(e) 中,可以添加清除“文本输入”值的方法
    • 谢谢您-我无法确切地弄清楚,但是它使我朝着正确的方向应用了 onclick="document.getElementById('myID').value = '' " 这已经奏效到目前为止足够一周;)
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 2023-03-26
    • 2018-12-10
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    相关资源
    最近更新 更多