2011-10-30 17 views
7

tôi có một tập hợp các div trông như thế này:Đảo ngược trình tự của một tập hợp các yếu tố

<div id="con"> 
    <div> 1 </div> 
    <div> 2 </div> 
    <div> 3 </div> 
    <div> 4 </div> 
    <div> 5 </div> 
</div> 

Nhưng tôi muốn họ để lật để nó trông như thế này:

<div> 5 </div> 
<div> 4 </div> 
<div> 3 </div> 
<div> 2 </div> 
<div> 1 </div> 

Vì vậy mà khi một div được thêm vào nó sẽ đi đến cuối danh sách ....

Làm cách nào để tôi thực hiện việc này (hoặc có cách nào tốt hơn để thực hiện việc này)?

+0

_ "Vì vậy mà khi một div được thêm vào nó sẽ đi đến tận cùng của danh sách ...." _ - là câu hỏi của bạn như thế nào để đảo ngược các phần tử hiện có (một số câu trả lời hay cho câu hỏi dưới đây), hoặc cách thêm các phần tử mới vào một vị trí cụ thể? Bắt đầu từ kết quả mong muốn của bạn, nếu bạn đã thêm một '

6
' mới, nó có nên đi dưới 1 hoặc cao hơn 5 không? – nnnnnn

Trả lời

11

Wrapped lên như một jQuery funct đẹp ion có sẵn trên bất kỳ tập hợp các lựa chọn:

$.fn.reverseChildren = function() { 
    return this.each(function(){ 
    var $this = $(this); 
    $this.children().each(function(){ $this.prepend(this) }); 
    }); 
}; 
$('#con').reverseChildren(); 

Proof: http://jsfiddle.net/R4t4X/1/

Edit: cố định để hỗ trợ lựa chọn jQuery tùy ý

+1

+1 dễ đọc, dễ hiểu, duy trì và thay đổi bởi bất kỳ nhà phát triển nào. –

2

Một cách:

function flip(){ 
var l=$('#con > div').length,i=1; 
while(i<l){ 
    $('#con > div').filter(':eq(' + i + ')').prependTo($('#con')); 
    i++; 
} 
} 
+0

+1 cho ngắn gọn. –

6

mà không có một thư viện:

function reverseChildNodes(node) { 
    var parentNode = node.parentNode, nextSibling = node.nextSibling, 
     frag = node.ownerDocument.createDocumentFragment(); 
    parentNode.removeChild(node); 
    while(node.lastChild) 
     frag.appendChild(node.lastChild); 
    node.appendChild(frag); 
    parentNode.insertBefore(node, nextSibling); 
    return node; 
} 

reverseChildNodes(document.getElementById('con')); 

jQuery-style:

$.fn.reverseChildNodes = (function() { 
    function reverseChildNodes(node) { 
     var parentNode = node.parentNode, nextSibling = node.nextSibling, 
      frag = node.ownerDocument.createDocumentFragment(); 
     parentNode.removeChild(node); 
     while(node.lastChild) 
      frag.appendChild(node.lastChild); 
     node.appendChild(frag); 
     parentNode.insertBefore(node, nextSibling); 
     return node; 
    }; 
    return function() { 
     this.each(function() { 
      reverseChildNodes(this); 
     }); 
     return this; 
    }; 
})(); 

$('#con').reverseChildNodes(); 

jsPerf Test

+0

Dễ thương, nhưng nhiều công việc và mã hơn là cần thiết. – Phrogz

+0

Có, cũng rất khó cho tất cả để đọc và do đó thay đổi và duy trì khi so sánh với giải pháp dưới đây. –

+0

@Phrogz và Michael Durrant: Nếu bạn thích nhiều hơn hai bản chỉnh sửa, bạn có thể [phiên bản này] (http://jsfiddle.net/akfHm/). – Saxoier

0

khác (đơn giản hơn?) vani javascript phản ứng: http://jsfiddle.net/d9fNv/

var con = document.getElementById('con'); 
var els = Array.prototype.slice.call(con.childNodes); 
for (var i = els.length -1; i>=0; i--) { 
    con.appendChild(els[i]); 
} 

Cách khác, phương pháp ngắn hơn nhưng kém hiệu quả hơn: http://jsfiddle.net/d9fNv/1/

var con = document.getElementById('con'); 
Array.prototype.slice.call(con.childNodes).reverse().forEach(function(el) { 
    con.appendChild(el); 
}); 
4

Một giải pháp vani JS:

function reverseEls(elem){ 
     for (var i=0;i<elem.childNodes.length;i++) 
      elem.insertBefore(elem.childNodes[i], elem.firstChild); 

} 
Các vấn đề liên quan