为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

杨__羊羊 2019-05-27 16:28:59
如何使用jQuery选择文本节点?我想得到一个元素的所有后代文本节点,作为jQuery集合。最好的方法是什么?
查看完整描述

4 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

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()andSelf()不赞成addBack()从1.8开始。

与纯DOM方法相比,这有点低效,并且必须包含一个丑陋的解决方法,用于jQuery的contents()函数重载(感谢注释中的@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);


查看完整回答
反对 回复 2019-05-27
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

Jauco在评论中发布了一个很好的解决方案,所以我在这里复制它:

$(elem)
  .contents()
  .filter(function() {
    return this.nodeType === 3; //Node.TEXT_NODE
  });


查看完整回答
反对 回复 2019-05-27
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

$('body').find('*').contents().filter(function () { return this.nodeType === 3; });


查看完整回答
反对 回复 2019-05-27
  • 4 回答
  • 0 关注
  • 1684 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信