对 DOM 节点进行排序的最简单方法?

IT技术 javascript dom
2021-02-07 14:14:46

如果我有这样的列表:

<ul id="mylist">
    <li id="list-item1">text 1</li>
    <li id="list-item2">text 2</li>
    <li id="list-item3">text 3</li>
    <li id="list-item4">text 4</li>
</ul>

根据我的喜好重新排列 DOM 节点的最简单方法是什么?(这需要在页面加载时自动发生,列表顺序首选项是从 cookie 中获得的)

例如

<ul id="mylist">
    <li id="list-item3">text 3</li>
    <li id="list-item4">text 4</li>
    <li id="list-item2">text 2</li>
    <li id="list-item1">text 1</li>
</ul>
6个回答

虽然使用 JS 库可能有更简单的方法来做到这一点,但这里有一个使用 vanilla js 的可行解决方案。

var list = document.getElementById('mylist');

var items = list.childNodes;
var itemsArr = [];
for (var i in items) {
    if (items[i].nodeType == 1) { // get rid of the whitespace text nodes
        itemsArr.push(items[i]);
    }
}

itemsArr.sort(function(a, b) {
  return a.innerHTML == b.innerHTML
          ? 0
          : (a.innerHTML > b.innerHTML ? 1 : -1);
});

for (i = 0; i < itemsArr.length; ++i) {
  list.appendChild(itemsArr[i]);
}
通过使用list.children代替list.childNodes,您可以避免检查文本节点。
2021-03-17 14:14:46
当我第一次阅读这个答案时,我想到了 vanilla js?为什么这里需要vanilla.js:^)
2021-03-18 14:14:46
@LivingstonSamuel ...但代价是不能在 IE 中工作(甚至是 IE11!)
2021-04-09 14:14:46
感谢您的解决方案 NickF,由于我使用的是 jQuery,我将对其进行一些调整,但我想我现在知道如何去做了,谢谢!:)
2021-04-11 14:14:46

使用 es6 语法来使用子项:

var list = document.querySelector('#test-list');

[...list.children]
  .sort((a,b)=>a.innerText>b.innerText?1:-1)
  .forEach(node=>list.appendChild(node));
这是最好的解决方案
2021-03-14 14:14:46
杰出的!重新排序节点的最聪明的方法
2021-03-17 14:14:46
注意:如果您想使用parseFloat()按数字排序,请确保替换为NaN0否则您将无法获得正确的排序。
2021-03-21 14:14:46
好东西!这是一种干净的方法。
2021-04-01 14:14:46
使用 "forEach" 方法而不是 "map" 在语义上更正确,因为在这种情况下您对元素的实际映射不感兴趣,您只想调用具有副作用的回调(附加到另一个元素)。
2021-04-01 14:14:46

您可能会发现对 DOM 节点进行排序表现不佳。另一种方法是在您的 javascript 中使用一个数组,该数组表示将进入 DOM 节点的数据,对该数据进行排序,然后重新生成保存 DOM 节点的 div。

也许你没有那么多节点要排序,所以没关系。我的经验是基于尝试通过操作 DOM 对 HTML 表进行排序,包括具有数百行和几十列的表。

看到它在行动:http : //jsfiddle.net/stefek99/y7JyT/

    jQuery.fn.sortDomElements = (function() {
        return function(comparator) {
            return Array.prototype.sort.call(this, comparator).each(function(i) {
                  this.parentNode.appendChild(this);
            });
        };
    })();

简洁

我知道这是一篇旧帖子,但我可以问一下,使用自执行函数返回 sortDomElements 函数有什么好处?说 jQuery.fn.sortDomElements = function(comparator)... 不是更简洁吗?像这样jsfiddle.net/y7JyT/77
2021-04-04 14:14:46
好的!我也喜欢简洁的东西,因此基于此,我想出了一个非常简单的 jQuery 函数,它可以让您提供一个回调函数来计算要排序的值。(我包含了两个示例:按字母顺序对列表进行排序,以及按第一列中的数值对表格进行排序 - 基本上都是单行。)
2021-04-10 14:14:46

我的版本,希望对其他人有用:

var p = document.getElementById('mylist');
Array.prototype.slice.call(p.children)
  .map(function (x) { return p.removeChild(x); })
  .sort(function (x, y) { return /* your sort logic, compare x and y here */; })
  .forEach(function (x) { p.appendChild(x); });
你是什​​么意思/* sort logic */:/ 代码看起来不错,但是我的排序逻辑有点弱
2021-03-13 14:14:46
这意味着你应该把你的排序逻辑放在那里,看看developer.mozilla.org/en/docs/Web/JavaScript/Reference/...基本相同,只有 x 和 y 是 DOM 节点。
2021-03-29 14:14:46