【发布时间】:2019-09-12 03:57:52
【问题描述】:
我正在编写一个 JavaScript 脚本,它将遍历 DOM 并将特定关键字包装在 <span> 标记中。我希望我的script 将任何出现的单词pan 包装在<span> 中,这样我就可以使用<span style='color: red' 对其进行样式设置。我其实不想用pan这个词,我只是用它作为例子。
我已经在这里查看了许多类似的帖子,但没有一个能解决我的问题。大多数要么是核心的、过于复杂和令人困惑的,要么是过于简单的,并且不能按我的预期工作。
这是我目前所写的:
<html>
<body>
<p>My <span style='font-weight: bold'>favorite</span> kitchen item is the pan.</p>
<p>A pan can also be used as a weapon.</p>
<script>
// walk the document body
function walk (node) {
// if text node
if (node.nodeType == 3) {
// will always be an element
const parent = node.parentNode;
// ignore script and style tags
const tagName = parent.tagName;
if (tagName !== 'SCRIPT' && tagName !== 'STYLE') {
// wrap occurrences of 'pan' in a red `<span>` tag
const span = '<span style="color: red">pan</span>';
parent.innerHTML = parent.innerHTML.replace (/pan/g, span)
}
}
node = node.firstChild;
while (node) {
walk (node);
node = node.nextSibling;
}
}
walk (document.body)
</script>
</body>
</html>
此代码大部分时间都按预期运行。然而,在这个例子中,它没有。如果你要运行这段代码,this 将是结果。
我知道是什么原因造成的。但是,我不知道如何解决它。
两个文本节点My 和kitchen item is the pan. 的父元素具有以下innerHTML:My <span style="font-weight: bold">favorite</span> kitchen item is the pan. <span> 中的“pan”正在被替换,并导致了问题。
如果我使用parentNode.textContent 而不是parentNode.innerHTML,它不会将其包装在<span> 标记中,而是将其作为可见文本插入。
我知道这可以通过将/pan/g 更改为/\bpan\b/g 来解决,但这只能解决我创建的这个示例。我需要将 <span> 标记仅插入到文本内容中,而不是标记名称或其他 HTML。
我该怎么办?
【问题讨论】:
-
tagName !== 'script' || tagName !== 'style'该条件将始终为true。 -
@ziggywiggy 哎呀,我会解决的。
-
@TylerRoper 已修复。谢谢!我知道出了什么问题,我只是快速编写这个示例来演示出了什么问题,而没有共享大量脚本。
-
您的问题解决了吗?或者你还需要一个答案!
-
@ZeeshanAhmadKhalil 不,还没有解决。那只是一个小错误。
标签: javascript html css dom nodes