是否有支持textNodes在选择一等公民到jQuery的替代/嘶嘶声?(Is there an a

2019-07-04 19:44发布

我发现,我有一个需要与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()很容易,不是那么当你只能识别一些任意的祖先,但要低于这个的所有文本节点,这当然是平凡的元素节点。

Answer 1:

下面是一些你可以这样做:

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?