从 DOM 变为 modified/removed 后恢复 Node/Element
Restore Node/Element after it has been modified/removed from DOM
我需要一种方法来检测是否有任何 DOM Node/Element 被删除或修改,并立即将该元素恢复到之前的状态。
每次在第一个 运行 之后触发 MutationObserver 时,我尝试 "backup" body 节点并将 body.innerHTML 设置为其原始状态,但这会使浏览器崩溃。
有没有什么快速的方法可以恢复被修改或删除的元素?
这就是我所能提供的(有点老套,但它有效)。单击test
或test #2
删除节点: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);
});
如果你想保留所有的节点(又名document.querySelectorAll('*');
),那么我认为从性能的角度来看它变得非常沉重。
问题是记录删除的节点。
在我的例子中,我为文档中的每个节点生成了一个 xpath。 childList
触发时,再次生成
这样我就可以知道被删除的节点的xpath,并且可以使用xpath来恢复节点。
mutation.removedNodes.map((node) => {
const xpath = node.xpath // which is generated each time `childList` triggered
})
希望能帮到你。
我需要一种方法来检测是否有任何 DOM Node/Element 被删除或修改,并立即将该元素恢复到之前的状态。
每次在第一个 运行 之后触发 MutationObserver 时,我尝试 "backup" body 节点并将 body.innerHTML 设置为其原始状态,但这会使浏览器崩溃。
有没有什么快速的方法可以恢复被修改或删除的元素?
这就是我所能提供的(有点老套,但它有效)。单击test
或test #2
删除节点: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);
});
如果你想保留所有的节点(又名document.querySelectorAll('*');
),那么我认为从性能的角度来看它变得非常沉重。
问题是记录删除的节点。
在我的例子中,我为文档中的每个节点生成了一个 xpath。 childList
触发时,再次生成
这样我就可以知道被删除的节点的xpath,并且可以使用xpath来恢复节点。
mutation.removedNodes.map((node) => {
const xpath = node.xpath // which is generated each time `childList` triggered
})
希望能帮到你。