2

我试图找到一个 jQuery 选择器,它只匹配以下两个示例中直接包含文本“PDT”的元素(为简洁起见被截断):

<div>
  <p>
    <strong>(07-27) 21:28 PDT SAN FRANCISCO</strong> -- San Francisco
    supervisors ended more than a decade...
  </p>
  <p>The 10-1 vote, with only Supervisor Chris Daly dissenting</p>
</div>

<div>
  <p>(07-28) 08:59 PDT WASHINGTON --</p>
  <p>Orders to U.S. factories for big-ticket manufactured goods fell...</p>
</div>

在第一种情况下,这将是<strong>,在第二种情况下,第一个<p>。我正在寻找一个可以匹配两者的单个选择器,或者多个不会发现任何误报的选择器。

根据我的分析,我知道关于匹配元素的以下内容:

  • 它们可以是一个<p>或一个<strong>元素
  • 他们是父母的第一个孩子
  • 它们包含文本“PDT”
  • 他们没有孩子

鉴于所有这些属性,我认为应该有一个 jQuery 选择器,它可以高精度地找到这些元素,并且几乎没有误报。但是,我在将它们放在一起时遇到了一些麻烦,因为我再也没有使用过这么复杂的选择器了。

我知道的工具是(每个都链接到文档):

我不确定最后一个是否有用 - 我只是更仔细地阅读了文档并注意到文本节点被 :empty 选择器考虑,所以我试图定位的 HTML 元素实际上并不是空的。但是,我可以相信它们只包含一个文本节点,而没有其他内容。

我的第一枪是:

*:contains(PDT):first-child:empty

但这没有用。我尝试了其他几种变体,但我有点难过。任何人都可以提供一些指导吗?

一个警告:我实际上并没有在我的脚本中使用 jQuery,而是它的 Sizzle 选择器引擎。因此,我需要尝试在一个选择器中完成所有这些操作,并且不能使用 .find() 和 .filter() 之类的 jQuery 方法。

提前感谢您的帮助!

4

2 回答 2

5

使用所有标准,您可以执行以下操作:

试试看:http: //jsfiddle.net/CKuYD/

var $result = $(':first-child:not(:has(*)):contains(" PDT ")');

注意“ PDT ”周围的空格。

如果它们包含文本、是第一个孩子并且没有任何其他子标签,这将返回。

于 2010-07-29T00:34:56.100 回答
1
$('strong:contains("PDT"):first-child, p:contains("PDT"):first-child')

这显然可以基于 id 和上下文进行优化。

于 2010-07-29T00:34:09.293 回答