1

html タグや js コードを変更せずに、ドキュメントの一部の単語を置き換えたいと考えています。

基本的に私がしていることは次のとおりです。

document.body.innerHTML = document.body.innerHTML.replace('lorem','new lorem');

しかし、このコードは「lorem」を置き換えます。次のようなタグは避けたいです。<script... var lorem = 123; <div class="lorem", <a id="lorem"

JSでこれを行うにはどうすればよいですか?

4

2 に答える 2

5

DOM と.replace()テキスト ノードの値をウォークします。

function walk(el, fn) {
    for (var i = 0, len = el.childNodes.length; i < len; i++) {
        var node = el.childNodes[i];
        if (node.nodeType === 3)
            fn(node);
        else if (node.nodeType === 1 && node.nodeName !== "SCRIPT")
            walk(node, fn);
    }
}

walk(document.body, function(node) {
    var text = node.data.split("foo"),
        parent = node.parentNode,
        i = 1,
        newNode;

    parent.insertBefore(textNode(text[0]), node);

    for (; i < text.length; i += 2) {
        (newNode = document.createElement("b"))
                           .appendChild(textNode("bar"));
        parent.insertBefore(newNode, node);
        parent.insertBefore(textNode(text[i]), node);
    }
    parent.removeChild(node);
});

function textNode(txt) {
    return document.createTextNode(txt);
}
于 2012-10-16T16:21:58.987 に答える
0

これを行う別の方法は、正規表現を使用することです.HTMLタグをテキストノードに挿入することはできません.

最初に、HTML タグの外側にある body.innerHTML プロパティの部分をキャッチするために正規表現を使用しています。

ただし、文字列には別のデータも含まれており、それを新しいデータに直接置き換えると、一部のテキストが失われます。

試しに、各一致を関数の引数として取得し、この関数内で別の正規表現を使用します。

「foo」を 2 回置き換える必要があることに注意してください。

コード:

document.body.innerHTML=document.body.innerHTML.replace(/<[^(script)][^>]*>[^<]*(foo)[^<]*</g,function(match){ return match.replace(/foo/,"newWord"); });

于 2012-10-16T17:02:53.587 に答える