【问题标题】:How to sort html elements according to array values如何根据数组值对html元素进行排序
【发布时间】:2015-01-12 18:12:56
【问题描述】:

我正在尝试根据输入的数据属性中的项目顺序使用 jQuery 对 html 元素进行排序。 “数据顺序”

在此处查看代码设置,但我被卡住了。

http://jsbin.com/cixolonoqe/1/edit?html,js,output

HTML:

<div id="control">
   <input type="hidden" data-order="title,text,date">
  </div>
  <div id="parts">

    <p class="date part">20 January 2014</p>
    <h5 class="title part">Some Title</h5>
    <p class="text part">A line of Text</p>

  </div>

jQuery:

var input =  $('#control input');
var partsOrder = input.attr("data-order");

var parts = $('#parts');

parts.find('.part').each(function(i) {
      $(this).attr('data-index', 'index' + i);
});

//Make array from data-order attribute
var partsArray = partsOrder.split(',');

 $.partsArray(json, function(i, val) {


  //modify html order



 });

如果数据顺序字符串发生变化,我希望 html 相应地重新排序。

标题,文本,日期与日期,文本,标题

到目前为止,我已经在零件上添加了一个带有原始索引的新数据属性。并从数据顺序字符串创建了一个数组,以便可以循环访问并修改 html。

但我无法理解它。

【问题讨论】:

  • 您可以单击编辑并在此处发布代码,而不是链接。理想情况下,问题包括它以防止链接失效。
  • 知道了,我已经更新了问题。谢谢!

标签: javascript jquery html arrays


【解决方案1】:

这假设您正在循环并在您的 div 中创建多个三组,并且不需要您编辑 HTML。

var input =  $('#control input');
var partsOrder = input.attr("data-order");
var parts = $('#parts');
var partsArray = partsOrder.split(',');

var $part = parts.find('.part');

var groupNum = 0;
$part.each(function(k,v) {
  if (k === 0 || k % 3 === 0) {
    var $div = $(v).wrap('<div class="group" data-group="' + groupNum + '"></div>');
    $(v).attr('data-group', groupNum);
    var $second = $($part.get(k+1)).attr('data-group', groupNum);
    var $third = $($part.get(k+2)).attr('data-group', groupNum);
    $second.remove();
    $third.remove();
    $div.append($second);
    $div.append($third);
    groupNum++;
  }  
});

for (var i = 0; i < groupNum; i++) {
  var $group = $('.group[data-group="' + i + '"]');
  for (var j = 0; j < partsArray.length; j++) {
    var $thePart = $group.find('.' + partsArray[j]);  
    $thePart.remove();
    $group.append($thePart);
  }
}

$('.group').unwrap();

JSBin

【讨论】:

  • 您不能通过使用before 和after 添加开始和结束标签来包装元素。 DOM 由元素组成,而不是标签,因此您只能向其中添加完整的元素。
【解决方案2】:

你可以把目标索引放在元素上,把它们放在一个数组中,在索引上对数组进行排序,然后根据数组重新排列元素:

var partsOrder = $('#control input').attr("data-order").split(',');

var parts = $('#parts');

// set target index for elements
$.each(partsOrder, function(i, v){
  $('.' + v, parts).data('index', i);
});

// sort array on index
var items = parts.find('.part');
items.sort(function(a,b){ return $(a).data('index') - $(b).data('index'); });

// move elements into array order
parts.append(items);

演示:http://jsbin.com/fejegeyoco/2/edit

【讨论】:

  • 如果 html 部分未在数据顺序属性中列出,我将如何隐藏它?
  • @Andy:您可以将它们全部隐藏,然后在设置目标索引的循环中添加 .show() 以显示列表中的那些。
猜你喜欢
  • 1970-01-01
  • 2022-08-15
  • 2018-07-27
  • 2019-06-10
  • 2021-10-11
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多