2009-09-01 13 views

Respuesta

93

Trivial con jQuery

$('#div1').insertAfter('#div3'); 
$('#div3').insertBefore('#div2'); 

Si usted quiere hacerlo en varias ocasiones, tendrá que utilizar diferentes selectores ya que los divs conservarán sus identificaciones, ya que se mueven alrededor.

$(function() { 
    setInterval(function() { 
     $('div:first').insertAfter($('div').eq(2)); 
     $('div').eq(1).insertBefore('div:first'); 
    }, 3000); 
}); 
+1

hay un error en alguna parte. Parece que solo funciona dos veces. http://jsbin.com/evedu –

+13

Solo esperaba que funcionara una vez. – tvanfosson

+1

@Ionut: el punto es que depende de la posición relativa de los elementos. Una vez que cambias el orden, ya no puedes encontrar el primero y el tercero por sus identificadores y necesitas trabajar de otra manera. Mi respuesta solo pretendía ilustrar la funcionalidad de los métodos para lograr la tarea solicitada, no ser una solución integral para intercambiar los primeros y terceros div en un conjunto un número arbitrario de veces. – tvanfosson

9
jQuery.fn.swap = function(b){ 
    b = jQuery(b)[0]; 
    var a = this[0]; 
    var t = a.parentNode.insertBefore(document.createTextNode(''), a); 
    b.parentNode.insertBefore(a, b); 
    t.parentNode.insertBefore(b, t); 
    t.parentNode.removeChild(t); 
    return this; 
}; 

y utilizar de esta manera:

$('#div1').swap('#div2'); 

si no desea utilizar jQuery fácilmente se podría adaptar la función.

121

No hay necesidad de utilizar una biblioteca para una tarea tan trivial:

var divs = document.getElementsByTagName("div"); // order: first, second, third 
divs[2].parentNode.insertBefore(divs[2], divs[0]); // order: third, first, second 
divs[2].parentNode.insertBefore(divs[2], divs[1]); // order: third, second, third 

Esto tiene en cuenta el hecho de que getElementsByTagName devuelve un NodeList vivo que se actualiza automáticamente para reflejar el orden de los elementos en el DOM mientras son manipulados.

También es posible usar:

var divs = document.getElementsByTagName("div"); // order: first, second, third 
divs[0].parentNode.appendChild(divs[0]);   // order: second, third, first 
divs[1].parentNode.insertBefore(divs[0], divs[1]); // order: third, second, third 

y hay varias otras permutaciones posibles, si tienes ganas de experimentar:

divs[0].parentNode.appendChild(divs[0].parentNode.replaceChild(divs[2], divs[0])); 

por ejemplo :-)

+12

Cierto, pero es difícil discutir con la elegancia y la legibilidad que proporciona algo como jQuery, sin mencionar las capacidades mejoradas listas para usar. –

+10

Dicho esto, +1 para el enfoque desnudo. –

+12

Sí, pero ¿quién solo hace esto? – tvanfosson

0

enfoque mencionado en Jquery la parte superior funcionará También puede usar JQuery y CSS. Por ejemplo, en Div uno ha aplicado class1 y div2 ha aplicado class class2 (digamos por ejemplo, cada clase de css proporciona una posición específica en el navegador), ahora puede intercambiar las clases use jquery o Javascript (que va a cambiar la posición)

4
var swap = function() { 
    var divs = document.getElementsByTagName('div'); 
    var div1 = divs[0]; 
    var div2 = divs[1]; 
    var div3 = divs[2]; 

    div3.parentNode.insertBefore(div1, div3); 
    div1.parentNode.insertBefore(div3, div2); 
}; 

Esta función puede parecer extraño, pero en gran medida se basa en estándares con el fin de funcionar correctamente. De hecho, puede funcionar mejor que the jQuery version that tvanfosson posted, lo que parece hacer el intercambio solo dos veces.

¿En qué normas se basa?

insertarAntes Inserta el nodo newChild antes del nodo secundario existente refChild. Si refChild es nulo, inserte newChild en al final de la lista de elementos secundarios. Si newChild es un objeto DocumentFragment, todos sus elementos secundarios están insertados, en el mismo orden, antes de refChild. Si newChild ya es en el árbol, primero se elimina.

0

Lo siento por chocar este hilo Tropecé con el problema de "intercambio de DOM-elementos" y jugado un poco un poco

El resultado es una "solución" jQuery nativo que parece ser muy bonito (por desgracia, no sé qué está sucediendo en las partes internas de jQuery cuando se hace esto)

El Código:

$('#element1').insertAfter($('#element2')); 

La documentación de jQuery dice t sombrero insertAfter()mueve el elemento y no clonarlo

2

.before y .after

Uso JS vainilla moderna! Mucho mejor/más limpio que antes

const div1 = document.getElementById("div1"); 
const div2 = document.getElementById("div2"); 
const div3 = document.getElementById("div3"); 

div2.after(div1); 
div2.before(div3); 

Browser Support - 84% global, el 87% de los EE.UU. como Mar '18

+0

Sin soporte de Internet Explorer todavía. – Norris

+0

No debería tener que escribir un código menos sostenible para ayudar a las personas en los navegadores antiguos o que no cumplan con los estándares. A menos que trabaje en una empresa, pocos usuarios se perderán el – Gibolt

+0

. Otros métodos funcionan igual de bien con respecto a la capacidad de mantenimiento, especialmente cuando se ajustan en una función de limpieza agradable. Estoy a favor de escribir código moderno, pero esto es una sangría. Es genial saber qué depara el futuro, pero por mucho que me desagrade todo lo relacionado con IE, es importante 'saber' cuál es el impacto de tus decisiones. En este caso, una aplicación web rota en cualquier navegador IE. Si te parece bien, ¡genial!Agregué el comentario solo para informar a cualquiera que esté buscando en Google :) – Norris

Cuestiones relacionadas