JavaScript通过一些比较器对DOM元素进行排序,而不使用jQuery

时间:2014-06-21 13:52:25

标签: javascript dom dom-manipulation

想象一下DOM元素:

<ul id="list">
  <li data-index="3">Baz</li>
  <li data-index="1">Foo</li>
  <li data-index="2">Bar</li>
</ul>

如何使用JavaScript和没有jQuery对这些元素进行排序?

类似于:

document.getElementById('list').sort(function(li) { return li.dataset.index; });

3 个答案:

答案 0 :(得分:5)

您应该使用flexboxes的订购功能。这将允许重新排序元素,而无需在DOM中移动它们。这涉及设置CSS order属性。

有关详细信息,请参阅https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Flexible_boxes

答案 1 :(得分:3)

前段时间我写了这个:

function sortChildren(wrap, f, isNum) {
    var l = wrap.children.length,
        arr = new Array(l);
    for(var i=0; i<l; ++i)
        arr[i] = [f(wrap.children[i]), wrap.children[i]];
    arr.sort(isNum
        ? function(a,b){ return a[0]-b[0]; }
        : function(a,b){ return a[0]<b[0] ? -1 : a[0]>b[0] ? 1 : 0; }
    );
    var par = wrap.parentNode,
        ref = wrap.nextSibling;
    par.removeChild(wrap);
    for(var i=0; i<l; ++i) wrap.appendChild(arr[i][1]);
    par.insertBefore(wrap, ref);
}

基本上:

  1. 首先创建一个数组来存储元素及其对应函数返回的相应值。

    我们也可以在排序时运行该函数,但由于DOM交互很慢,这样我们确保该函数每个元素只运行一次。

  2. 然后,我们使用原生sort对其进行排序。

    如果isNum参数是真的,我们使用数字比较的排序函数。如果比较器函数返回字符串但您想要以数字方式而不是按字典顺序进行比较,则需要这样做。

  3. 现在,我们从DOM中删除包装元素。这样重新安排孩子的费用会更便宜(例如避免遣返)。

  4. 最后,我们对孩子们进行了重新排序,然后将包装纸插回原位。

  5. 一样运行
    sortChildren(
        document.getElementById('list'),
        function(li) { return li.dataset.index; },
        true
    );
    

    sortChildren(
        document.getElementById('list'),
        function(li) { return +li.dataset.index; }
    );
    

    Demo

答案 2 :(得分:0)

<!doctype html>
<html lang="en">
<head>
<meta charset= "utf-8">
<title>sort list</title>
</head>
<body>
<strong>Double click the list to sort by data-index</strong>
<ul id= "list">
<li data-index= "3">Baz</li>
<li data-index= "1">Foo</li>
<li data-index= "2">Bar</li>
</ul>
<script>

document.body.ondblclick=function(){
    var A=[], pa= document.getElementById('list');
    var itemz= pa.getElementsByTagName('li');

    A.slice.call(itemz).sort(function(a, b){
        return a.getAttribute('data-index')-b.getAttribute('data-index');
    }).forEach(function(next){
            pa.appendChild(next);
    });
}

</script>
</body>
</html>