Восстановить элемент, удаленный с parentNode.removeChild

Знаете ли вы, как я могу восстановить элемент, удаленный с помощью JavaScript, следующим образом:

elem1.parentNode.removeChild(elem1);

3 ответа

Решение

Как написано в документации MDN removeChild вернет ссылку на удаленный дочерний узел. Использование как это:

var oldChild = element.removeChild(child);
element.removeChild(child);

В дальнейшем:

Удаленный дочерний узел все еще существует в памяти, но больше не является частью DOM. Вы можете повторно использовать удаленный узел позже в своем коде через ссылку на объект oldChild.

Без сохранения элемента в переменной до его удаления вы не сможете отменить removeChild() вызов. Вызов функции самостоятельно без назначения полностью удалит ее из DOM и памяти.

Вы можете заставить JavaScript хранить его в памяти для последующего использования / восстановления, выполнив это:

var restoration_element = elem1.parentNode.removeChild(elem1);

Использование последнего синтаксиса с оператором присваивания удалит элемент elem1 из списка отображения, но сохраните его в качестве справки для последующего использования.

Мне нужно было не только получить ссылку на удаленный узел, но и вставить удаленный узел обратно в то же место, откуда он был удален. Поэтому мне пришлось использовать стек примерно так:

var stack = [];
function removeWithStack() {
    let elem = this,
        parent = elem.parentNode;

    // Note: index here is ES6 only; for ES5 see https://stackru.com/a/23528539/2065702
    let action = {
        "index": Array.from(parent.children).indexOf(elem),
        "parent": parent,
        "elem": parent.removeChild(elem)
    }

    stack.push(action);
}

function popAddStack() {
    let action = stack.pop();
    action.parent.insertBefore(action.elem, action.parent.children[action.index]);
}

var ps = document.querySelectorAll("p");

var stack = [];
function removeWithStack() {
 let elem = this,
        parent = elem.parentNode;
    
    // Note: index here is ES6 only; for ES5 see https://stackru.com/a/23528539/2065702
    let action = {
     "index": Array.from(parent.children).indexOf(elem),
        "parent": parent,
     "elem": parent.removeChild(elem)
    }
    
    stack.push(action);
}

function popAddStack() {
 let action = stack.pop();
    action.parent.insertBefore(action.elem, action.parent.children[action.index]);
}

document.querySelector("button").onclick = popAddStack;

ps.forEach(function(p) {
 p.onclick = removeWithStack;
});
button,
p {
    cursor: pointer;
}
<div>
    <p>Test 1</p>
    <p>Test 2</p>
    <p>Test 3</p>
    <p>Test 4</p>
    <p>Test 5</p>
</div>
<button>Undo</button>

Другие вопросы по тегам