如何修改文本节点的 HTML(类型 3)/如何将其包装在 HTML 跨度中
找到文本节点 (nodeType = 3) 时,如何修改其 HTML?
从某种意义上说,假设文本节点的值(数据或文本内容)是 This is textual content
,如何用 HTML 包围它 - 比如说一个粗体标签...使其 This是文本内容
。
更改 textContent
也会写出 HTML 标记 - 这是文本内容
如何使其呈现为 This是文本内容
。
JavaScript / Jquery
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
你的问题看起来相当原始的 DOM,但你提到了 jQuery。
原始 DOM 内容:
您可以创建
b
元素,将其插入到文本节点之前,然后将文本节点移动到其中 (实时示例):另一种方法是操作文本节点父
Element
的innerHTML
属性,但如果您这样做,请注意您以这种方式更新的任何后代元素都是替换(因此新的不会有事件处理程序等附加到旧的)。进一步阅读:
jQuery:
jQuery 大多数情况下不会为您提供原始文本节点,它更多的是
Element
-专注。但是您可能会查看其wrap
,wrapAll
和wrapInner
函数。wrapInner
可能最接近您想要的(实时示例):Your question seems fairly raw DOM, but you've mentioned jQuery.
Raw DOM stuff:
You can create the
b
element, insert it before the text node, and then move the text node into it (live example):Another way is to manipulate the
innerHTML
property of the text node's parentElement
, but if you do that note that any descendant elements you update in that way are replaced (so the new ones won't have the event handlers and such attached to the old ones).Further reading:
jQuery:
jQuery mostly doesn't give you the raw text nodes, it's more
Element
-focussed. But you might look at itswrap
,wrapAll
, andwrapInner
functions.wrapInner
is probably closest to what you want (live example):使用
$(selector).html('Something here');
或
在 CSS 中创建一个类,然后使用
addClass();
来文本的父级Use
$(selector).html('<strong>Something here</strong>');
or
create a class in CSS and then use
addClass();
to the parent of the text通过 jQuery,您可以使用
.wrapInner()
在某些文本周围添加标签。例如,对于以下 HTML您可以使用以下 jQuery 代码添加
标记
这将产生以下 HTML:
With jQuery you can use
.wrapInner()
to add a tag around some text. For example, with the following HTMLYou can use the following jQuery code to add
<b>
tagsThis results in the following HTML:
您也可以这样尝试:
HTML
JavaScript
它将用
strong
标记包围#test
内的所有内容。You could also try it this way:
HTML
JavaScript
That will surround everything inside
#test
with astrong
tag.为了扩展 TJ 的答案以更好地满足 OP 的要求,不能在循环内调用所提供的函数(循环通过节点)。
就我个人而言,我必须将所有直接文本节点转换为跨度,就像OP暗示的那样(通过引用
nodeType==3
)。问题是,当转换循环内的节点时,它会抛出索引!下面是一些微调代码,可将所有文本节点转换为包装节点(优化):
该函数有效地“保存它们供以后使用”并在事后转换它们。变量声明都是压缩和内联的,所有循环都针对长节点树进行了优化。
Google 上没有任何其他关于此主题的文章,祝未来的冒险家们编码愉快。
To extend T.J's answer to better fit the OP's requirement, the provided function cannot be called within a loop (looping through nodes).
Personally, I had to convert all direct text nodes into spans, much like the OP hinted at (by referencing
nodeType==3
).The problem is that when converting the nodes inside a loop, it throws off the index! Here's some fine-tuned code that converts all text nodes into wrapped nodes (optimized):
This function effectively "saves them for later" and converts them after the fact. The variable declarations are all compacted and inline, and all the loops are optimized for long node trees.
There aren't any other articles on Google about this topic, so happy coding to any future adventurers.