Um zwei divs zu vertauschen, ohne Event-Handler zu verlieren oder DOM-Referenzen zu brechen, können Sie sie einfach im DOM verschieben. Der Schlüssel besteht NICHT darin, den Befehl innerHTML zu ändern, da dadurch neue DOM-Knoten von Grund auf neu erstellt werden und alle früheren Ereignishandler für diese DOM-Objekte verloren gehen.
Wenn Sie jedoch nur die DOM-Elemente an eine neue Stelle im DOM verschieben, bleiben alle Ereignisse angehängt, da die DOM-Elemente nur neu gerendert werden, ohne die DOM-Elemente selbst zu ändern.
Hier ist eine schnelle Funktion, die zwei Elemente im DOM tauschen würde. Es sollte mit zwei Elementen arbeiten, solange man nicht ein Kind des anderen ist:
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);
}
Sie können es hier sehen arbeiten: http://jsfiddle.net/jfriend00/NThjN/
Und hier ist eine Version, die ohne die vorübergehende funktioniert Element eingefügt:
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);
}
}
}
Arbeits Demo: http://jsfiddle.net/jfriend00/oq92jqrb/
Ich könnte hinzufügen, dass dieser Code der einzige ist, der tatsächlich funktioniert, außer für 2 Ecken Fälle: swapping die n-erste oder n-letzte Artikel. – philk
@philk - Ich verstehe nicht, welche Ecke Fälle, die Sie denken, funktionieren nicht. Bitte erkläre. Vielleicht ein jsFiddle zeigen. – jfriend00
Wirklich nette Arbeit hier! Leistungsmäßig, was schlagen Sie vor? – Jessica