2017-08-11 134 views
0

我在使用jQuery DataTables Individual Column Searching,在我的一個表格上,其中一個列包含複選框。jQuery DataTables搜索欄是一個複選框

HTML

<table id="NewTable" class="table table-bordered table-striped"> 
    <thead> 
     <tr> 
      <th class="col-sm-1 text-center "> 
       @Html.DisplayNameFor(model => model.c_AMake.AMake) 
      </th> 
      <th class="text-center col-sm-1"> 
       @Html.DisplayNameFor(model => model.Model) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.Test) 
      </th> 
     </tr> 
    </thead> 
    <tfoot id="NewTable-Foot" style="display: table-header-group"> 
     <tr> 
      <th class="col-sm-1 text-center "> 
       @Html.DisplayNameFor(model => model.c_AMake.AMake) 
      </th> 
      <th class="text-center col-sm-1"> 
       @Html.DisplayNameFor(model => model.Model) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.Test) 
      </th> 
     </tr> 
    </tfoot> 
    @foreach (var item in Model) 
    { 
     <tr> 
      <td> 
       @Html.DisplayFor(modelItem => item.c_AMake.AMake) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => item.Model) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => item.Test) 
      </td> 
     </tr> 
    } 
</table> 

jQuery的

var newTable = $('#NewTable tfoot th').length; 

// Setup - add a text input to each footer cell 
$("#NewTable tfoot th").each(function (index) { 
    if (index !== newTable - 1) { 
     var title = $(this).text().trim(); 
     $(this).html('<input type="text" class="form-control" placeholder="' + title + '"/>'); 
    } 
}); 

var newDTTable = $('#NewTable').DataTable(); 

newDTTable.columns().every(function() { 
    var that = this; 
    console.log(this.data()); 
    $('input', this.footer()).on('keyup change', 
     function() { 
      if (that.search() !== this.value) { 
       that 
        .search(this.value) 
        .draw(); 
      } 
     }); 
}); 

這顯示我所說的,像這樣的列:

enter image description here

但是,如果我開始在文本框中輸入「True」,我的表刷新爲「找不到匹配的記錄」。不夠公平,因爲複選框在HTML渲染方面的值不是「true」,而只是說「checked =」選中了「。

但作爲一個參數,當我做console.log(this.data())時,我看到表中的每一行,這些值都會回到「True」,「False」,「False」。

enter image description here

有沒有一種方法來搜索通過jQuery的數據表選中或未選中的複選框?

UPDATE

這裏是我正在創建的搜索框:

$("#NewTable tfoot th").each(function (index) { 
    if (index !== newTable - 1) { 
     var title = $(this).text().trim(); 
     $(this).html('<input type="text" class="form-control" placeholder="' + title + '"/>'); 
    } 
}); 

更新2

var newDTTable = $('#NewTable').DataTable({ 
    dom: 'Bfrtip', 
    buttons: [ 
    { 
     extend: 'excel', 
     exportOptions: { 
      columns: ':not(:last-child)' 
     } 
    }], 
    aoColumnDefs: [ 
     { 
      "render": function (data, type, row) { 
       if (data.indexOf("checked") > -1) { 
        return data + "<input type='hidden' value='True' />"; 
       } 
       else return data + "<input type='hidden' value='False' />"; 
      }, 
      "targets": 5 
     }, 
     { "bSortable": false, "aTargets": [2, 18] }, 
     { "bSearchable": false, "aTargets": [4,7,8,9,10,11,12,13,14,15,16,17,18] } 
    ] 
}); 

newDTTable.columns().every(function (colIdx) { 
    var that = this; 
    console.log(this.data()); 
    $('input', this.footer()).on('keyup change', 
     function() { 
      if (that.search() !== this.value) { 
       that 
        .search(this.value) 
        .draw(); 
      } 
     }); 
}); 

這裏是我的DataTable的我的定義/創建..有幾個隱藏的列在這個問題的背景下無關緊要。

+0

Downvote沒有評論爲什麼? –

+0

也許有人不打擾閱讀?似乎有趣的問題。我會試試看。 –

+0

你真的想通過文本框搜索條目嗎?如果做一個用於過濾的複選框,它會更有意義嗎? –

回答

2

我創建(實際上蠶食;))小提琴這裏:http://jsfiddle.net/gk67srwb/2/

基本的技巧就是使你的複選框列時,一個隱藏的輸入字段添加到您的複選框:

var table = $('#example').DataTable({ 
    "columnDefs": [ 
     { 
      "render": function (data, type, row) { 
      console.log(data); 
      if(data === "True"){ 
       return "<input type='checkbox' checked disabled /><input type='hidden' value='" + data + "' />"; 
       } 
       else return "<input type='checkbox' disabled /><input type='hidden' value='" + data + "' />"; 
      }, 
      "targets": 2 
     } 
     ] 
}); 

現在當你在列搜索框中輸入true // false,行會相應地過濾。當然,你可以給隱藏的領域一個更方便的價值(0/1)或創建一個下拉/複選框。

希望這可以幫助你!

+0

什麼是'targets'? –

+0

'targets'是您列的從0開始的索引。因此,對於我的示例表,ID列爲0,DESCRIPTION爲1,CHECK爲2.如果您有多個複選框列,則您也可以在此處傳遞數組(例如「targets」:[2,3,4,7])。鏈接到官方文檔:https://datatables.net/reference/option/columnDefs.targets –

+0

這小提琴的作品....這是你wnated? @T_Roy – Ashish451

0

您可以在這example,在數據表,你需要定義一個表格單元格的類型,如果是從一個普通的文本不同的見。

無論如何,您可能總是應用自定義過濾器。

假設您在第一列中有select元素。您需要:

  • 一個全局變量或類似的東西保存當前的搜索框
  • 指數節省輸入代替這個值KEYUP改變事件。這是爲了只調用一次自定義搜索。
  • 在自定義搜索功能中,您需要測試您是否在第一列進行操作,因此應用自定義搜索。

我使用了示例表而不是你的表。這應該不成問題。這只是一種描述如何解決問題的方法。

的片段:

var newTable = $('#NewTable tfoot th').length; 
 
// 
 
// added new variable 
 
// 
 
var selectedIdx; 
 

 
// Setup - add a text input to each footer cell 
 
$("#NewTable tfoot th").each(function (index) { 
 
    if (index !== newTable - 1) { 
 
     var title = $(this).text().trim(); 
 
     $(this).html('<input type="text" class="form-control" placeholder="' + title + '"/>'); 
 
    } 
 
}); 
 

 
var newDTTable = $('#NewTable').DataTable(); 
 

 
newDTTable.columns().every(function() { 
 
    var that = this; 
 
    // 
 
    // changed the events from keyup change to input 
 
    // 
 
    $('input', this.footer()).on('input', function (e) { 
 
     // 
 
     // save current search input index... 
 
     // 
 
     selectedIdx = that.footer().cellIndex; 
 
     // 
 
     // call the custom filter.... 
 
     // 
 
     newDTTable.draw(false); 
 
    }); 
 
}); 
 
$.fn.dataTableExt.afnFiltering.push(
 
     // 
 
     // custom filter ..... 
 
     // 
 
     function (oSettings, aData, iDataIndex) { 
 
      var column = newDTTable.column(selectedIdx); 
 
      var footer_txt = $('input', column.footer()).val(); 
 
      var cell_data = aData[selectedIdx]; 
 
      // 
 
      // if filtering on the select option column get current value of the select box 
 
      // 
 
      if (selectedIdx == 0) { 
 
       cell_data = $(oSettings.aoData[iDataIndex] 
 
         .anCells[selectedIdx]).find(':checked').is(":checked"); 
 
       if (footer_txt.toUpperCase().charAt(0) == 'T') { 
 
        footer_txt = true; 
 
       } else { 
 
        if (footer_txt.toUpperCase().charAt(0) == 'F') { 
 
         footer_txt = false; 
 
        } else { 
 
         footer_txt = undefined; 
 
        } 
 
       } 
 
       // 
 
       // searching on checkbox....... 
 
       // 
 
       return (footer_txt == undefined) ? true : footer_txt == cell_data; 
 
      } 
 

 
      // 
 
      // search.... 
 
      // 
 
      return cell_data.search(footer_txt) >= 0; 
 
     } 
 
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<link rel="stylesheet" href="https://cdn.datatables.net/1.10.15/css/jquery.dataTables.min.css"> 
 
<script src="https://cdn.datatables.net/1.10.15/js/jquery.dataTables.min.js"></script> 
 

 

 
<table id="NewTable" class="display" cellspacing="0" width="100%"> 
 
    <thead> 
 
    <tr> 
 
     <th>test</th> 
 
     <th>Name</th> 
 
     <th>Position</th> 
 
     <th>Office</th> 
 
     <th>Age</th> 
 
     <th>Start date</th> 
 
     <th>Salary</th> 
 
    </tr> 
 
    </thead> 
 
    <tfoot> 
 
    <tr> 
 
     <th>test</th> 
 
     <th>Name</th> 
 
     <th>Position</th> 
 
     <th>Office</th> 
 
     <th>Age</th> 
 
     <th>Start date</th> 
 
     <th>Salary</th> 
 
    </tr> 
 
    </tfoot> 
 
    <tbody> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Tiger Nixon</td> 
 
     <td>System Architect</td> 
 
     <td>Edinburgh</td> 
 
     <td>61</td> 
 
     <td>2011/04/25</td> 
 
     <td>$320,800</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox"></td> 
 
     <td>Garrett Winters</td> 
 
     <td>Accountant</td> 
 
     <td>Tokyo</td> 
 
     <td>63</td> 
 
     <td>2011/07/25</td> 
 
     <td>$170,750</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox"></td> 
 
     <td>Ashton Cox</td> 
 
     <td>Junior Technical Author</td> 
 
     <td>San Francisco</td> 
 
     <td>66</td> 
 
     <td>2009/01/12</td> 
 
     <td>$86,000</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Cedric Kelly</td> 
 
     <td>Senior Javascript Developer</td> 
 
     <td>Edinburgh</td> 
 
     <td>22</td> 
 
     <td>2012/03/29</td> 
 
     <td>$433,060</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Airi Satou</td> 
 
     <td>Accountant</td> 
 
     <td>Tokyo</td> 
 
     <td>33</td> 
 
     <td>2008/11/28</td> 
 
     <td>$162,700</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Brielle Williamson</td> 
 
     <td>Integration Specialist</td> 
 
     <td>New York</td> 
 
     <td>61</td> 
 
     <td>2012/12/02</td> 
 
     <td>$372,000</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Herrod Chandler</td> 
 
     <td>Sales Assistant</td> 
 
     <td>San Francisco</td> 
 
     <td>59</td> 
 
     <td>2012/08/06</td> 
 
     <td>$137,500</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Rhona Davidson</td> 
 
     <td>Integration Specialist</td> 
 
     <td>Tokyo</td> 
 
     <td>55</td> 
 
     <td>2010/10/14</td> 
 
     <td>$327,900</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Colleen Hurst</td> 
 
     <td>Javascript Developer</td> 
 
     <td>San Francisco</td> 
 
     <td>39</td> 
 
     <td>2009/09/15</td> 
 
     <td>$205,500</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Sonya Frost</td> 
 
     <td>Software Engineer</td> 
 
     <td>Edinburgh</td> 
 
     <td>23</td> 
 
     <td>2008/12/13</td> 
 
     <td>$103,600</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Jena Gaines</td> 
 
     <td>Office Manager</td> 
 
     <td>London</td> 
 
     <td>30</td> 
 
     <td>2008/12/19</td> 
 
     <td>$90,560</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Quinn Flynn</td> 
 
     <td>Support Lead</td> 
 
     <td>Edinburgh</td> 
 
     <td>22</td> 
 
     <td>2013/03/03</td> 
 
     <td>$342,000</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Charde Marshall</td> 
 
     <td>Regional Director</td> 
 
     <td>San Francisco</td> 
 
     <td>36</td> 
 
     <td>2008/10/16</td> 
 
     <td>$470,600</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Haley Kennedy</td> 
 
     <td>Senior Marketing Designer</td> 
 
     <td>London</td> 
 
     <td>43</td> 
 
     <td>2012/12/18</td> 
 
     <td>$313,500</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Tatyana Fitzpatrick</td> 
 
     <td>Regional Director</td> 
 
     <td>London</td> 
 
     <td>19</td> 
 
     <td>2010/03/17</td> 
 
     <td>$385,750</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Michael Silva</td> 
 
     <td>Marketing Designer</td> 
 
     <td>London</td> 
 
     <td>66</td> 
 
     <td>2012/11/27</td> 
 
     <td>$198,500</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Paul Byrd</td> 
 
     <td>Chief Financial Officer (CFO)</td> 
 
     <td>New York</td> 
 
     <td>64</td> 
 
     <td>2010/06/09</td> 
 
     <td>$725,000</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Gavin Cortez</td> 
 
     <td>Team Leader</td> 
 
     <td>San Francisco</td> 
 
     <td>22</td> 
 
     <td>2008/10/26</td> 
 
     <td>$235,500</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Zorita Serrano</td> 
 
     <td>Software Engineer</td> 
 
     <td>San Francisco</td> 
 
     <td>56</td> 
 
     <td>2012/06/01</td> 
 
     <td>$115,000</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Jennifer Acosta</td> 
 
     <td>Junior Javascript Developer</td> 
 
     <td>Edinburgh</td> 
 
     <td>43</td> 
 
     <td>2013/02/01</td> 
 
     <td>$75,650</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Cara Stevens</td> 
 
     <td>Sales Assistant</td> 
 
     <td>New York</td> 
 
     <td>46</td> 
 
     <td>2011/12/06</td> 
 
     <td>$145,600</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Hermione Butler</td> 
 
     <td>Regional Director</td> 
 
     <td>London</td> 
 
     <td>47</td> 
 
     <td>2011/03/21</td> 
 
     <td>$356,250</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Lael Greer</td> 
 
     <td>Systems Administrator</td> 
 
     <td>London</td> 
 
     <td>21</td> 
 
     <td>2009/02/27</td> 
 
     <td>$103,500</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Jonas Alexander</td> 
 
     <td>Developer</td> 
 
     <td>San Francisco</td> 
 
     <td>30</td> 
 
     <td>2010/07/14</td> 
 
     <td>$86,500</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Shad Decker</td> 
 
     <td>Regional Director</td> 
 
     <td>Edinburgh</td> 
 
     <td>51</td> 
 
     <td>2008/11/13</td> 
 
     <td>$183,000</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Michael Bruce</td> 
 
     <td>Javascript Developer</td> 
 
     <td>Singapore</td> 
 
     <td>29</td> 
 
     <td>2011/06/27</td> 
 
     <td>$183,000</td> 
 
    </tr> 
 
    <tr> 
 
     <td><input disabled="disabled" class="check-box" type="checkbox" checked="checked"></td> 
 
     <td>Donna Snider</td> 
 
     <td>Customer Support</td> 
 
     <td>New York</td> 
 
     <td>27</td> 
 
     <td>2011/01/25</td> 
 
     <td>$112,000</td> 
 
    </tr> 
 
    </tbody> 
 
</table>

0

也許這?

var newTable = $('#NewTable tfoot th').length; 

// Setup - add a text input to each footer cell 
$("#NewTable tfoot th").each(function (index) { 
    if (index !== newTable - 1) { 
     var title = $(this).text().trim(); 
     if(title=='Test'){ 
      var html = '<select class="form-control">'; 
      html += "<option value='' selected>Any</option>" 
      html += "<option value='checked' selected>True</option>" 
      html += "<option value='box"+'"'+">' selected>False</option>" 
      html += "</select>" 
      $(this).html(html) 
     }else 
      $(this).html('<input type="text" class="form-control" placeholder="' + title + '"/>'); 
    } 
}); 
var newDTTable = $('#NewTable').DataTable(); 

newDTTable.columns().every(function() { 
    var that = this; 
    console.log(this.data()); 
    $('input, select', this.footer()).on('keyup change', 
     function() { 
      if (that.search() !== this.value) { 
       that 
        .search(this.value) 
        .draw(); 
      } 
     }); 
});