node .cloneNode() true; .childNodes <div>, node .previousElementSibling null .parentElement , push .parentElement .tagName .textContent , .nodeName - #text, .textContent ; .nodeName #text, #text , .outerHTML ; node .tagName #text, node .firstChild node - #text, node .tagName, .firstChild .textContent, , T219 > ;
const clone = document.querySelector("div").cloneNode(true);
let flattenNodes = (el, not = el, res = []) => {
for (let node of el.childNodes) {
if (node.nodeName === "#text" && !node.childNodes.length) {
if (node.previousElementSibling && node.parentElement !== not) {
let tag = node.parentElement.tagName.toLowerCase();
res.push(`<${tag}>${node.textContent}</${tag}>`);
} else {
res.push(node.textContent);
}
}
if (node.nodeName !== "#text"
&& Array.from(node.childNodes).every(e => e.nodeName === "#text")) {
res.push(node.outerHTML);
} else {
if (node.tagName && node.tagName !== "#text"
&& node.firstChild.nodeName === "#text") {
let tag = node.tagName.toLowerCase();
res.push(`<${tag}>${node.firstChild.textContent}</${tag}>`);
node.firstChild.remove();
flattenNodes(node, not, res);
}
}
}
return res
}
let res = flattenNodes(clone);
document.querySelector("pre")
.textContent = res.join("");
<div>
<p>
some text on here 1
<i>
some italic
<b>text</b>
here
</i> text text text
</p>
<b>
some bold text on here
</b>
</div>
<pre></pre>
Hide result