遍历和更新DOM

时间:2019-03-26 15:56:48

标签: javascript dom replace traversal

我有一个下面的HTML示例页面。我想使用纯JavaScript遍历DOM并将 www.demourl.com 替换为 www.betaurl.com

<!doctype html>
<html>
    <head>
      <meta charset="utf-8">
      <title>DOM replace</title>
      <script>
        function process(node){
            var nodes = node.childNodes;
            for (var i = 0; i <nodes.length; i++){
                if(!nodes[i]){
                    continue;
                } else {
                    if (nodes[i].data.indexOf("www.demourl.com") != -1) {
                        nodes[i].data = nodes[i].data.replace(/www.demourl.com/g, 'www.betaurl.com')
                    }
                }

                if(nodes[i].childNodes.length > 0){
                    loop(nodes[i]);
                }
            }
        }
        window.onload = function() {
            process(document);
        }         
      </script>
    </head>
    <body>
        <div id="main">
            <div id="first">www.demourl.com</div>
            <div id="second">
                <p>www.demourl.com</p>
            </div>
            <a href="http://www.demourl.com/demo">View Demo</a>
        </div>
        <div id="container">
            <table>
                <tr>
                    <td>
                        <img src="http://www.demourl.com/assets/">
                    </td>
                </tr>
            </table>
        </div>
    </body>
</html>

由于某种原因未在页面上替换URL。流程功能需要进行哪些更改?

1 个答案:

答案 0 :(得分:3)

一些问题:

  • 将参数传递给初始调用
  • 递归调用应该是process,而不是loop
  • 使用.nodeValue而不是.data
  • 检查该节点是否为文本节点,例如通过检查nodeValue是否存在(对于注释节点也是这种情况……)
  • 文字点需要在正则表达式中转义。
  • 要同时替换属性,您需要额外的代码来迭代这些属性。

已更正:

function process(node){
    var nodes = node.childNodes;
    for (var i = 0; i <nodes.length; i++){
        //console.log(nodes[i]);
        if(!nodes[i]) continue;
         // *** it's not data, but nodeValue. Add a check if property exists
        if (nodes[i].nodeValue && nodes[i].nodeValue.indexOf("www.demourl.com") != -1) {
            // regex with escaped dot:
            nodes[i].nodeValue = nodes[i].nodeValue.replace(/www\.demourl\.com/g, 'www.betaurl.com')
        }
        // *** additional code to do same for attributes
        var attr = nodes[i].attributes;
        if (attr) {
            for (var j = 0; j < attr.length; j++) {
                if (attr[j].value.indexOf("www.demourl.com") != -1) {
                    attr[j].value = attr[j].value.replace(/www\.demourl\.com/g, 'www.betaurl.com')
                }
            }
        }
        if(nodes[i].childNodes.length > 0){
            process(nodes[i]); // *** it's not loop
        }
    }
}
window.onload = function() {
    process(document.body); // *** pass argument
}         
<div id="main">
    <div id="first">www.demourl.com</div>
    <div id="second">
        <p>www.demourl.com</p>
    </div>
    <a href="http://www.demourl.com/demo">View Demo</a>
</div>
<div id="container">
    <table>
        <tr>
            <td>
                <img src="http://www.demourl.com/assets/">
            </td>
        </tr>
    </table>
</div>