gpt4 book ai didi

javascript - 查找文本(子文本节点)并将其包装在一个段落中

转载 作者:行者123 更新时间:2023-12-03 12:22:49 24 4
gpt4 key购买 nike

我需要一个函数,它可以在某些元素(对于本例为 div)中找到文本(子文本节点)并将文本包装在一个段落中。

Text1
<div>
<div>
Text2
<div>Text3</div>
</div>
<div>Text4</div>
<p>Text5</p>
</div>
<div>Text6</div>
<div>
Text7
<p>Text8</p>
Text9
</div>

试过这样做:

const fn = (doc) => {
const coll = [...doc.childNodes];
coll.forEach(el => {
if (el.tagName === 'DIV' && el.childElementCount === 0) {
el.innerHTML = `<p>${el.innerHTML}</p>`;
}
if (el.childElementCount > 0) {
el.childNodes.forEach(item => {
if (item.nodeType === 3 && item.textContent.trim()) {
const content = item.textContent.trim();
item.innerHTML = `<p>${content}</p>`;
console.log('2: ', item.innerHTML);
}
});
fn(el);
}
});
}

但它工作错误 - 在控制台日志中的 if 条件 (el.childElementCount > 0) 中,我在 p 标签中获得了所有需要的节点。但不是结果。 item.innerHTML = `<p>${content}</p>`;不要将它应用于文档:(。谁能帮忙修一下?

我需要的结果:

Text1
<div>
<div>
<p>Text2</p>
<div><p>Text3</p></div>
</div>
<div><p>Text4</p></div>
<p>Text5</p>
</div>
<div><p>Text6</p></div>
<div>
<p>Text7</p>
<p>Text8</p>
<p>Text9</p>
</div>

最佳答案

您可以使用 replaceWith()text 节点替换为 paragraph 元素

function filterTextNode(node) {
var textNodes = [];
for (node = node.firstChild; node; node = node.nextSibling) {
if (node.nodeType == 3 && node.textContent.trim()) textNodes.push(node);
else textNodes = textNodes.concat(filterTextNode(node));
}
return textNodes;
}

function wrapTextNode(text) {
var p = document.createElement('p');
p.innerHTML = text.textContent;
text.replaceWith(p);
}

const fn = (doc) => {
var textNodes = filterTextNode(doc);
textNodes.forEach(text => {
if (text.parentNode.tagName != 'P') {
wrapTextNode(text);
}
});
}

fn(document.body)
p {
color: red;
}
Text1
<div>
<div>
Text2
<div>Text3</div>
</div>
<div>Text4</div>
<p>Text5</p>
</div>
<div>Text6</div>
<div>
Text7
<p>Text8</p>
Text9
</div>

引用资料

关于javascript - 查找文本(子文本节点)并将其包装在一个段落中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60661636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com