【发布时间】:2012-11-11 17:20:03
【问题描述】:
我意识到最近几次我需要在一些 jQuery 选择器中加入文本节点选择。
jQuery 本身并不真正支持文本节点。大多数有关此类问题的答案都建议使用.contents(),但这并不真正属于“选择器”,而是“遍历”。因此,它只提供直接子节点,并且提供所有子节点,而不仅仅是文本节点。
我发现我需要在任意标记的文本中选择所有文本节点,所以我感兴趣的一些文本节点将是孙子、曾孙等:
<div id="formattedText">
This is a <b>sample</b> block <a href="http://somewhere.com">of <em>text</em></a>
that I might want to get a list of <span class="groovy">all</span> text nodes in.
</div>
因此,实现这一点而不是尝试实现对.children() 的递归调用最有表现力的方法是将jQuery 选择器扩展为类似这样的东西:
var txtNodes = $('#formattedText §');
§ 代表一些新的语法,我将添加到代表文本节点的 jQuery 中。我必须找到一些未使用的 ASCII 符号或类似 :odd() 扩展的东西:
var txtNodes = $('#formattedText:textNodes()');
如何以这种方式扩展 jQuery 的选择器引擎?我假设我想使用他们现有的 DOM 遍历方法,而不必求助于构建新方法?
或者也许有一个使用 .contents() 的表达技巧,我没想到它可以在我不必扩展 jQuery 的情况下做我想做的事?
我的用例:我想在用户脚本(greasemonkey 等)中对来自 3rd 方网站的文本进行自定义“突出显示”。通过“自定义”,我的意思是不同的模式会得到不同的background-colors 等等。所以我需要所有的文本节点,无论它们的深度如何,我不希望它们周围有标签,也不希望所有文本都放在一个大块作为.text() 会给我。
【问题讨论】:
标签: jquery jquery-plugins jquery-selectors textnode