Я хотел бы написать код JavaScript, который "выравнивает" DOM произвольной веб-страницы, сохраняя при этом внешний вид (но не обязательно изменение размера или другие динамические поведения)
Теоретически я считаю, что это просто вопрос записи положения каждого элемента относительно окна (например, PPK findPos(element)
), а также его вычисленных стилей CSS (например, window.getComputedStyle(element).cssText
), перемещая элемент от его родителя к прямому потомку «body», делая его абсолютно позиционированным в ранее записанной позиции, и устанавливая записанные атрибуты CSS непосредственно на элементе.
У меня был некоторый успех с этим подходом, но он не близок к совершенству:
function walkDOM(element, parent, nodes) {
parent = parent || { top : 0, left : 0, depth : 0 };
nodes = nodes || [];
if (element.nodeType === 1) {
var node = findPos(element);
node.element = element;
node.width = element.scrollWidth;
node.height = element.scrollHeight;
node.depth = parent.depth + 1;
node.cssText = window.getComputedStyle(element).cssText;
nodes.push(node);
for (var i = 0; i < element.childNodes.length; i++) {
walkDOM(element.childNodes[i], node, nodes);
}
}
return nodes;
}
// based on http://www.quirksmode.org/js/findpos.html
function findPos(element) {
var position = { left : 0, top : 0 };
if (element.offsetParent) {
do {
position.left += element.offsetLeft;
position.top += element.offsetTop;
} while (element = element.offsetParent);
}
return position;
}
var nodes = walkDOM(document.body);
nodes.forEach(function(node) {
var e = node.element;
if (e !== document.body)
e.parentNode.removeChild(e);
// e.setAttribute("style", node.cssText);
e.style.position = "absolute";
e.style.top = node.top + "px";
e.style.left = node.left + "px";
e.style.width = node.width + "px";
e.style.height = node.height + "px";
e.style.zIndex = node.depth + 1;
if (e !== document.body)
document.body.appendChild(e);
});