如何交换2个html元素并保存事件监听器?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (114)

我需要交换两个div与大量的内容(表格,选择框,输入等)与事件监听器上的元素等。

提问于
用户回答回答于

这是一个更简单的函数,用于交换两个元素而不实际重新加载元素。

function swapElements(obj1, obj2) {
    obj2.nextSibling === obj1
    ? obj1.parentNode.insertBefore(obj2, obj1.nextSibling)
    : obj1.parentNode.insertBefore(obj2, obj1); 
}

注意:如果obj1有像YouTube这样的嵌入式视频,交换时不会重新加载。只是元素的位置发生了变化。

用户回答回答于

要交换两个div而不丢失事件处理程序或打破DOM引用,你可以将它们移动到DOM中。关键是不要改变innerHTML,因为从头开始重新创建新的DOM节点,并且这些DOM对象上的所有事件处理程序都丢失了。

但是,如果你只是将DOM元素移动到DOM中的新位置,则所有事件都将保持连接状态,因为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);
}

这是一个没有插入临时元素的版本:

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);
        }
    }
}

扫码关注云+社区

领取腾讯云代金券