【问题标题】:Can I use 'not' and 'contains' filter together in jQuery我可以在 jQuery 中同时使用“不”和“包含”过滤器吗
【发布时间】:2015-12-21 10:18:21
【问题描述】:

我想同时应用 'not' 和 'contains' 过滤器来过滤 HTML 中的元素。

考虑我有如下元素,

<tr class="filter" value="value1" name="something1">
<tr class="filter" value="value1" name="something2">
<tr class="filter" value="value3" name="something3">
<tr class="filter" value="value1" name="something4">

我想将过滤器应用为

$(".filter").not("[value*='value1']").contains('something4')

但它不起作用。 请帮助我,谢谢。

【问题讨论】:

  • 你能告诉我们你的目标是什么吗?根据您编写的代码似乎不可能返回目标元素。
  • 我想将类应用于值不等于'value1'且名称等于something4的元素
  • 那么在上面的 trs 中,你的目标是哪一个?
  • 第四个是我的目标。

标签: javascript jquery filter


【解决方案1】:

我建议你改用.filter() 方法:

var filtered = $(".filter").filter(function(){
    return $(this).attr('value') !== 'value1' && $(this).attr('name') === 'something4'
});
filtered.css('color', 'red');

带有属性选择器(不推荐)

$(".filter:not([value*='value1']):contains('something4')")

根据您的评论:

第四个是我的目标

然后:

你不必检查负值,但你应该去检查平等:

var filtered = $(".filter").filter(function(){
    return $(this).attr('value') === 'value1' && $(this).attr('name') === 'something4'
});
filtered.css('color', 'red');

或:

$(".filter[value='value1'][name='something4']").css('color', 'red');

【讨论】:

  • 感谢Jai的帮助,我可以不用过滤功能吗?
  • 是的!但是.filter() 方法虽然可以使用属性选择器,但性能非常好。
  • 如果是,那么也请给我这种方法。
【解决方案2】:

您可以在单个选择器中执行此操作,但是如 Jai 的回答中所述,使用 filter() 的性能会更好。

$(".filter:not([value*='value1']):contains('something4')")

另请注意,鉴于您的 HTML 示例,此选择器不会匹配任何内容,因为您将带有 something4 文本和 :not 的元素排除在外。

【讨论】:

  • 只是出于好奇,难道 jQuery 伪选择器,如 :not:contains 被认为不如 .not().contains() 方法的性能?
  • 在现代版本的 jQuery 中,是的。但是@Jai 已经发布了这个答案:)
  • 感谢 Rory,它给出了错误为 'Uncaught TypeError: Cannot read property 'replace' of undefined'
  • @RoryMcCrossan 似乎 :not 缺少 ()
猜你喜欢
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多