简体   繁体   English

JavaScript:遍历DOM树并替换文本?

[英]JavaScript: loop through DOM tree and replace text?

I need to use JavaScript to loop through the DOM tree of a webpage and replace every instance of the word 'hipster' with a different word UNLESS it is part of a link or image src. 我需要使用JavaScript来循环浏览网页的DOM树,并用不同的词替换“时髦”一词的每个实例,除非它是链接或图像src的一部分。 Example, if 'hipster' appears in a paragraph, it should be replaced. 例如,如果“时髦”出现在段落中,则应将其替换。

But if it's in the src="" url for an image, that should not be replaced because if it replaces that word in a url, the url obviously breaks. 但是,如果它位于图像的src=""网址中,则不应替换该内容,因为如果它替换了网址中的该单词,则该网址显然会损坏。

I've been having a really hard time implementing this. 我一直很难实现这一目标。 Here's one thing I tried: 这是我尝试过的一件事:

var items = document.getElementsByTagName("*");
  var i = 0;
  for (i = 0; i < items.length; i++){
     if(i.nodeType == 3){
        i.html().replace(/hipster/gi, 'James Montour');
     }
     else{
       //do nothing for now
     }
  }

You're close, but: 您接近,但:

  • document.getElementsByTagName('*') will never return text nodes; document.getElementsByTagName('*')将永远不会返回文本节点; it gets elements only (and comment nodes in old versions of IE) 它仅获取元素(以及旧版本的IE中的注释节点)

  • Text nodes don't have an html() method 文本节点没有html()方法

  • replace doesn't modify strings in place replace不会修改字符串

With that in mind, you can get every child of every element, check their types, read their nodeValue s, and, if appropriate, replace the entire node: 考虑到这一点,您可以获取每个元素的每个子元素,检查其类型,读取其nodeValue ,并在适当时替换整个节点:

var elements = document.getElementsByTagName('*');

for (var i = 0; i < elements.length; i++) {
    var element = elements[i];

    for (var j = 0; j < element.childNodes.length; j++) {
        var node = element.childNodes[j];

        if (node.nodeType === 3) {
            var text = node.nodeValue;
            var replacedText = text.replace(/hipster/gi, 'James Montour');

            if (replacedText !== text) {
                element.replaceChild(document.createTextNode(replacedText), node);
            }
        }
    }
}

Try it out on this page! 在此页面上尝试一下!

To use variables instead of 'hipster' replace: 要使用变量代替“时髦”,请替换:

var replacedText = text.replace(/hipster/gi, 'James Montour');

with these lines: 这些行:

var needle = 'hipster';
var replacement = 'James Montour';
var regex = new RegExp(needle, "gi");
var replacedText = text.replace(regex, replacement);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM