【问题标题】:Collapsing tree table using plain javascript使用纯 JavaScript 折叠树表
【发布时间】:2020-04-08 12:48:52
【问题描述】:

我正在尝试创建一个折叠树表结构。当我单击 tr child tr 打开等等。 这是在 UI 中表示为树的文件夹结构。我使用了How to create a collapsing tree table in html/css/js?中显示的示例

它运行良好,但我不能使用 jquery,因为它是一个遗留应用程序,并且仅是纯 JS。有人可以帮我把这个 jquery 转换成纯 JS。

<table id="mytable">
    <tr data-depth="0" class="collapse level0">
        <td><span class="toggle collapse"></span>Item 1</td>
        <td>123</td>
    </tr>
    <tr data-depth="1" class="collapse level1">
        <td><span class="toggle"></span>Item 2</td>
        <td>123</td>
    </tr>
    <tr data-depth="2" class="collapse level2">
        <td>Item 3</td>
        <td>123</td>
    </tr>
    <tr data-depth="1" class="collapse level1">
        <td>Item 4</td>
        <td>123</td>
    </tr>
    <tr data-depth="0" class="collapse collapsable level0">
        <td><span class="toggle collapse"></span>Item 5</td>
        <td>123</td>
    </tr>
    <tr data-depth="1" class="collapse collapsable level1">
        <td>Item 6</td>
        <td>123</td>
    </tr>
</table>

jquery

$(function() {
    $('#mytable').on('click', '.toggle', function () {
        //Gets all <tr>'s  of greater depth below element in the table
        var findChildren = function (tr) {
            var depth = tr.data('depth');
            return tr.nextUntil($('tr').filter(function () {
                return $(this).data('depth') <= depth;
            }));
        };

        var el = $(this);
        var tr = el.closest('tr'); //Get <tr> parent of toggle button
        var children = findChildren(tr);

        //Remove already collapsed nodes from children so that we don't
        //make them visible. 
        //(Confused? Remove this code and close Item 2, close Item 1 
        //then open Item 1 again, then you will understand)
        var subnodes = children.filter('.expand');
        subnodes.each(function () {
            var subnode = $(this);
            var subnodeChildren = findChildren(subnode);
            children = children.not(subnodeChildren);
        });

        //Change icon and hide/show children
        if (tr.hasClass('collapse')) {
            tr.removeClass('collapse').addClass('expand');
            children.hide();
        } else {
            tr.removeClass('expand').addClass('collapse');
            children.show();
        }
        return children;
    });
});

CSS

table td {
    border: 1px solid #eee;
}
.level1 td:first-child {
    padding-left: 15px;
}
.level2 td:first-child {
    padding-left: 30px;
}

.collapse .toggle {
    background: url("http://mleibman.github.com/SlickGrid/images/collapse.gif");
}
.expand .toggle {
    background: url("http://mleibman.github.com/SlickGrid/images/expand.gif");
}
.toggle {
    height: 9px;
    width: 9px;
    display: inline-block;   
}

【问题讨论】:

    标签: javascript jquery html


    【解决方案1】:

    已转换。试试这个看看它是否有效:

    https://jsfiddle.net/sirhvd/u2ypsanj/

    [].forEach.call(document.querySelectorAll('#mytable .toggle'), function(el) {
      el.addEventListener('click', function() {
        var el = this;
        var tr = el.closest('tr');
        var children = findChildren(tr);
        var subnodes = children.filter(function(element) {
          return element.matches('.expand');
        });
        subnodes.forEach(function(subnode) {
          var subnodeChildren = findChildren(subnode);
          children = children.filter(function(element) {
              return !subnodeChildren.includes(element);
          });
        });
        if (tr.classList.contains('collapse')) {
          tr.classList.remove('collapse');
          tr.classList.add('expand');
          children.forEach(function(child) {
            child.style.display = 'none';
          });
        } else {
          tr.classList.remove('expand');
          tr.classList.add('collapse');
          children.forEach(function(child) {
            child.style.display = '';
          });
        }
      })
    })
    
    var findChildren = function(tr) {
      var depth = tr.dataset.depth;
      var elements = [...document.querySelectorAll('#mytable tr')].filter(function(element) {
        return element.dataset.depth <= depth;
      });
      var next = nextUntil(tr, elements);
      return next;
    };
    
    var nextUntil = function(elem, elements, filter) {
      var siblings = [];
      elem = elem.nextElementSibling;
      while (elem) {
        if (elements.includes(elem)) break;
        if (filter && !elem.matches(filter)) {
          elem = elem.nextElementSibling;
          continue;
        }
        siblings.push(elem);
        elem = elem.nextElementSibling;
      }
      return siblings;
    };
    table td {
      border: 1px solid #eee;
    }
    
    .level1 td:first-child {
      padding-left: 15px;
    }
    
    .level2 td:first-child {
      padding-left: 30px;
    }
    
    .collapse .toggle {
      background: url("http://mleibman.github.com/SlickGrid/images/collapse.gif");
    }
    
    .expand .toggle {
      background: url("http://mleibman.github.com/SlickGrid/images/expand.gif");
    }
    
    .toggle {
      height: 9px;
      width: 9px;
      display: inline-block;
    }
    <table id="mytable">
      <tr data-depth="0" class="collapse level0">
        <td><span class="toggle collapse"></span>Item 1</td>
        <td>123</td>
      </tr>
      <tr data-depth="1" class="collapse level1">
        <td><span class="toggle"></span>Item 2</td>
        <td>123</td>
      </tr>
      <tr data-depth="2" class="collapse level2">
        <td>Item 3a</td>
        <td>123</td>
      </tr>
      <tr data-depth="2" class="collapse level2">
        <td>Item 3b</td>
        <td>123</td>
      </tr>
      <tr data-depth="2" class="collapse level2">
        <td>Item 3c</td>
        <td>123</td>
      </tr>
      <tr data-depth="1" class="collapse level1">
        <td>Item 4</td>
        <td>123</td>
      </tr>
      <tr data-depth="0" class="collapse collapsable level0">
        <td><span class="toggle collapse"></span>Item 5</td>
        <td>123</td>
      </tr>
      <tr data-depth="1" class="collapse collapsable level1">
        <td>Item 6</td>
        <td>123</td>
      </tr>
    </table>

    【讨论】:

      猜你喜欢
      • 2020-12-12
      • 2018-06-28
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多