使用 jQuery 进行表操作

发布于 2024-10-10 17:00:54 字数 3535 浏览 4 评论 0原文

我正在使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

妄司 2024-10-17 17:00:54

请查看 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.

人间不值得 2024-10-17 17:00:54

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文