javascript - 如何使用 jQuery 选择文本节点?

标签 javascript jquery dom

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

最佳答案

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 方法相比,这有点低效,并且必须包含 ugly workaround for jQuery's overloading of its contents() function (感谢@rabidsnail 在评论中指出这一点),所以这里是使用简单递归函数的非 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);

关于javascript - 如何使用 jQuery 选择文本节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/298750/

相关文章:

javascript - 如何删除重复项并计算两个数组之间的差异?

javascript - 获取 URL 以从 iFrame 打开更大的 map ?

javascript - 载回原始 div 内容

javascript - 如何在react.js中从 child 调用grandparent()?

javascript - 通过 ajax 将 javascript 变量(字符串)传递给 Controller ​​ - 404

javascript - 如何在node js中解析azure表的结果

javascript - Jasmine 期望不使用 requirejs

查询 : Is it possible to make customized menu using devexpress?

javascript - Dblclick 监听器在我的代码中仅触发一次

javascript - 使用 jQuery 环绕元素组