【问题标题】:Re-order table columns?重新排序表列?
【发布时间】:2018-09-16 19:21:46
【问题描述】:

有谁知道使用 jQuery 对表列重新排序的方法吗?

我的意思不是排序 - 我的意思是动态地在表格中向左或向右移动整个列。

我知道出色的dragtable plugin,但我不需要允许用户移动列的东西,我需要以可配置方式进行重新排序的东西。

【问题讨论】:

    标签: javascript jquery html-table


    【解决方案1】:

    这个想法是遍历表的所有行(tr)并交换所需的 td。让我们交换第 2 列和第 4 列:

    $('table tr').each(function() {
        var tr = $(this);
        var td1 = tr.find('td:eq(1)'); // indices are zero-based here
        var td2 = tr.find('td:eq(3)');
        td1.detach().insertAfter(td2);
    });
    

    我希望这会有所帮助。

    【讨论】:

    • 会更灵活地包装在一个函数中,该函数传递对表元素的引用和要交换的列索引,但除此之外,这几乎是正确的。
    【解决方案2】:

    这段代码应该适合你。

    $("table tr").each(function () {
        $(this).find("td").eq(1).after($(this).find("td").eq(0));
    });
    


    编辑:如果您将 $(this).find("td") 分配给一个变量,这将提供更好的性能。但是上下文只有一个 tr。所以我认为只要给出这个想法就足够了。
    $("table tr").each(function () {
        var rows = $(this).find("td");
        rows.eq(1).after(rows.eq(0));
    });
    

    【讨论】:

    • Duplicate "$(this)", duplicate ".find("td")" - 是的,让我们编写更慢的代码。另外我认为您会得到一个重复的列,但对此不确定。
    • 不,它不会重复。当当前在文档中的 DOM 节点被插入到别处时,它们会从原来的位置移除,而不是克隆。
    【解决方案3】:

    通读dragtable插件的源代码,作者提到实际移动表格列的算法源于comp.lang.javascript新闻组的讨论。讨论在这里:Swapping table columns

    在该线程中,OP 不是询问重新排序的 UI 方面,而是帮助调试他已经编写的用于交换两列的函数。进一步讨论,它发展成代码,使您能够传递特定的列排序,并让代码计算所有必要的交换/移动,以从当前排序到指定的排序。

    它不是 jQuery(c.l.js 上的大多数海报都非常不喜欢它以及大多数其他 JS 框架),因此它是您希望可以适应您的需求并包含在任何地方的代码。

    【讨论】:

      【解决方案4】:

      我将它与 jQueryUI 结合使用以获得一些很棒的拖放操作:

      (function() {
          var local = {};
          local.containment = 'parent';
          local.revert = true;
          $('body thead th').draggable(local);
          $('body thead th').droppable({
              drop: dropZone
          });
          function dropZone(myEvent, myUI ) {
              var head = {};
      
              head.dragIndex = myUI.draggable.index();
              head.dropIndex = $(this).index();
              head.rows = $(this).closest('thead').find('tr');
              head.cellIndex = head.rows.find('th').length-1;
              head.rows.each(processTableHeaderRows);
      
              function processTableHeaderRows(index, element) {
                  var row = {}
      
                  row.tr = $(element);
                  row.drag = row.tr.find('th:eq(' + head.dragIndex + ')');
                  row.drop = row.tr.find('th:eq(' + head.dropIndex + ')');
                  if (head.dropIndex === head.cellIndex) {
                      row.drag.detach().insertAfter(row.drop);
                  } else {
                      row.drag.detach().insertBefore(row.drop);
                  }
              }
              // Same thing here for td instead of th
              $(this).closest('table').find('tbody > tr').each(processRows);
              function processRows(index, element) {
                  var row = {};
      
                  row.tr = $(element);
                  row.drag = row.tr.find('td:eq(' + head.dragIndex + ')');
                  row.drop = row.tr.find('td:eq(' + head.dropIndex + ')');
                  if (head.dropIndex === head.cellIndex) {
                      row.drag.detach().insertAfter(row.drop);
                  } else {
                      row.drag.detach().insertBefore(row.drop);
                  }
              }
          }
      })();
      

      试图让它在jsFiddle 中工作,但我做不到。不过可以在my website 上工作!

      【讨论】:

      • 您的网站不再有效http://www.phillipsenn.co.uk/
      猜你喜欢
      • 2019-09-18
      • 2023-02-21
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-01
      相关资源
      最近更新 更多