【问题标题】:Iterating through each text element in a page?遍历页面中的每个文本元素?
【发布时间】:2012-02-26 10:26:41
【问题描述】:

我正在尝试用 jQuery 编写一个脚本,该脚本将遍历页面中的每个文本元素。然后我需要一个一个地改变每个字母的颜色。例如,对于这样的页面:

<p>Some text and <a href="http://example.com">some link</a> and <span>something else</span></p>

我想得到:

"Some text and "
"some link"
" and "
"something else"

并且能够为每个单独的字母设置样式(即,将我设置的任何样式放回 DOM)。

我知道text() 方法,但是因为它结合了文本内容,所以它不起作用,而我需要访问每个单独的文本部分。

有什么建议吗?

【问题讨论】:

    标签: jquery dom loops


    【解决方案1】:
    1. 循环遍历所有子元素,递归地查找元素。
      将所有文本节点存储在一个列表中。
    2. 循环遍历所有文本节点:
      1. 循环遍历每个元素的文本内容。
        1. 将每个字母包装在 &lt;span&gt; 元素中
        2. 将此元素插入DocumentFragment
      2. 用这个片段替换文本节点。

    演示: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
        }
    }
    

    【讨论】:

    • 已经有一段时间了,但是 for 循环是反向的有什么原因吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 2020-11-09
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 2018-03-14
    相关资源
    最近更新 更多