【问题标题】:Select any TR where a TD's text contains foo选择 TD 文本包含 foo 的任何 TR
【发布时间】:2011-07-09 15:11:45
【问题描述】:

我很确定这可以在不进入函数的情况下完成,但我想获取任何有 <td>Mail ...</td> 或 <td>Foo ... </td> 的 TR 作为示例。

我一直认为它应该看起来像

$('tr[./text()^="foo"]') 但 chrome 不喜欢它。 或$('tr[./td/text()^="Mail"]') 但没有运气 这可以用一个简单的选择器来完成吗?

【问题讨论】:

  • 选择器必须是有效的 CSS 选择器(或多或少)。但它们不是 XPath!你不能用一个简单的选择器来做到这一点,但可以用filter。

标签: jquery-selectors


【解决方案1】:

我很惊讶没有人想出这个,也许我的问题太模糊了。

$('tr:has(td:contains("Leather"))').hide()
$('tr:has(td:contains("Mail"))').hide()
$('tr:has(td:contains("Cloth"))').hide()
$('tr:has(td:contains("Bow"))').hide()
$('tr:has(td:contains("Gun"))').hide()

打算让它成为一个书签,用于为 dk 或 pally 搜索盔甲和武器

【讨论】:

  • 好吧,正如答案中所述,:contains 在元素的任何部分搜索文本,而您专门要求开始。此外,您可以将选择器与逗号 (,) 连在一起,这样您就不必使用 5 $ 和 hide()s
  • 整洁,我是从 :has 和整体整体解决方案的答案中谈论的,而不仅仅是解决方案的一部分。
  • 不,你的问题太具体了。
  • 作为参考很好看,选项易江正在谈论:stackoverflow.com/questions/2416803/…
  • @Maslow:您的问题的标题是选择任何TR,其中TD的文本以foo开头。事实上,你不能用一个简单的选择器来做到这一点。由于您拥有有关文本的唯一信息,是的,您可以查看您要查找的单词是否也包含在其他单元格中......无论如何,至少您有自己的解决方案。
【解决方案2】:

一种可能的解决方案:

$('td').filter(function() {
    return $(this).text().indexOf('Foo') === 0;
}).closest('tr');

您必须使用 .filter() 来处理元素的文本(您不能使用选择器执行此操作,至少不是您想要的方式)并且 .closest() 应该是自我解释的。

编辑:但这可能会多次选择 <tr> 元素。我实际上不知道 jQuery 是如何处理这个问题的。另一种解决方案是使用两个嵌套的filters(在tr 和td 上,但不知何故这感觉效率低下)。

Edit2:从 1.4.4 版本开始,jQuery 似乎足够聪明,可以处理同一元素的多次出现(即它像一个集合一样工作)。 DEMO here(如果您更改为 1.4.2 版本,您会看到第一行被选中了两次)。

【讨论】:

  • 看起来 wowhead.com 是 This page already using jQuery v1.4.2,所以我必须以某种方式处理重复。
  • 是从我的过早优化开始的吗?优化字符串搜索可能不值得牺牲可读性损失
【解决方案3】:

有“包含:”

TD:contains("Mail")

但这只是在元素中的任何位置查找邮件(没有“开始于”)。

【讨论】:

  • 这可能非常适合我的小规模使用。我想知道如何实现更大规模或更可扩展的选项(如果存在的话)。打算试试这个。
  • $('td:contains("Mail")::ancestor/[td]').hide() 语法问题,但非常接近
  • api.jquery.com/attribute-starts-with-selector 是一个开头,但它只用于属性......文本是否能够以某种方式被视为属性?
猜你喜欢
  • 1970-01-01
  • 2010-10-06
  • 2015-05-11
  • 2011-08-23
  • 2015-03-27
  • 2021-10-03
  • 2015-10-28
  • 2015-01-29
  • 1970-01-01
相关资源
最近更新 更多