2011-10-30 49 views
7

que tiene un conjunto de divs que tiene este aspecto:Invertir orden de un conjunto de elementos

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

Pero quiero que dar la vuelta para que se vea así:

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

Para que cuando se agrega un div irá al final de la lista ....

¿Cómo puedo hacer esto (o hay una mejor manera de hacerlo)?

+0

_ "Así que cuando se añade un div que irá al final de la lista ...." _ - es su pregunta de cómo revertir elementos existentes (algunas buenas respuestas para eso a continuación), o cómo agregar nuevos elementos en un lugar en particular? A partir de su salida deseada, si agregó un nuevo '

6
' ¿debería ir por debajo de 1 o por encima de 5? – nnnnnn

Respuesta

11

envuelta como un buen func jQuery iones disponibles en cualquier conjunto de selecciones:

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

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

Editar: fijado a apoyar selecciones jQuery arbitrarias

+1

+1 fácil de leer, comprender, mantener y cambiar por cualquier desarrollador. –

2

Una manera:

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

+1 por brevedad. –

6

sin biblioteca:

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 al estilo:

$.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

Lindo, pero mucho más trabajo y código de lo necesario. – Phrogz

+0

Sí, también es muy difícil de leer para todos, y por lo tanto, cambia y se mantiene cuando se compara con la solución a continuación. –

+0

@Phrogz y Michael Durrant: si prefiere más de dos reflujos que puede [esta versión] (http://jsfiddle.net/akfHm/). – Saxoier

0

Otro (simple?) de vainilla Javascript respuesta: 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]); 
} 

Alternativamente, un método más corto pero menos eficiente: http://jsfiddle.net/d9fNv/1/

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

Una solución de vainilla JS:

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

} 
Cuestiones relacionadas