【问题标题】:Finding every "string" on a page and replacing it with another查找页面上的每个“字符串”并将其替换为另一个
【发布时间】:2014-11-16 08:51:51
【问题描述】:

我正在为网页上的查找和替换 chrome 扩展程序,这是我目前的查找和替换代码;

var elements = document.getElementsByTagName("*");
var find = "e";
var replace = "A";

for (var i = 0; i < elements.length; ++i) {
    if (elements[i].childNodes[0] !== undefined && elements[i].childNodes[0].nodeType === 3) {
        for (curText = elements[i].childNodes[0].nodeValue; curText !== curText.replace(find, replace); curText = curText.replace(find, replace)) {
            elements[i].childNodes[0].nodeValue = curText;
        }
    }
}

唯一的问题是它不会替换每个位置的每个“e”。在链接和内部的 div 和 span 标签等地方有 e 的剩余部分。我感觉我没有正确循环遍历所有元素,我没有检测到正确的字符串,并且我没有正确替换找到的字符串。我该如何解决这个问题?

编辑:好的,现在,这是当前代码。它在大多数情况下都有效,唯一的问题是它不能在整个页面上都有效。您可以打开 JavaScript 控制台并尝试在

http://www.roblox.com/games/?SortFilter=default&TimeFilter=0&GenreFilter=1

侧边栏上的文字没有改变。

var elements = document.getElementsByTagName("*");
var find = "e";
var replace = "A";

for (var i = 0; i < elements.length; ++i) {
    if (elements[i].childNodes[0] !== undefined && elements[i].childNodes[0].nodeType === 3) {
          elements[i].childNodes[0].nodeValue = elements[i].childNodes[0].nodeValue.replace(new RegExp(find, "g"), replace)
    }
}

编辑:好的,现在是新代码! undefined 出现在控制台中,没有任何改变,我在谷歌搜索中找到了这个,它来自堆栈溢出问题。 Find all text nodes in HTML page

代码:

var find = "e";
var replace = "A";

function textNodesUnder(el){
  var n, a=[], walk=document.createTreeWalker(el,NodeFilter.SHOW_TEXT,null,false);
  while(n=walk.nextNode()) a.push(n);
  return a;
}

var nodes = textNodesUnder(document.body);
for (var i = 0; i < elements.length; ++i) {
    if (nodes[i].childNodes[0] !== undefined && elements[i].childNodes[0].nodeType === 3) {
          nodes[i].childNodes[0].nodeValue = nodes[i].childNodes[0].nodeValue.replace(new RegExp(find, "g"), replace)
    }
}

我还没有测试,但似乎我犯了一个大错误,将我的 childNodes 宝贵代码留在新的代码中,没有它,它应该可以工作。

【问题讨论】:

标签: javascript html replace find


【解决方案1】:

String.replace 仅替换第一个实例。试试这个:

  curText.replace(new RegExp(find, "g"), replace)

这是带有“g”的正则表达式版本,表示全局(所有出现)替换。

【讨论】:

  • 所以我可以摆脱一直重复使用 replace 直到没有更多实例的循环?好!
  • 我收到错误 TypeError: Object # has no method 'replace'
  • 使用元素[i].childNodes[0].nodeValue
  • 我得去办点事了,等我回来看看这个问题。我不在时的所有帮助将不胜感激!
  • 好的,谢谢,请参阅问题中的编辑。它几乎可以工作,但并不完全。到目前为止这很棒:D
猜你喜欢
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 2014-02-11
  • 2020-07-16
  • 2012-09-11
  • 1970-01-01
  • 2016-09-09
  • 2021-09-19
相关资源
最近更新 更多