根据属性“数据排序”对 jQuery 中的 div 进行排序?

IT技术 jquery jquery-selectors javascript jquery-ui-sortable
2021-02-07 13:27:15

如果我有几个 div:

<div data-sort='1'>div1</div>
<div data-sort='4'>div4</div>
<div data-sort='8'>div8</div>
<div data-sort='12'>div12</div>
<div data-sort='19'>div19</div>

我动态创建 div:

<div data-sort='14'>div1</div>
<div data-sort='6'>div1</div>
<div data-sort='9'>div1</div>

我怎样才能让它们按顺序排列到已经加载的 div 中,而不必重新加载所有的 div?

我认为我需要在屏幕上构建一个包含所有 div 的数据排序值的数组,然后查看新 div 的位置,但我不确定这是否是最好的方法。

4个回答

使用这个功能

   var result = $('div').sort(function (a, b) {

      var contentA =parseInt( $(a).data('sort'));
      var contentB =parseInt( $(b).data('sort'));
      return (contentA < contentB) ? -1 : (contentA > contentB) ? 1 : 0;
   });

   $('#mylist').html(result);

您可以在添加新 div 后立即调用此函数。

如果你想在 div 中保留 javascript 事件,不要像上面的例子那样使用 html 替换。而是使用:

$(targetSelector).sort(function (a, b) {
    // ...
}).appendTo($container);
只是这里示例的一个问题。sort 方法只返回排序后的列表,它不会就地对元素进行排序。您需要手动添加新列表,例如使用 $('#mylist').html(result);
2021-03-31 13:27:15
@安迪B。你确定吗?你能提供一个发生这种情况的例子/版本吗?我在这里测试过,效果很好:jsfiddle.net/fMe7R/1
2021-04-02 13:27:15
@danronmoon 啊,是的,你是对的 - 结果我正在设置.attr然后尝试访问.data这是两个不同的东西。
2021-04-07 13:27:15
这似乎有一个微妙的错误,因为它使用.attr('data-sort')代替.data('sort'). 如果数据排序值在页面上动态更新,则 attr('data-sort') 仍使用原始值。
2021-04-12 13:27:15
工作完美。我用它来对一堆包含术语的 UL 元素进行排序。$("#allTerms>ul").sort(function(a, b) { var contentA = parseInt($(a).attr('data-sort')); var contentB = parseInt($(b).attr('data-sort')); return (contentA < contentB) ? -1 : (contentA > contentB) ? 1 : 0; }).appendTo($("#allTerms"));
2021-04-12 13:27:15

我把它变成了一个 jQuery 函数:

jQuery.fn.sortDivs = function sortDivs() {
    $("> div", this[0]).sort(dec_sort).appendTo(this[0]);
    function dec_sort(a, b){ return ($(b).data("sort")) < ($(a).data("sort")) ? 1 : -1; }
}

所以你有一个像“#boo”这样的大 div 以及里面所有的小 div:

$("#boo").sortDivs();

由于 Chrome 中的一个错误,您需要“?1:-1”,否则它不会对超过 10 个 div 进行排序!http://blog.rodneyrehm.de/archives/14-Sorting-Were-Doing-It-Wrong.html

如果您有动态数据排序属性,请将 data("sort") 替换为 attr("data-sort")。效果很好!
2021-03-19 13:27:15
我对@PJBrunets 解决方案有疑问。以前位于父 div 中的 div 会发生什么?据我了解的解决方案,我们不是只是向父级添加越来越多的(排序的)div?我们不需要删除“旧”的 div 吗?
2021-03-28 13:27:15
@Michaela.Merz 我认为它们已排序到位,无需删除任何内容。但是自从我创建该功能以来已经有一段时间了,我不记得细节了。我正在使用这个与黑客 jquery.vgrid 这样的 $("#grid-content").sortDivs(); window.vg = $("#grid-content").vgrid();
2021-04-07 13:27:15

在这里回答了同样的问题:

转贴:

在搜索了许多解决方案之后,我决定写一篇关于如何在 jquery 中排序的博客总之,按数据属性对jquery“类数组”对象进行排序的步骤......

  1. 通过 jquery 选择器选择所有对象
  2. 转换为实际数组(不是类似数组的 jquery 对象)
  3. 对对象数组进行排序
  4. 使用 dom 对象数组转换回 jquery 对象

html

<div class="item" data-order="2">2</div>
<div class="item" data-order="1">1</div>
<div class="item" data-order="4">4</div>
<div class="item" data-order="3">3</div>

普通jquery选择器

$('.item');
[<div class="item" data-order="2">2</div>,
 <div class="item" data-order="1">1</div>,
 <div class="item" data-order="4">4</div>,
 <div class="item" data-order="3">3</div>
]

让我们按数据顺序排序

函数 getSorted(selector, attrName) {
    返回 $($(selector).toArray().sort(function(a, b){
        var aVal = parseInt(a.getAttribute(attrName)),
            bVal = parseInt(b.getAttribute(attrName));
        返回 aVal - bVal;
    }));
}
> getSorted('.item', 'data-order')
[<div class="item" data-order="1">1</div>,
 <div class="item" data-order="2">2</div>,
 <div class="item" data-order="3">3</div>,
 <div class="item" data-order="4">4</div>
]

看看 getSorted() 是如何工作的。

希望这可以帮助!

我使用它对图像库进行排序,其中排序数组将通过 ajax 调用进行更改。希望它对某人有用。

var myArray = ['2', '3', '1'];
var elArray = [];

$('.imgs').each(function() {
    elArray[$(this).data('image-id')] = $(this);
});

$.each(myArray,function(index,value){
   $('#container').append(elArray[value]); 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<div id='container'>
   <div class="imgs" data-image-id='1'>1</div>
   <div class="imgs" data-image-id='2'>2</div>
   <div class="imgs" data-image-id='3'>3</div>
</div>

小提琴:http : //jsfiddle.net/ruys9ksg/