找回密码
 立即注册
软件设计/软件工程 2022-05-03 210 0star收藏 版权: . 保留作者信息 . 禁止商业使用 . 禁止修改作品
问题
我有几个不同的单词需要使用 Javascript 替换为不同的单词。我以为我可以使用替换功能来实现这一点,但它似乎只适用于第一次调用。

但是,由于我需要替换的单词彼此相似,这会导致一些问题,我不确定如何解决。我还需要使用 Javascript 而不是 jQuery 来执行此操作。谢谢。

例子:
  1. function color() {
  2. document.body.innerHTML = document.body.innerHTML.replace(/A/g, "<span style='color:#FF0000;'>A</span>");
  3. document.body.innerHTML = document.body.innerHTML.replace(/A1/g, "<span style='color:#0000FF;'>A1</span>");
  4. }
复制代码
  1. <html>
  2.   <body>
  3.     <h3>A</h3>
  4.     <h3>A1</h3>
  5.     <button onclick="color()">click</button>
  6.   </body>
  7. </html>
复制代码

回答
在几乎所有情况下,body.innerHTML 回复都不应该完成。它似乎可以处理一些琐碎的例子,但对于任何非平凡的应用程序都会失败。不要使用正则表达式解析 HTML。

要了解为什么这是一个严重的问题,请考虑您的文档是否包含以下元素:

<div style="color: #AA144"></div>

您的正则表达式如何知道不将一堆跨度插入每个 A 或 A1 的属性字符串中?将不会。

相反,使用文档对象模型,它是一个表示标记的树结构(所有解析都为您完成!)。遍历树中的节点,对每个节点的textContent进行操作,进行替换:
  1. for (const parent of document.querySelectorAll("body *")) {
  2.   for (const child of parent.childNodes) {
  3.     if (child.nodeType === Node.TEXT_NODE) {
  4.       const pattern = /(A1|A)/g;
  5.       const replacement = "<span style='color:#FF0000;'>$1</span>";
  6.       const subNode = document.createElement("span");
  7.       subNode.innerHTML = child.textContent.replace(pattern, replacement);
  8.       parent.insertBefore(subNode, child);
  9.       parent.removeChild(child);
  10.     }
  11.   }
  12. }

  13. body {
  14.   background: white;
  15. }

  16. <div>
  17.   foobar
  18.   <div>
  19.     <div style="color: #AA144">
  20.       foobazz A1
  21.     </div>
  22.     foo quuz AA
  23.     <h4>coraaAge</h4>
  24.     <p>
  25.       A bA bAA ello world A1
  26.     </p>
  27.   </div>
  28. </div>
复制代码

我从另一个答案改编了代码。但是,这个问题并没有真正被欺骗。





上一篇:为大于 5GB 的文件计算 Amazon-S3 Etag 的算法是什么?
下一篇:如何使用 rspec 测试 ActionMailer 交付