Para intercambiar dos divisores sin perder manipuladores de eventos o romper las referencias DOM, puede simplemente moverlos en el DOM. La clave es NO cambiar el innerHTML porque eso recrea nuevos nodos DOM desde cero y se pierden todos los manejadores de eventos anteriores en esos objetos DOM.
Pero, si solo mueves los elementos DOM a un lugar nuevo en el DOM, todos los eventos permanecen adjuntos porque los elementos DOM solo se vuelven a generar sin cambiar los elementos DOM.
Aquí hay una función rápida que intercambia dos elementos en el DOM. Se debe trabajar con cualquiera de los dos elementos, siempre y cuando uno no es un hijo del otro:
function swapElements(obj1, obj2) {
// create marker element and insert it where obj1 is
var temp = document.createElement("div");
obj1.parentNode.insertBefore(temp, obj1);
// move obj1 to right before obj2
obj2.parentNode.insertBefore(obj1, obj2);
// move obj2 to right before where obj1 used to be
temp.parentNode.insertBefore(obj2, temp);
// remove temporary marker node
temp.parentNode.removeChild(temp);
}
se puede ver que funcione aquí: http://jsfiddle.net/jfriend00/NThjN/
Y aquí hay una versión que funciona sin el temporal elemento insertado: demo
function swapElements(obj1, obj2) {
// save the location of obj2
var parent2 = obj2.parentNode;
var next2 = obj2.nextSibling;
// special case for obj1 is the next sibling of obj2
if (next2 === obj1) {
// just put obj1 before obj2
parent2.insertBefore(obj1, obj2);
} else {
// insert obj2 right before obj1
obj1.parentNode.insertBefore(obj2, obj1);
// now insert obj1 where obj2 was
if (next2) {
// if there was an element after obj2, then insert obj1 right before that
parent2.insertBefore(obj1, next2);
} else {
// otherwise, just append as last child
parent2.appendChild(obj1);
}
}
}
de trabajo: http://jsfiddle.net/jfriend00/oq92jqrb/
Debo agregar que este código es el único que realmente funciona, excepto en dos casos de esquina: cambiar el n-primero o n-último ít. – philk
@philk - No entiendo qué casos de esquina crees que no funcionan. Por favor explique. Quizás muestre un jsFiddle. – jfriend00
¡Muy buen trabajo aquí! En cuanto a rendimiento, ¿qué sugieres que hagas? – Jessica