【问题标题】:jQuery's .html ( ) function behaves unexpectedly when trying to wrap elements on pagejQuery .html ( ) 函数在尝试在页面上包装元素时出现异常行为
【发布时间】:2014-03-20 16:23:36
【问题描述】:

我正在获取页面上包含“em”的每个文本节点

然后我将文本节点的父节点的 html(即文本)替换为新的 HTML。

在您的控制台上尝试以下代码。它应该突出显示当前页面上的所有“em”文本。

但事实并非如此。相反,它弄乱了整个页面。我做错了什么?

我认为 :contains 寻找文本节点,而不是 HTML。

var someString = "em";
$(':contains("' + someString + '")').each(function ()
{
  var oldHTML = $(this).html();
  var regex = new RegExp(someString, "g");
  var newHTML = oldHTML.replace(regex, '<span style="background-color: yellow;">' + someString + '</span>');
  $(this).html(newHTML);
});

很抱歉,我无法为我的奇怪问题找到更直观的标题 - 如果可以,请随时更改它! :)

谢谢!

编辑:

原来我的 .replace(...) 也在替换 html 标签,而不仅仅是纯文本。

我应该一直在做类似的事情(虽然我不确定这是正确的正则表达式):

var regex = new RegExp("<.*>(" + someString + ")\/.*>", "g");
var newHTML = oldHTML.replace(regex, '<span style="background-color: yellow;">' + someString + '</span>');

【问题讨论】:

  • 似乎对我有用。 jsfiddle.net/zUMB9。你的 html 是什么样的?
  • jsfiddile 不可靠,因为它从未处于“真实条件”下 - 在我们现在所在的页面上尝试一下。打开浏览器的控制台并运行代码。
  • 这是因为您不只是在寻找纯文本。你不想要 html 元素。
  • 哦,我明白了 - 我的替换功能还包含 html 标签,而不仅仅是纯文本 - 该死的你是对的!谢谢! :) 如果我能想出一个只会替换纯文本的正则表达式,那就太酷了..让我们看看..
  • 为此使用正则表达式真的很丑陋。您可以使用完整的 DOM API,它允许您直接定位文本节点。为什么不利用它。 DOM 毕竟不是字符串。它是对象的层次结构。您的:contains 选择将为您提供每次出现的文本字符串的所有祖先,包括bodydocumentElement

标签: javascript jquery html regex replace


【解决方案1】:

添加我的两美分作为官方答案:这是因为您不只是在寻找纯文本。你不想要 html 元素。

在这里查看更多问题:regular expression to extract text from HTML

你最好在服务器上做高亮显示,在那里你可以很容易地分辨出什么是文本。

【讨论】:

  • 你是对的 - 与我在编辑中尝试的 RegEx 类似(即正确)的东西会解决问题吗?
  • 如另一篇文章所述,浏览器允许使用劣质 html,因此几乎不可能使用正则表达式捕获所有内容。但是,如果您 100% 确定您和团队中的每个人都可以创建完美的代码,那么您也许可以摇摆它。我什么都不保证。 =)
猜你喜欢
  • 2017-07-08
  • 1970-01-01
  • 2014-04-26
  • 2016-09-08
  • 2023-01-27
  • 2016-01-26
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多