【问题标题】:Filter table list by date range from and to按从和到的日期范围过滤表列表
【发布时间】:2019-07-04 00:29:16
【问题描述】:

我想用namedate 过滤我的表列表:fromto 字段,名称可以正常工作,但日期从和到不能正常工作。

这是我的代码:

$(function(){
  //name part
  $("#name").on("keyup", function() {
    var value = $(this).val().toLowerCase();
    $("#my-table").find('tr').filter(function() {
      $(this).toggle($(this).find('td').text().toLowerCase().indexOf(value) > -1)
    });
  });
  
  //from part
  $("#from").bind("keyup change", function() {
    var value = $(this).val().toLowerCase();
    $("#my-table").find('tr').filter(function() {
      $(this).toggle($(this).find('td').text().toLowerCase()<(value))
    });
    
    //case if date is empty, we display all the list
    if(value.length === 0) {
      $("#my-table").find('tr').show();
    }
  });
  
  //to part
  $("#to").bind("keyup change", function() {
    var value = $(this).val().toLowerCase();
    $("#my-table").find('tr').filter(function() {
      $(this).toggle($(this).find('td').text().toLowerCase()>(value))
    });
  });
});
.container input {
    width:25%;
    display:inline-block;
    margin-bottom:20px;
}

.list-group {
  border:1px solid #eaeaea;
  padding:20px;
}

.list-group td, th {
  border:1px solid #eaeaea;
  padding:5px 50px;
  text-align:center;
}
<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>
</head>
<body>

<div class="container">
  Date from : <input class="form-control" id="from" type="date">
  to : <input class="form-control" id="to" type="date">
  <input class="form-control" id="name" type="text" placeholder="Search by name...">
  <br>
  <table>
      <thead>
          <tr>
              <th>Date</th>
              <th>Name</th>
          </tr>
      </thead>
      <tbody id="my-table">
        <tr class="list-group">
            <td >2015-01-01</td>
            <td>John</td>
        </tr>
        <tr class="list-group">
            <td>2015-01-30</td>
            <td>notif</td>
        </tr>
        <tr class="list-group">
            <td>2016-03-10</td>
            <td>food</td>
        </tr>
        <tr class="list-group">
            <td>2014-09-10</td>
            <td>yop</td>
        </tr>
        <tr class="list-group">
            <td>2017-12-30</td>
            <td>wick</td>
        </tr>
      </tbody>
  </table>
</div>

【问题讨论】:

  • 既然您使用的是引导程序,为什么不使用日期范围选择器?
  • 我没想到...
  • 您确实意识到您没有过滤日期 - 您正在过滤字符串。为了过滤日期,您需要使用日期,而不是“似乎是”日期的字符串。此外,您的代码存在各种问题。 .toggle() 方法使用不正确。 filter() 方法使用不正确。 text() 方法从找到的&lt;td&gt;s 的all 中返回文本。所以搜索的搜索文本如下所示:2015-01-01john - 看起来不太像日期。有很多工作要做。

标签: javascript jquery date filter


【解决方案1】:

您可以使用 momentjs 库来比较您的日期值。

moment($(this).find('td').text().toLowerCase(), 'YYYY/MM/DD')>(value)

$(function(){
  //name part
  $("#name").on("keyup", function() {
    var value = $(this).val().toLowerCase();
    $("#my-table").find('tr').filter(function() {
      $(this).toggle($(this).find('td').text().toLowerCase().indexOf(value) > -1)
    });
  });
  
  //from part
  $("#from").bind("keyup change", function() {
  
    var value = moment($(this).val().toLowerCase(), 'YYYY/MM/DD');
    $("#my-table").find('tr').filter(function() {
      $(this).toggle(moment($(this).find('td').text().toLowerCase(), 'YYYY/MM/DD')>(value))
    });
    
    //case if date is empty, we display all the list
    if(value.length === 0) {
      $("#my-table").find('tr').show();
    }
  });
  
  //to part
  $("#to").bind("keyup change", function() {
     var value = moment($(this).val().toLowerCase(), 'YYYY/MM/DD');
    $("#my-table").find('tr').filter(function() {
      $(this).toggle(moment($(this).find('td').text().toLowerCase(), 'YYYY/MM/DD')<(value))
    });
  });
});
.container input {
    width:25%;
    display:inline-block;
    margin-bottom:20px;
}

.list-group {
  border:1px solid #eaeaea;
  padding:20px;
}

.list-group td, th {
  border:1px solid #eaeaea;
  padding:5px 50px;
  text-align:center;
}
<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js" integrity="sha256-4iQZ6BVL4qNKlQ27TExEhBN1HFPvAvAMbFavKKosSWQ=" crossorigin="anonymous"></script>
</head>
<body>

<div class="container">
  Date from : <input class="form-control" id="from" type="date">
  to : <input class="form-control" id="to" type="date">
  <input class="form-control" id="name" type="text" placeholder="Search by name...">
  <br>
  <table>
      <thead>
          <tr>
              <th>Date</th>
              <th>Name</th>
          </tr>
      </thead>
      <tbody id="my-table">
        <tr class="list-group">
            <td >2015-01-01</td>
            <td>John</td>
        </tr>
        <tr class="list-group">
            <td>2015-01-30</td>
            <td>notif</td>
        </tr>
        <tr class="list-group">
            <td>2016-03-10</td>
            <td>food</td>
        </tr>
        <tr class="list-group">
            <td>2014-09-10</td>
            <td>yop</td>
        </tr>
        <tr class="list-group">
            <td>2017-12-30</td>
            <td>wick</td>
        </tr>
      </tbody>
  </table>
</div>

【讨论】:

  • 你好,谢谢你的回答,但它不能正常工作,例如如果我想从2016-01-01获取所有日期,所以我从2016-01-01输入结果是2014-09-10, 2015-01-30, 2015-01-01 而我应该有2016-03-10, 2017-12-30
  • 获取信息,你需要将&gt;&lt;替换为&gt;=&lt;=,其次,如果我需要2016-03-10,它不起作用,我从@987654334进入@ 到 11-03-2016 结果:2015-01-01, 2015-01-30, 2016-03-10, 2014-09-10
【解决方案2】:

希望这段代码能正常工作。

$(function() {
  //name part
  $("#name").on("keyup", function() {
    var value = $(this).val().toLowerCase();
    $("#my-table").find('tr').filter(function() {
      $(this).toggle($(this).find('td').text().toLowerCase().indexOf(value) > -1)
    });
  });


  $("#from,#to").bind('keyup change', function() {

    var val1 = moment($('#from').val().toLowerCase(), 'YYYY/MM/DD');
    var val2 = moment($('#to').val().toLowerCase(), 'YYYY/MM/DD');

    $("#my-table").find('tr').filter(function() {
      $(this).toggle((moment($(this).find('td').text().toLowerCase(),
        'YYYY/MM/DD') >= (val1) || !val1["_isValid"]) && (moment($(this).find('td').text()
        .toLowerCase(),
        'YYYY/MM/DD') <= (val2) || !val2["_isValid"]))
    });
    //console.log(val1["_isValid"], val2["_isValid"]);
  })


});
<!DOCTYPE html>
<html lang="en">

<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js" integrity="sha256-4iQZ6BVL4qNKlQ27TExEhBN1HFPvAvAMbFavKKosSWQ=" crossorigin="anonymous"></script>
  <style>
    .container input {
      width: 25%;
      display: inline-block;
      margin-bottom: 20px;
    }
    
    .list-group {
      border: 1px solid #eaeaea;
      padding: 20px;
    }
    
    .list-group td,
    th {
      border: 1px solid #eaeaea;
      padding: 5px 50px;
      text-align: center;
    }
  </style>
</head>

<body>

  <div class="container">
    Date from : <input class="form-control" id="from" type="date"> to : <input class="form-control" id="to" type="date">
    <input class="form-control" id="name" type="text" placeholder="Search by name...">
    <br>
    <table>
      <thead>
        <tr>
          <th>Date</th>
          <th>Name</th>
        </tr>
      </thead>
      <tbody id="my-table">
        <tr class="list-group">
          <td>2019-07-08</td>
          <td>John</td>
        </tr>
        <tr class="list-group">
          <td>2015-01-30</td>
          <td>notif</td>
        </tr>
        <tr class="list-group">
          <td>2016-03-10</td>
          <td>food</td>
        </tr>
        <tr class="list-group">
          <td>2014-09-10</td>
          <td>yop</td>
        </tr>
        <tr class="list-group">
          <td>2017-12-30</td>
          <td>wick</td>
        </tr>
      </tbody>
    </table>
  </div>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-08
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多