在dom中重新排序html元素

Ton*_*niq 6 javascript jquery dom

我有一个元素列表:

<div class="wrapper">
    <div class="abc"></div>
    <div class="abc"></div>
    <div class="abc"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

我有一个或多个代表新订单的数字:

var arr = [2,1,0];
Run Code Online (Sandbox Code Playgroud)

我想将这些abc div重新定位到父包装器中的新位置.

重要的是abc divs附加了事件和数据,这需要保留!

我想出了这个,似乎按预期工作:

var wrapper = $('.wrapper'), items = wrapper.children('div.abc');

var orderedItems = $.map(arr, function(value) {
    return $(items).clone(true,true).get(value);
});
wrapper.empty().html(orderedItems);
Run Code Online (Sandbox Code Playgroud)

我想确保这是正确的方法.

如果可能的话,我也可以使用javascript解决方案.

Joh*_*ias 8

请记住,当您添加一个已经在 DOM 中的元素时,该元素将被移动,而不是被复制。

代码笔

let wrapper=document.querySelector(".wrapper");
let children=wrapper.children;
let newOrder=[3,2,1,0];
//it means that the first element you want it to be the four element
//The second element you want it to be the third
//the third element you want it to be the second
//the four element you want it to be the first
for(let i=0;i<newOrder.length;i++){
  for(let j=0;j<newOrder.length;j++){
    if(i==newOrder[j]){
      wrapper.appendChild(children[j]);
      break;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)
<div class="wrapper">
  <div>a</div>
  <div>b</div>
  <div>c</div>
  <div>d</div>
</div>
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 7

无需复制所有项目..两次

var wrapper = $('.wrapper'), 
    items = wrapper.children('.abc'),
    arr = [2,1,0];

//items.detach(); if arr doesn't reuse all items
wrapper.append( $.map(arr, function(v){ return items[v] }) );
Run Code Online (Sandbox Code Playgroud)


j2e*_*j2e 7

如果您想要一个纯Javascript解决方案(不涉及jQuery)

var arr = [2,1,0];
var wrapper = document.getElementsByClassName("wrapper");
var items = wrapper[0].children;
var elements = document.createDocumentFragment();

arr.forEach(function(idx) {
    elements.appendChild(items[idx].cloneNode(true));
});

wrapper[0].innerHTML = null;
wrapper[0].appendChild(elements);
Run Code Online (Sandbox Code Playgroud)

我以前的回答有些改进。小提琴:https : //jsfiddle.net/jltorresm/1ukhzbg2/2/

  • 请,请使用“文档碎片”随身携带一批物品 (2认同)
  • 你是对的,托马斯,改变了我的答案以使用文档片段 (2认同)
  • 但是这样做我会丢失附加到该元素的所有事件侦听器,cloneNode不会携带任何侦听器 (2认同)

Sit*_*as3 7

我知道这是一个老问题,但谷歌引导我解决这个问题。flexbox (css) 上有一个名为“order”的子属性,它允许您选择元素的显示顺序。可以使用 javascript 更改此子属性并重新排序显示的元素。

https://www.w3schools.com/cssref/css3_pr_order.asp

编辑 1 - 代码示例:

<style>
 .wrapper {
   display: flex;
   flex-flow: column;
 }
</style>

<div class="wrapper">
  <div class="abc">One</div>
  <div class="abc">Tow</div>
  <div class="abc">Three</div>
</div>
<button id="reorder" type="button">Reorder</button>
<button id="unreorder" type="button">Unreorder</button>

<script>
var reorderButton = document.querySelector('#reorder');
var unreorderButton = document.querySelector('#unreorder');
var abcDivs = document.querySelectorAll('.abc');
var newOrder = [2, 1, 0];

reorderButton.addEventListener('click', function() {
  abcDivs.forEach(function(element, index) {
    element.style.order = newOrder[index];
  });
});
unreorderButton.addEventListener('click', function() {
  abcDivs.forEach(function(element, index) {
    element.style.order = null;
  });
});
</script>
Run Code Online (Sandbox Code Playgroud)