使用复选框搜索列将清除文本字段

时间:2015-05-27 22:49:44

标签: jquery datatables jquery-datatables

我有一个包含两列我希望过滤的表。一个输入是复选框和过滤器列(0),另一个输入是默认输入文本字段和过滤器列(4)。

使用复选框时遇到的问题是输入字段已清除。后端的输入过滤器不受影响(复选框值和原始输入值都被过滤)但文本被删除。

我在这里创建了一个小提琴http://jsfiddle.net/y8t9xmuu/

我也在下面输入了代码。尝试搜索“办公室”或“字段”,然后使用复选框。您会看到文本输入字段中的文本消失但不会更改过滤器。

$(function() {

  var oTable = $('#tTable').dataTable({
    "autoWidth": false,
    "order": [],
    "lengthChange": false,
    "paginate": false,
    //Initial Column search
    "searchCols": [{"search": "ABC"}, null, null, null, null, null], 
    "columnDefs": [{
        "orderable": false,
        "targets": [0, 1, 2, 3, 4]
      }, //Diasble sorting on certain columns
    ]
  });


  //Default Search
  $('.dataTables_filter input')
    .off()
    .on('keyup input', function(e) {
      oTable.api().column(4).search(this.value, false, true).draw();
    });

  //Checkboxes
  $('.options input:checkbox').change(function() {

    if (this.checked)
      oTable.api().column(0).search('ABC|XYZ', true, false).draw();
    else
      oTable.api().column(0).search('ABC', true, false).draw();

  });
});
.tTableWrap {
  display: inline-block;
  width:500px;
  font-size:11px;
}
.tHeader {
  padding: 5px;
  border: 1px solid black;
  text-align: center;
}
.options {
  height: 35px;
  border-bottom: 1px solid black;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="http://cdn.datatables.net/1.10.7/js/jquery.dataTables.min.js"></script>
<link href="http://cdn.datatables.net/1.10.7/css/jquery.dataTables.min.css" rel="stylesheet" />



<div class="tTableWrap">
  <div class="tHeader">Header</div>
  <div class="tMain">
    <div class="options">
      <div class="input">
        <input type="checkbox" id="sListCheck" class="listCheck" />
        <label for="sListCheck" unselectable="on">Include XYZ</label>
      </div>
    </div>
    <table id="tTable">
      <thead>
        <tr>
          <th>TYPE</th>
          <th>NAME</th>
          <th>NUMBER</th>
          <th>DESCRIPTION</th>
          <th>ASSIGNED</th>
          <th>DATE</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>ABC</td>
          <td>Joe</td>
          <td>123-456</td>
          <td>Clerk</td>
          <td>Office</td>
          <td>2011/04/25</td>
        </tr>
        <tr>
          <td>ABC</td>
          <td>John</td>
          <td>123-457</td>
          <td>Assistant</td>
          <td>Field</td>
          <td>2011/07/25</td>
        </tr>
        <tr>
          <td>XYZ</td>
          <td>Jane</td>
          <td>123-458</td>
          <td>Clerk</td>
          <td>Field</td>
          <td>2009/01/12</td>
        </tr>
        <tr>
          <td>XYZ</td>
          <td>Anne</td>
          <td>123-459</td>
          <td>Assistant</td>
          <td>Office</td>
          <td>2012/03/29</td>
        </tr>
      </tbody>
    </table>
  </div>
</div>

2 个答案:

答案 0 :(得分:0)

您正在覆盖DataTables搜索框的行为,并且可能会错过DataTables在幕后执行以保留值的内容。您重写的实现也使用search()的默认值,可以安全删除。删除后,代码工作正常。

请参阅this JSFiddle进行演示。

要禁用搜索某些列,请在列定义中使用'searchable': false,如下所示。

   var oTable = $('#tTable').dataTable({
        "autoWidth": false,
        "aaSorting": [],
        "bLengthChange": false,
        "bPaginate": false,
        "searchCols": [{ "search": "ABC" }, null, null, null, null, null], //Initial Column search
        "columnDefs": [
           // Diasble sorting on certain columns     
           { "sortable": false, "targets": [0, 1, 2, 3, 4] }, 
           // Diasble searching on certain columns     
           { "searchable": false, "targets": [1, 2, 3, 5] }
        ]
});

请参阅this JSFiddle进行演示。

答案 1 :(得分:0)

我通过使用&#34; dom&#34;禁用默认输入字段来实现它。并使用我自己的输入字段。在这里小提琴:http://jsfiddle.net/f95jg24c/

var oTable = $('#tTable').dataTable({
"dom": 'lrtip', //Remove the global filter (Default is 'lfrtip')

....

$('.customSearch input') //Change
    .off()
    .on('keyup input', function (e) {
       oTable.api().column(4).search(this.value, false, true).draw();
    });

<div class="customSearch">
  <label for="Search">Search: </label>
  <input id="Search"/>
</div>