我发现,我有一个需要与DOM的全力支持选择textNode
s表示jQuery的不提供。
jQuery的忽略文本节点,可能是因为大多数网页都吨,各种浏览器可以区别对待标签之间的空白无关的那些。
大多数回答有关文本节点jQuery的问题归结为使用.contents()
函数返回的所有选定项目的子节点,包括文本节点-所有其他的jQuery的API忽略文本节点。
通常你并不需要的东西,不能轻易在建.contents()
在这种情况下,但我发现自己。
我使用的情况是,我想找到并换行文本的任意运行在第三方网页上,我无法控制。 (想想浏览器扩展或userscript。)
到目前为止,我已经高兴地走DOM寻找所有文本节点或找到一个包含所有文本节点我感兴趣的,并使用一个包装元素.contents()
通过它们进行迭代。
但是现在我发现我有时需要的jQuery /滋滋声选择的全部力量,以缩小我的重心下移,以类等中的某些类可能
我认为办法jQuery的一个扩展textNode
选择,但似乎是不可能的,因为忽略了文本节点的一个普遍的规则,会过滤很多人从我的延长之前调用。
因此,我在寻找一些其他的JavaScript工具,它提供了类似选择,但允许选择文本节点的选择表达式语法任意混合。
这里是什么,我可能需要做一个例子:
$('.ii:even > div > TXT, .ii:even > div > div.im > TXT')
下面是我个人没有必要,但还可以很容易地想象一个例子:
$('#something .somethingElse TXT')
当你能解决(选择)textNodes的直接父(S),遍历其.contents()
很容易,不是那么当你只能识别一些任意的祖先,但要低于这个的所有文本节点,这当然是平凡的元素节点。
下面是一些你可以这样做:
jQuery.fn.getTextNodes = function(val,_case) {
var nodes = [],
noVal = typeof val === "undefined",
regExp = !noVal && jQuery.type(val) === "regexp",
nodeType, nodeValue;
if (!noVal && _case && !regExp) val = val.toLowerCase();
this.each(function() {
if ((nodeType = this.nodeType) !== 3 && nodeType !== 8) {
jQuery.each(this.childNodes, function() {
if (this.nodeType === 3) {
nodeValue = _case ? this.nodeValue.toLowerCase() : this.nodeValue;
if (noVal || (regExp ? val.test(nodeValue) : nodeValue === val)) nodes.push(this);
}
});
}
});
return this.pushStack(nodes, "getTextNodes", val || "");
};
然后,你可以使用以下命令:
$("selector").getTextNodes("selector");
这里是一个的jsfiddle。
如何.getTextNodes()
的工作原理很简单。 如果不传递参数,它返回所有文本节点。 如果你传递一个字符串,它返回文本节点与完全一样nodeValue
。 如果你正在传递一个字符串,第二个参数设置为不区分大小写的检查一个truthy值。 第一个参数,也可以是正则表达式针对其nodeValue
匹配。
希望这可以帮助。
编辑 :请注意,您也可以使用$("selector").getNodes("selector").end()
因为它使用.pushStack()
文章来源: Is there an alternative to jQuery / sizzle that supports textNodes as first class citizens in selectors?