jQuery表格模糊搜索

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>搜索功能</title>
  <link rel="stylesheet" href="https://www.jq22.com/jquery/bootstrap-4.2.1.css">
  <style>
    .content1 {
      width: 600px;
      height: 600px;

      display: inline-block;
      margin-top: 50px;
      margin-left: 100px;
    }

    .content2 {
      width: 600px;
      height: 600px;
      display: inline-block;

      margin-top: 50px;
      margin-left: 100px;

    }



    #lin {
      margin: 20px 0;
      height: 30px;
      padding: 5px;
      box-sizing: border-box;
    }

    .names {
      width: 300px;
      margin-bottom: 30px;
    }
  </style>
</head>

<body>



  <div class="content1">
    <!-- <input type="text" id="lin" placeholder="请输入需要搜索的内容"> -->
    <input type="text" class="form-control names" id="lin" placeholder="请输入需要搜索的内容">

    <table class="table table-striped table-bordered" id="table-1">
      <thead class="thead-dark">
        <tr>
          <th>姓名</th>
          <th>性别</th>
          <th>年龄</th>
          <th>电话</th>
          <th>地址</th>
        </tr>
      </thead>

      <tbody>

        <tr>
          <td>林兵</td>
          <td></td>
          <td>18</td>
          <td>12345678941</td>
          <td>富顺</td>
        </tr>
        <tr>
          <td>赖玉英</td>
          <td></td>
          <td>18</td>
          <td>12345678942</td>
          <td>南充</td>
        </tr>
        <tr>
          <td>潘旭</td>
          <td></td>
          <td>20</td>
          <td>12345678912</td>
          <td>富顺</td>
        </tr>
        <tr>
          <td>王威平</td>
          <td></td>
          <td>20</td>
          <td>97543152146</td>
          <td>广元</td>
        </tr>
        <tr>
          <td>李丹</td>
          <td></td>
          <td>30</td>
          <td>14725836910</td>
          <td>江安</td>
        </tr>
        <tr>
          <td>陈志樑</td>
          <td></td>
          <td>20</td>
          <td>31546287451</td>
          <td>富顺</td>
        </tr>
        <tr>
          <td>郭仕宏</td>
          <td></td>
          <td>20</td>
          <td>51240316845</td>
          <td>南充</td>
        </tr>
      </tbody>
    </table>
  </div>

  <div class="content2">

    <select class="form-control names" id="select">
      <option>请选择地址</option>
      <option>富顺</option>
      <option>南充</option>
      <option>广元</option>
      <option>江安</option>
      <option>成都</option>
      <option>内江</option>
    </select>
    <table class="table table-striped table-bordered" id="table-2">
      <thead class="thead-dark">
        <tr>
          <th>姓名</th>
          <th>性别</th>
          <th>年龄</th>
          <th>电话</th>
          <th>地址</th>
        </tr>
      </thead>

      <tbody>

        <tr>
          <td>林兵</td>
          <td></td>
          <td>18</td>
          <td>12345678941</td>
          <td>富顺</td>
        </tr>
        <tr>
          <td>赖玉英</td>
          <td></td>
          <td>18</td>
          <td>12345678942</td>
          <td>南充</td>
        </tr>
        <tr>
          <td>潘旭</td>
          <td></td>
          <td>20</td>
          <td>12345678912</td>
          <td>富顺</td>
        </tr>
        <tr>
          <td>王威平</td>
          <td></td>
          <td>20</td>
          <td>97543152146</td>
          <td>广元</td>
        </tr>
        <tr>
          <td>李丹</td>
          <td></td>
          <td>30</td>
          <td>14725836910</td>
          <td>江安</td>
        </tr>
        <tr>
          <td>陈志樑</td>
          <td></td>
          <td>20</td>
          <td>31546287451</td>
          <td>富顺</td>
        </tr>
        <tr>
          <td>郭仕宏</td>
          <td></td>
          <td>20</td>
          <td>51240316845</td>
          <td>南充</td>
        </tr>
      </tbody>
    </table>
  </div>

  <script src="https://www.jq22.com/jquery/jquery-1.10.2.js"></script>
  <script src="https://www.jq22.com/jquery/bootstrap-4.2.1.js"></script>
  <!-- <script src="lin_search.js"></script> -->
  <script>
    function Search(objId, inputId, color) {
      /* 方法说明
          此方法依赖于 jquery 开发的,必须先导入 jquery
          下拉框筛选时默认以第一个 option 的值 代表所有,即当选择第一个 option 时,返回所有数据,不进行搜索
     
        *@param{String} objId 需要被搜索内容表格的id或class
        *@param{String} inputId 搜索框的id或class || 下拉框的id或class
        *@param{String} color 搜索内容以什么颜色返回,不传默认为红色
       */



      // 表格搜索
      this.tableSearch = function () {
        $('#content-null').remove(); // 每次进入先移出掉上次搜索产生的tr
        this.objId.find('tr span').css({// 每次搜索开始,先把所有字体颜色恢复初始状态
          'color': "black",
          'font-weight': 'normal'
        });


        var tableTrTdContent = this.objId.find('tr td:contains("' + this.inpIdContents + '")'); // 获取所有含有搜索内容的td,类似于集合存储       
        if (this.inpIdContents != '') { // 如果搜索内容为空,就不用去更改样式,直接还原所有

          if (tableTrTdContent.length == 0) {// 判断集合长度是否为0,为0则表示搜索的内容在表格里不存在


            this.objId.find('tr:not(:eq(0))').css({ // 先将所有tr隐藏
              display: "none"
            })

            var tableColspanNumber = this.objId.find('tr').eq(0).find('th').length || this.objId.find('tr').eq(0).find('td').length; // 获取表头的列数 
            var tr = $(`
    <tr id="content-null">
    <td colspan='${tableColspanNumber}' style="text-align: center;">暂无你搜索的内容</td>
    </tr>
    `); // 创建搜索不到时,显示的tr
            this.objId.append(tr)
          } else if (tableTrTdContent.length > 0) {// 集合长度不为0,则表示搜索的内容在表格里
            // console.log("我在")
            // console.log(tableTrTdContent)

            $('#content-null').remove();

            this.objId.find('tr:not(:eq(0))').css({ // 先将所有tr隐藏
              display: "none"
            })


            for (var a = 0; a < tableTrTdContent.length; a++) {// 遍历找到的td集合,进行每个渲染颜色
              // console.log(tableTrTdContent[a].parentNode)
              tableTrTdContent[a].parentNode.style.display = "table-row"; // 让含有搜索内容的 tr 进行显示
              var contents = tableTrTdContent.eq(a).text(); // 获取到含有搜索内容的td里的集体内容,即字符串
              var contentsArr = contents.split(this.inpIdContents); // 以搜索框中的内容将td的值进行分割成数组
              var contentArrFirst = contentsArr[0]; // 将数组里的第一个值取出
              for (var j = 1; j < contentsArr.length; j++) {// 将分割出来的内容进行染色后重新组合在一起
                contentArrFirst += `<span style=';color:${this.color};font-weight:bolder'>` + this.inpIdContents + "</span>" + contentsArr[j];
              };
              tableTrTdContent.eq(a).html(contentArrFirst); // 将td里的值从新解析成html
              console.log(tableTrTdContent.length - 1)
            }


          }
        } else {
          this.objId.find('tr:not(:eq(0))').css({
            display: "table-row"
          });

          $('#content-null').remove();
        }


      }

      // 初始化,判断需要搜索标签的类型
      this.init = function () {
        this.color = color || 'red';
        console.log(this.color)
        if (typeof $ == "undefined") {// 判断是否引入 jquery
          throw new Error("该搜索功能依赖于jquery插件,需要引入jquery");
        }


        if (typeof objId[0] == "undefined") {// 判断是通过jquery获取的id还是原生获取的id,需要把原生的转换成jquery
          this.objId = $(objId); // 需要搜索的对象的id       

        } else {
          this.objId = objId; // 需要搜索的对象的id          

        }

        if (typeof inputId[0] == "undefined") {// 判断搜索框获取的方式,转换成jquery获取
          var inp = $(inputId);
        } else {
          var inp = inputId;
        }
        // console.log('inp',inp)
        // if (typeof inp == 'string' || typeof inp == 'number') { // 判断传来的是 input 标签,还是一个搜素内容
        //   this.inpIdContents = inp.trim()
        // } else {


        // }
        if (inp[0].tagName == "SELECT") { // 如果是以下拉框来筛选,则下拉框第一个选项为显示所有信息,即不搜索
          if (inp.val().trim() == inp.find('option:first').val()) {
            this.inpIdContents = '' // 搜索的内容为空
          } else {
            this.inpIdContents = inp.val().trim() // 获取搜索框里的值,去除首尾空格

          }

        } else {
          this.inpIdContents = inp.val().trim() // 获取搜索框里的值,去除首尾空格

        }
        // console.log(inp[0].tagName)
        // console.log(this.inpIdContents)
        // console.log(typeof inp)
        this.objType = this.objId[0].tagName; // 获取需要被搜索对象的标签类型,将jquey转化为原生js获取标签类型
        // console.log(this.objId.find("tr th").length)
        // if (this.objId.find("tr th").length == 0) {// 判断表格是否有表头,没有就创建错误信息
        //   throw new Error("你要搜索的表格没有表头 <th> 标签,请规范好表格");
        // }


        switch (this.objType) {// 判断搜索对象
          case 'TABLE': this.tableSearch(); break; // 对象是表格,进行表格搜索

        }
      }
      this.init()
    }
    //  表1
    $("#lin").on('keyup', function () {
      var table1 = $("#table-1");
      var input = $(this);
      new Search(table1, input)

    })
    // 表2
    $('#select').on('change', function () {
      var content = $('#select') // 下拉框
      var table2 = $('#table-2')
      new Search(table2, content, '#6332f6')
    })



  </script>




</body>

</html>

 

posted @ 2020-09-02 17:04  彬彬有礼丶林  阅读(267)  评论(0)    收藏  举报