问题

我想获取元素的所有后代文本节点,作为jQuery集合.最好的方法是什么?

  最佳答案

javascript – jQuery没有一个方便的函数.您需要组合contents(),它将只提供子节点,但包含文本节点,与find(),它给出所有后代元素,但没有文本节点.这是我想出的:

 var getTextNodesIn = function(el) {
    return $(el).find(":not(iframe)").addBack().contents().filter(function() {
        return this.nodeType == 3;
    });
};

getTextNodesIn(el);
 

注意:如果您使用的是jQuery 1.7或更早,上面的代码将不起作用.为了解决这个问题,将 addBack() 替换为 andSelf() .从1.8开始,andSelf()被弃用赞成addBack().

与纯DOM方法相比,这有点低效,并且必须包含一个丑陋的解决方法,用于jQuery超载其contents()函数(由于注释中的@rabidschee),因此这是使用简单递归函数的非-jQuery解决方案. includeWhitespaceNodes参数控制输出中是否包含空格文本节点(在jQuery中它们自动过滤).

更新:当includeWhitespaceNodes错误时修复错误.

 function getTextNodesIn(node, includeWhitespaceNodes) {
    var textNodes = [], nonWhitespaceMatcher = /\S/;

    function getTextNodes(node) {
        if (node.nodeType == 3) {
            if (includeWhitespaceNodes || nonWhitespaceMatcher.test(node.nodeValue)) {
                textNodes.push(node);
            }
        } else {
            for (var i = 0, len = node.childNodes.length; i < len; ++i) {
                getTextNodes(node.childNodes[i]);
            }
        }
    }

    getTextNodes(node);
    return textNodes;
}

getTextNodesIn(el);
 

  相同标签的其他问题

javascriptjquerydom