要互换两个 divs而不丢失事件处理器或 DOM 引用, 您可以在 DOM 中移动它们。 关键不在于更改内部 HTML, 因为从头再创建新的 DOM 节点, 而 DOM 对象上的所有先前的事件处理器都丢失了 。
但是,如果你只是将管理部的成分移到管理部的一个新位置,那么所有事件都会被固定下来,因为管理部的元素只是重新重新定居,而不会改变管理部的元素本身。
在此设定一个快速函数, 转换 DOM 中两个元素。 只要两个元素不是另一个元素的子孙, 它应该与任何两个元素一起工作 :
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);
}
您可以看到它在这里的工作 : http://jsfiddle.net/jfriend00/NThjN/
在此插入一个未插入临时元素的版本 :
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);
}
}
}
工作演示:http://jsfiddle.net/jfriend00/oq92jqrb/