jquery 用 html 替换匹配的文本

标签 jquery html

我想使用 jQuery 动态地将所有与给定正则表达式匹配的文本包含在特定标记中。例如:

<div class="content">
<div class="spamcontainer">
Eggs and spam is better than ham and spam.
<img src="spam-and-eggs.jpg">
I do not like green eggs and spam, though.
</div>
</div>

如果我的正则表达式是 ham|spam我想附上 <span class='meat-product'>那么我想转换为

<div class="content">
<div class="spamcontainer">
Eggs and <span class='meat-product'>spam</span> is better than <span class='meat-product'>ham</span> and <span class='meat-product'>spam</span>.
<img src="spam-and-eggs.jpg">
I do not like green eggs and <span class='meat-product'>spam</span>, though.
</div>
</div>

这是我的问题。我知道如何只用文本和 html 来做到这一点:

$("div.content").text(function() {
    return $(this).text().replace(/ham|spam/, function(match) {
        return '<span class="meat-product">' + match + '</span>';
        });
});

$("div.content").html(function(_, html) {
    return html.replace(/ham|spam/, function(match) {
        return '<span class="meat-product">' + match + '</span>';
        });
});

但前者用文本替换文本(所以我得到文本 <span ... 而不是 <span> 元素),后者匹配 hamspam在任何 HTML 中,而不仅仅是在文本中。

我怎样才能只匹配文本,而且还能够用 HTML 元素替换该文本?

最佳答案

How can I match only text, but also be able to replace that text with HTML elements?

您可以选择所有后代元素和文本节点并过滤该集合以仅包含文本节点。然后您可以简单地用修改后的字符串替换每个文本节点:

$(".content *").contents().filter(function() {
  return this.nodeType === 3;
}).replaceWith(function () {
  return this.textContent.replace(/(ham|spam)/g, '<span class="meat-product">$1</span>');
});

$(".content *").contents().filter(function() {
  return this.nodeType === 3;
}).replaceWith(function() {
  return this.textContent.replace(/(ham|spam)/g, '<span class="meat-product">$1</span>');
});
.meat-product {
  color: #f00;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="content">
  <div class="spamcontainer">
    Eggs and spam is better than ham and spam.
    <img src="spam-and-eggs.jpg">I do not like green eggs and spam, though.
  </div>
</div>

  • 使用通用选择器*来选择所有后代元素(当然你也可以使用$('.content').children(),但是只会深入一层...您可能会遇到嵌套元素,这意味着您将需要检索所有 文本节点,因此我使用* 来选择内容所有后代元素)。
  • .contents() method获取所有文本节点和子元素。
  • 然后过滤集合,以便仅包含文本节点,因为我们不想替换任何 HTML。文本节点的nodeType属性值为3。
  • 最后,.replaceWith() method用于用替换的文本字符串更新每个文本节点。 .replaceWith() 方法的好处是您可以用 HTML 字符串替换文本。
  • 您还可以像上面的示例一样使用捕获组来缩短您的.replace() 方法。然后,您可以简单地在 span 元素之间替换 $1

关于jquery 用 html 替换匹配的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34598048/

相关文章:

javascript - 如何将容器的高度设置为视口(viewport)高度减去 300 像素的高度 slider ?

html - 悬停一个 div 使另一个 div 出现

html - 属性的 <label> 是否必须是唯一的?

javascript - 使用 jQuery 从 iframe 中的 url 获取标题字符串?

html - 用什么代替 FrontPage?

javascript - 通过减少选择器重复来提高 JavaScript 代码性能

jquery - 打开了下拉导航,但无法关闭它(jQuery)

javascript - 让默认操作先执行

javascript - jQuery.ajaxSetup() 被忽略

javascript - dblclick 不适用于触摸设备