我想获取元素的所有后代文本节点,作为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);
相同标签的其他问题
上一个问题:哪个更惯用:dotimes vs循环重复?
下一个问题:检查字符串是否包含有效脚本标记的正则表达式