如何修改文本节点的 HTML(类型 3)/如何将其包装在 HTML 跨度中

发布于 2024-12-13 15:20:07 字数 349 浏览 0 评论 0 原文

找到文本节点 (nodeType = 3) 时,如何修改其 HTML?

从某种意义上说,假设文本节点的值(数据或文本内容)是 This is textual content,如何用 HTML 包围它 - 比如说一个粗体标签...使其 This是文本内容

更改 textContent 也会写出 HTML 标记 - 这是文本内容

如何使其呈现为 This是文本内容

JavaScript / Jquery

On finding a text node (nodeType = 3), how to tinker with its HTML?

In the sense, suppose the text node's value (data or textContent) is This is textual content, how to surround this with HTML - say a bold tag...make it This is textual content.

Changing the textContent writes out the HTML tags as well - <b>This is textual content</b>

How to make it render as This is textual content.

Javascript / Jquery

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

余罪 2024-12-20 15:20:07

你的问题看起来相当原始的 DOM,但你提到了 jQuery。

原始 DOM 内容:

您可以创建 b 元素,将其插入到文本节点之前,然后将文本节点移动到其中 (实时示例):

function wrapNode(textNode, tagName) {
    var wrapper = document.createElement(tagName);
    textNode.parentNode.insertBefore(wrapper, textNode);
    wrapper.appendChild(textNode);
    return wrapper;
}

另一种方法是操作文本节点父 ElementinnerHTML 属性,但如果您这样做,请注意您以这种方式更新的任何后代元素都是替换(因此新的不会有事件处理程序等附加到旧的)。

进一步阅读:

jQuery:

jQuery 大多数情况下不会为您提供原始文本节点,它更多的是 Element-专注。但是您可能会查看其 wrapwrapAllwrapInner 函数。 wrapInner 可能最接近您想要的(实时示例):

$(parent_element_selector).click(function() {
  $(this).wrapInner("<b>").unbind("click");
});

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):

function wrapNode(textNode, tagName) {
    var wrapper = document.createElement(tagName);
    textNode.parentNode.insertBefore(wrapper, textNode);
    wrapper.appendChild(textNode);
    return wrapper;
}

Another way is to manipulate the innerHTML property of the text node's parent Element, 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 its wrap, wrapAll, and wrapInner functions. wrapInner is probably closest to what you want (live example):

$(parent_element_selector).click(function() {
  $(this).wrapInner("<b>").unbind("click");
});
以往的大感动 2024-12-20 15:20:07

使用 $(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

三寸金莲 2024-12-20 15:20:07

通过 jQuery,您可以使用 .wrapInner() 在某些文本周围添加标签。例如,对于以下 HTML

<span>Text goes here</span>

您可以使用以下 jQuery 代码添加 标记

$('span').wrapInner('<b>');

这将产生以下 HTML:

<span><b>Text goes here</b></span>

With jQuery you can use .wrapInner() to add a tag around some text. For example, with the following HTML

<span>Text goes here</span>

You can use the following jQuery code to add <b> tags

$('span').wrapInner('<b>');

This results in the following HTML:

<span><b>Text goes here</b></span>
壹場煙雨 2024-12-20 15:20:07

您也可以这样尝试:

HTML

<div id="test">
    This is textual content
</div>

JavaScript

$('#test').wrapInner('<strong>');

它将用 strong 标记包围 #test 内的所有内容。

You could also try it this way:

HTML

<div id="test">
    This is textual content
</div>

JavaScript

$('#test').wrapInner('<strong>');

That will surround everything inside #test with a strong tag.

雪化雨蝶 2024-12-20 15:20:07

为了扩展 TJ 的答案以更好地满足 OP 的要求,不能在循环内调用所提供的函数(循环通过节点)。

就我个人而言,我必须将所有直接文本节点转换为跨度,就像OP暗示的那样(通过引用nodeType==3)。

问题是,当转换循环内的节点时,它会抛出索引!下面是一些微调代码,可将所有文本节点转换为包装节点(优化):

for(var txtnodes=[],nodes=XXXX.childNodes,i=0,j=nodes.length;i<j;i++) {
 if(nodes[i].nodeType==3) txtnodes[txtnodes.length] = nodes[i];
}
for(var m=0,n=txtnodes.length;m<n;m++) {
 var span = document.createElement('span');
 pg.insertBefore(span,txtnodes[m]);
 span.appendChild(txtnodes[m]);
}

该函数有效地“保存它们供以后使用”并在事后转换它们。变量声明都是压缩和内联的,所有循环都针对长节点树进行了优化。

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):

for(var txtnodes=[],nodes=XXXX.childNodes,i=0,j=nodes.length;i<j;i++) {
 if(nodes[i].nodeType==3) txtnodes[txtnodes.length] = nodes[i];
}
for(var m=0,n=txtnodes.length;m<n;m++) {
 var span = document.createElement('span');
 pg.insertBefore(span,txtnodes[m]);
 span.appendChild(txtnodes[m]);
}

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文