使用 jQuery 进行表操作
我正在使用 DataTables 显示我传入的一些 XML 数据,但我正在寻找稍微不同的方法。我希望在每一列上都有搜索框,并理想地用结果中的值填充它们。因此,我不会在其页面上使用“搜索”框,而是在每列上方都有一个包含值的框(例如,对于 Rending引擎:组合框中的 Trident、WebKit、Gecko 等)。我可以更改 DataTables jQuery 以实现此目的,还是应该从头开始。这看起来令人畏惧,但我对 jQuery 还很陌生。非常感谢任何回复。提前致谢。
编辑:感谢您的回复。我按照 predrag 建议使用带有组合框的数据表,其中填充了列中的所有值(不仅仅是显示页面上的值),但是当我选择一个值时,它似乎不会触发重新加载网格的事件。这是我在页面上的 jQuery 代码:
<script type="text/javascript">
$(document).ready(function() {
<!-- Sorting and pagination -->
var oTable = $('#mainTable').dataTable( {
"bJQueryUI": true,
"sPaginationType": "full_numbers",
"bFilter": false
});
<!-- Filtering -->
$("thead td").each(function(i) {
this.innerHTML = fnCreateSelect(oTable.fnGetColumnData(i));
$('select', this).change(function() {
oTable.fnFilter($(this).val(), i);
});
});
});
</script>
此外,我已将这些函数添加到 jquery.dataTables.js 的底部,如下所示:
(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 wany 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) {
var r = '<select><option value=""></option>', i, iLen = aData.length;
for (i = 0; i < iLen; i++) {
r += '<option value="' + aData[i] + '">' + aData[i] + '</option>';
}
return r + '</select>';
}
中设置断点并更改其中一个过滤器下拉框的值时,断点没有被击中,但当我在 fnCreateSelect 中设置断点时,它确实被击中。我做错了什么吗?
I'm using DataTables
to display some XML data I have coming in, but I'm looking for a slightly different approach. I'd like to have search boxes over each column and ideally populate them with the values from the results.. so instead of the "Search" box on their page, I would have a box above each column with values (Say, for Rending Engine: Trident, WebKit, Gecko, etc. in a combo box). Can I alter the DataTables jQuery to allow for this or should I start from scratch. It seems daunting, but I am still rather new to jQuery. Any responses are greatly appreciated. Thanks in advance.
Edit: thanks for the responses. I'm using Datatables with the combo boxes as predrag suggested, which are being populated with all the values from the columns (not just the ones on the displayed page), but when I select a value, it doesn't seem to fire the event that reloads the grid. This is my jQuery code on the page:
<script type="text/javascript">
$(document).ready(function() {
<!-- Sorting and pagination -->
var oTable = $('#mainTable').dataTable( {
"bJQueryUI": true,
"sPaginationType": "full_numbers",
"bFilter": false
});
<!-- Filtering -->
$("thead td").each(function(i) {
this.innerHTML = fnCreateSelect(oTable.fnGetColumnData(i));
$('select', this).change(function() {
oTable.fnFilter($(this).val(), i);
});
});
});
</script>
Additionally, I have added these functions to the bottom of jquery.dataTables.js as follows from this page: http://datatables.net/examples/api/multi_filter_select.html
(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 wany 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) {
var r = '<select><option value=""></option>', i, iLen = aData.length;
for (i = 0; i < iLen; i++) {
r += '<option value="' + aData[i] + '">' + aData[i] + '</option>';
}
return r + '</select>';
}
When I set a breakpoint in fnFilter and change the value of one of the filter drop-down boxes, the breakpoint does not get hit, but it does get hit when I set one in fnCreateSelect. Am I doing something wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我使用并喜欢数据表,请检查此链接:
http://www.datatables.net/examples /api/multi_filter.html
和这个:
http://datatables.net/examples /api/multi_filter_select.html
I use and love datatables, check this link:
http://www.datatables.net/examples/api/multi_filter.html
and this one:
http://datatables.net/examples/api/multi_filter_select.html
请查看 PicNet 表过滤器。如果您想自己构建它,请参阅 使用 jQuery 操作和过滤数据 可能会帮助您入门。
Check out PicNet Table Filter. If you'd prefer to build it yourself, this tutorial on Using jQuery To Manipulate and Filter Data may get you started.
jqgrid 网格数据插件具有此功能。你可以看一下。
您可以在此处找到有关搜索插件的更多信息。
The jqgrid grid data plugin has this functionality. You can have a look into it.
You can find more about the search plugin here.