Iterating through each text element in a page?

后端 未结 1 895
迷失自我
迷失自我 2020-12-06 07:13

I\'m trying to write a script in jQuery that would iterate through each text element inside a page. Then I need to change the color of each letter one by one. For example, f

相关标签:
1条回答
  • 2020-12-06 07:50
    1. Loop through all child elements, recursively for elements.
      Store all text nodes in a list.
    2. Loop through all text nodes:
      1. Loop through the textual contents of each element.
        1. Wrap each letter in a <span> element
        2. Insert this element in a DocumentFragment
      2. Replace the text node with this fragment.

    Demo: http://jsfiddle.net/B2uRn/

    // jQuery plugin, example:
    (function($) {
        $.fn.styleTextNodes = function() {
            return this.each(function() {
                styleTextNodes(this);
            });
        };
    })(jQuery)
    
    function styleTextNodes(element) {
        var span = document.createElement('span');
        span.className = 'shiny-letter';
    
        // Recursively walk through the childs, and push text nodes in the list
        var text_nodes = [];
        (function recursiveWalk(node) {
            if (node) {
                node = node.firstChild;
                while (node != null) {
                    if (node.nodeType == 3) {
                        // Text node, do something, eg:
                        text_nodes.push(node);
                    } else if (node.nodeType == 1) {
                        recursiveWalk(node);
                    }
                    node = node.nextSibling;
                }
            }
        })(element);
    
        // innerText for old IE versions.
        var textContent = 'textContent' in element ? 'textContent' : 'innerText';
        for (var i=text_nodes.length-1; i>=0; i--) {
            var dummy = document.createDocumentFragment()
              , node = text_nodes[i]
              , text = node[textContent], tmp;
            for (var j=0; j<text.length; j++) {
                tmp = span.cloneNode(true); // Create clone from base
                tmp[textContent] = text[j]; // Set character
                dummy.appendChild(tmp);     // append span.
            }
            node.parentNode.replaceChild(dummy, node); // Replace text node
        }
    }
    
    0 讨论(0)
提交回复
热议问题