替换元素中字符串的所有ocurrance

bil*_*.cn 7 javascript jquery dom

我想替换给定元素的所有后代元素(的文本)中的特定字符串.

innerHTML不能用,因为这个序列可以出现在属性中.我尝试过使用XPath,但看起来界面基本上是只读的.因为这仅限于一个元素,document.getElementsByTagName所以也不能使用类似的功能.

有人建议任何方式这样做吗?任何jQuery或纯DOM方法都是可以接受的.

编辑:

一些答案表明我试图解决的问题:直接在Element上修改文本将导致删除所有非Text子节点.

所以问题主要归结为如何有效地选择树中的所有Text节点.在XPath中,您可以轻松地执行此操作//text(),但当前的XPath接口不允许您更改这些Text节点.

一种方法是通过递归,如Bergi 的答案所示.另一种方法是使用find('*')jQuery 的选择器,但这有点贵.还在等着看是否有更好的解决方案.

Ber*_*rgi 4

只需使用一个简单的自制 DOM 迭代器,它会递归地遍历所有节点:

(function iterate_node(node) {
    if (node.nodeType === 3) { // Node.TEXT_NODE
        var text = node.data.replace(/any regular expression/g, "any replacement");
        if (text != node.data) // there's a Safari bug
            node.data = text;
    } else if (node.nodeType === 1) { // Node.ELEMENT_NODE
        for (var i = 0; i < node.childNodes.length; i++) {
            iterate_node(node.childNodes[i]); // run recursive on DOM
        }
    }
})(content); // any dom node
Run Code Online (Sandbox Code Playgroud)