Search code examples
javascriptjquerytraversal

Find the inner most text with javascript (jquery) regardless of number of nested elements and replace it


If I have this:

<a href="#" id="the-link"><em>any random text</em></a>

Or this:

<a href="#" id="the-link">any random text</a>

Or this:

<a href="#" id="the-link"><em><div id="foo"><span>any random text</span></div></em></a>

I would like to capture the text "any random text" and then replace it.

How can I do this with jQuery? If not with jQuery, just regular javascript?


Solution

  • You could do this recursively. It's pretty simple:

    function replaceTextNodes(node, newText) {
        if (node.nodeType == 3) {
            // Filter out text nodes that contain only whitespace
            if (!/^\s*$/.test(node.data)) {
                node.data = newText;
            }
        } else if (node.hasChildNodes()) {
            for (var i = 0, len = node.childNodes.length; i < len; ++i) {
                replaceTextNodes(node.childNodes[i], newText);
            }
        }
    }
    
    replaceTextNodes(document.getElementById("the-link"), "NEW TEXT");