[软件设计/软件工程] 替换整个页面上多个单词的所有例子

[复制链接]
发表于 2022-5-3 12:05:47
问题
我有几个不同的单词需要使用 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 交付

使用道具 举报

Archiver|手机版|小黑屋|吾爱开源 |网站地图

Copyright 2011 - 2012 Lnqq.NET.All Rights Reserved( ICP备案粤ICP备14042591号-1粤ICP14042591号 )

关于本站 - 版权申明 - 侵删联系 - Ln Studio! - 广告联系

本站资源来自互联网,仅供用户测试使用,相关版权归原作者所有

快速回复 返回顶部 返回列表