Używam tabel danych wtyczek jQuery (http://datatables.net) do stronicowania, możliwości wyszukiwania i filtrowania.jQuery DataTables Filtrowanie tylko dla określonych kolumn
Istnieje funkcja filtra (http://datatables.net/release-datatables/examples/api/multi_filter_select.html), która umieszcza elementy zaznaczania formularza dla każdej kolumny.
Mój problem polega na tym, że nie chcę, aby filtry wybierały elementy dla każdej kolumny, tylko niektóre. Zmodyfikowałem oryginalny kod tak, jak chcę tylko filtrować Tak/Nie, a moja pierwsza kolumna zawiera nazwy użytkowników.
Jak usunąć element wyboru formularza z pierwszej kolumny?
JavaScript:
<script type="text/javascript">
$(document).ready(function() {
(function($) {
/*
* Function: fnGetColumnData
* Purpose: Return an array of table values from a particular column.
* Returns: array string: 1d data array
* Inputs: object:oSettings - dataTable settings object. This is always the last argument past to the function
* int:iColumn - the id of the column to extract the data from
* bool:bUnique - optional - if set to false duplicated values are not filtered out
* bool:bFiltered - optional - if set to false all the table data is used (not only the filtered)
* bool:bIgnoreEmpty - optional - if set to false empty values are not filtered from the result array
* Author: Benedikt Forchhammer <b.forchhammer /AT\ mind2.de>
*/
$.fn.dataTableExt.oApi.fnGetColumnData = function (oSettings, iColumn, bUnique, bFiltered, bIgnoreEmpty) {
// check that we have a column id
if (typeof iColumn == "undefined") return new Array();
// by default we only want unique data
if (typeof bUnique == "undefined") bUnique = true;
// by default we do want to only look at filtered data
if (typeof bFiltered == "undefined") bFiltered = true;
// by default we do not wany to include empty values
if (typeof bIgnoreEmpty == "undefined") bIgnoreEmpty = true;
// list of rows which we're going to loop through
var aiRows;
// use only filtered rows
if (bFiltered == true) aiRows = oSettings.aiDisplay;
// use all rows
else aiRows = oSettings.aiDisplayMaster; // all row numbers
// set up data array
var asResultData = new Array();
for (var i=0,c=aiRows.length; i<c; i++) {
iRow = aiRows[i];
var aData = this.fnGetData(iRow);
var sValue = aData[iColumn];
// ignore empty values?
if (bIgnoreEmpty == true && sValue.length == 0) continue;
// ignore unique values?
else if (bUnique == true && jQuery.inArray(sValue, asResultData) > -1) continue;
// else push the value onto the result data array
else asResultData.push(sValue);
}
return asResultData;
}}(jQuery));
function fnCreateSelect(aData)
{
return '<select><option value="">Select</option><option value="Yes">Yes</option><option value="No">No</option></select>';
}
var oTable = $('#results').dataTable({
"sDom": '<<"filters"f><"clear"><"top"Tp><"clear">rt<"bottom"il>>',
"iDisplayLength": 5,
"sPaginationType": "full_numbers",
"bSortCellsTop": true,
"oLanguage": {
"sSearch": "Search all columns:"
},
"aoColumns": [
null,
{ "sType": "title-string" },
{ "sType": "title-string" },
{ "sType": "title-string" },
{ "sType": "title-string" }
],
"oTableTools": {
"sSwfPath": "../../scripts/TableTools/copy_cvs_xls_pdf.swf"
}
});
/* Add a select menu for each TH element in the table footer */
$("thead #filter td").each(function (i) {
this.innerHTML = fnCreateSelect(oTable.fnGetColumnData(i));
$('select', this).change(function() {
oTable.fnFilter($(this).val(), i);
});
});
});
</script>
HTML:
<table id="results" class="display">
<thead>
<tr id="labels">
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5?</th>
</tr>
<tr id="filter">
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5?</td>
</tr>
</thead>
<tbody>
...
</tbody>
</table>
Czy ktoś wie * gdzie * umieścić powyższy kod? Dokładnie tego potrzebuję - po prostu nie wiem, gdzie ją umieścić. – Laurence
@Doug Owings Wydaje mi się, że masz błąd w drugim fragmencie. Aby sprawdzić, czy wartość jest w tablicy, musisz sprawdzić, czy zwraca wartość "-1", czy nie. Tak powinno być 'if ($. InArray (i, filterIndexes)! = -1)' – stef
@stef Dzięki, zaktualizowane. –