javascript - Restore NodeElement after it has been modifiedremoved from DOM - Stack Overflow

I am in need of a way to detect if any DOM NodeElement has been removed or modified and instantly rest

I am in need of a way to detect if any DOM Node/Element has been removed or modified and instantly restore that element to the state in which it was before.

I tried to "backup" the body node and set the body.innerHTML to its original state every time MutationObserver is fired after the first run but that crashes the browser.

Is there any fast way to restore elements that have been modified or removed?

I am in need of a way to detect if any DOM Node/Element has been removed or modified and instantly restore that element to the state in which it was before.

I tried to "backup" the body node and set the body.innerHTML to its original state every time MutationObserver is fired after the first run but that crashes the browser.

Is there any fast way to restore elements that have been modified or removed?

Share asked Oct 16, 2015 at 7:19 SpoonGuySpoonGuy 752 silver badges4 bronze badges 3
  • 1 You can't restore a DOM element if you removed it. The only thing you can do is store it in a variable and later retrieve the DOM element from the variable. But once it's deleted, it's gone. – Joshua Bakker Commented Oct 16, 2015 at 7:30
  • wouldn't it be easier to keep them from being removed? – dandavis Commented Oct 16, 2015 at 7:30
  • 1 Well, how would I prevent them being removed or modified? The reason why I need this is to prevent modifications through the Dev-Tools of a browser. – SpoonGuy Commented Oct 16, 2015 at 8:16
Add a ment  | 

2 Answers 2

Reset to default 3

This is all I can e with (a bit hacky, but it works). Click test or test #2 for removing nodes: http://codepen.io/zvona/pen/BowXaN?editors=001

HTML:

<div class='preserve'>
  <h1>There can be anything inside this</h1>
  <p>Some content</p>
</div>

<div class='preserve'>
  <p>Some more content</p>
</div>

JS:

var preserved = document.querySelectorAll('.preserve');
var config = { attributes: true, childList: true, characterData: true };

var createFragment = function(elem, i) {
  var frag = document.createElement('div');
  var id = 'id-'+ new Date().getTime() +'-'+ i;
  frag.setAttribute('id', id);
  elem.parentNode.insertBefore(frag, elem);
  elem.dataset.frag = id;
  observer.observe(elem.parentNode, config);
}

var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    if (!mutation.addedNodes.length && mutation.removedNodes.length) {
      Array.prototype.forEach.call(mutation.removedNodes, function(elem) {
        var frag = document.querySelector('#'+ elem.dataset.frag);
        frag.parentNode.replaceChild(elem, frag);
        createFragment(elem, frag.id.split('-')[2]);
      });
    }
  });
});

Array.prototype.forEach.call(preserved, function(preserve, i) {
  createFragment(preserve, i);
});

If you want to preserve all the nodes (aka document.querySelectorAll('*');), then I think it bees very heavy from performance point of view.

The problem is to record the removed nodes.

In my case, I generate a xpath for every nodes in the document. When childList triggered, generate again.

So that I can know the removed node's xpath, and can use the xpath to restore the node.

mutation.removedNodes.map((node) => {
  const xpath = node.xpath // which is generated each time `childList` triggered
})

Hope to help you.

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1744827365a4595874.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信