我想获取一个元素的所有后代文本节点,作为一个 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/