如何使用 TinySort.js 对嵌套 html 元素取消排序

发布于 2025-01-09 06:54:16 字数 2898 浏览 2 评论 0原文

我需要使用 TinySort.js 对一些嵌套列表进行排序(升序/降序),并且我需要能够稍后对它们进行取消排序(没有 jquery:请只使用普通 javascript)。

正如 TinySort 的作者 sjeiti,我之前使用javascript为每个列表元素分配一个位置属性对它们进行排序,以便稍后我可以恢复它们的原始顺序(取消排序)。

对于一个简单的列表,我没有问题(排序/取消排序效果很好): https://jsfiddle.net/abubelinha/t7dcjhak/

对于嵌套列表,我按照 <一个href="https://stackoverflow.com/questions/32007817/nested-lists-and-tinysort/32010944#32010944">此方法,作者:贝尔吉。但我以后无法对它们进行取消排序。 这是我到目前为止所取得的成就: https://jsfiddle.net/abubelinha/wn9o3gft/ ...但我收到此错误:
tinysort.min.js:10 未捕获类型错误:d.getAttribute 不是函数

var listElements = document.querySelectorAll('*');
function setInitialOrder() {
  for (var i = 0, l = listElements.length; i < l; i++) {
    listElements[i].setAttribute('position1', i);
  }
}
setInitialOrder();

function sortNested(sortby={}) {
  var lists = document.querySelectorAll('ul.memberlist');
  lists.forEach((li_item) => {
    tinysort(li_item.children, sortby);
  });
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/tinysort/3.2.5/tinysort.min.js"></script>
<ul class="memberlist">
   <li><a class="function">FFF</a></li>
   <li><a class="class">XXX</a>
      <ul class="memberlist">
      <li><a class="function">1x</a></li>
      <li><a class="function">3x</a></li>
      <li><a class="variable">2x</a></li>
      </ul>
   </li>
   <li><a class="class">AAA</a>
      <ul class="memberlist">
      <li><a class="variable">9a</a></li>
      <li><a class="function">5a</a></li>
      </ul>
   </li>
</ul>
<style> .tsort {background-color: lightgrey; padding: 3px; cursor:pointer; border:1px solid;} </style>
<span id="sortAZ" class="tsort" onclick="sortNested();">A-Z</span> 
<span id="sortZA" class="tsort" onclick="sortNested({order:'desc'});">Z-A</span> 
<span id="unsort" class="tsort" onclick="sortNested({attr:'position1'});">original order</span>

预先非常感谢您的建议。

编辑:@Thomas 评论后修改代码。
更改自 tinysort(li_item.childNodes, sortby);
tinysort(li_item.children, sortby);

更多信息 此处

I need to sort (ascending/descending) some nested lists with TinySort.js and I need to be able to unsort them later (no jquery: just vanilla javascript, please).

As suggested by TinySort's author sjeiti, I used javascript to assign a position attribute to each list element before sorting them, so I can later recover their original order (unsort).

For a simple list, I had no problem (sort/unsort works well):
https://jsfiddle.net/abubelinha/t7dcjhak/

For nested lists, I sorted them following this approach by Bergi. But I am not being able to unsort them later on.
Here is what I achieved so far:
https://jsfiddle.net/abubelinha/wn9o3gft/
... but I am getting this error:
tinysort.min.js:10 Uncaught TypeError: d.getAttribute is not a function

var listElements = document.querySelectorAll('*');
function setInitialOrder() {
  for (var i = 0, l = listElements.length; i < l; i++) {
    listElements[i].setAttribute('position1', i);
  }
}
setInitialOrder();

function sortNested(sortby={}) {
  var lists = document.querySelectorAll('ul.memberlist');
  lists.forEach((li_item) => {
    tinysort(li_item.children, sortby);
  });
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/tinysort/3.2.5/tinysort.min.js"></script>
<ul class="memberlist">
   <li><a class="function">FFF</a></li>
   <li><a class="class">XXX</a>
      <ul class="memberlist">
      <li><a class="function">1x</a></li>
      <li><a class="function">3x</a></li>
      <li><a class="variable">2x</a></li>
      </ul>
   </li>
   <li><a class="class">AAA</a>
      <ul class="memberlist">
      <li><a class="variable">9a</a></li>
      <li><a class="function">5a</a></li>
      </ul>
   </li>
</ul>
<style> .tsort {background-color: lightgrey; padding: 3px; cursor:pointer; border:1px solid;} </style>
<span id="sortAZ" class="tsort" onclick="sortNested();">A-Z</span> 
<span id="sortZA" class="tsort" onclick="sortNested({order:'desc'});">Z-A</span> 
<span id="unsort" class="tsort" onclick="sortNested({attr:'position1'});">original order</span>

Thanks a lot in advance for your suggestions.

EDIT: code modified after @Thomas comment.
Changed from tinysort(li_item.childNodes, sortby);
to tinysort(li_item.children, sortby);

More info here.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文