我使用javascript并在其中有一个带有一些html标签的div元素,如下所示,一些元素是嵌套的,我想将它们保持在同一级别,首先html是这样的:
NULL

我不知道如何提取这些嵌套元素并将它们保持在同一级别,如下所示:
<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>
&#13;
代码的性能不是太重要!
答案 0 :(得分:1)
此操作需要多久进行一次?它是性能危害还是罕见的场合?
如果它不是瓶颈,你可以选择div的所有后代并将它们附加到div。附加现有节点时,它将自动移动到适当的位置。
const myDiv = document
.querySelector('#my-div')
const allDescendants = Array.from(myDiv.getElementsByTagName('*'))
allDescendants.forEach(d => {
myDiv.appendChild(d);
});
console.log(myDiv.innerHTML);
<div id="my-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>
不确定这是否是故意的,但根据您的示例,您只想移动元素并将其他节点(如文本节点)保留在原来的位置。一个具体示例是第一个here
中的<i>
文本部分。
要实现此目的,您可以通过所有后代执行预订DFS,并构建新的平面树。完成后,将旧元素替换为新元素。
const myDiv = document
.querySelector('#my-div')
const flatDiv = document.createElement('div')
function recurseAndFlatten(parent) {
parent.childNodes.forEach(child => {
if (child.nodeType === Node.ELEMENT_NODE) {
flatDiv.appendChild(child);
recurseAndFlatten(child);
}
});
}
recurseAndFlatten(myDiv);
myDiv.replaceWith(flatDiv);
console.log(flatDiv.innerHTML);
<div id="my-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>
答案 1 :(得分:1)
您可以使用带参数.cloneNode()
的{{1}}克隆原始节点;迭代父true
的{{1}},如果节点.childNodes
不是<div>
且.previousElementSibling
不是传递给函数推送的原始父元素null
{ {1}}和.parentElement
到数组,其他.parentElement
为.tagName
,将.textContent
推送到数组;如果.nodeName
不等于#text
并且元素中仅存在.textContent
个节点,则将.nodeName
推送到数组;如果节点#text
不等于#text
且节点.outerHTML
节点为.tagName
,则推送节点#text
,.firstChild
#text
,关闭标记到数组,删除.tagName
;否则递归调用函数
.firstChild
.textContent