通过jQuery查找第一个父元素并添加类

14

HTML:

<div class="views-row views-row-10 views-row-even views-row-last">    
  <div class="sonuc">        
    <span>text1</span>  
  </div>
</div>
<div class="views-row views-row-11 views-row-even views-row-last">    
  <div class="sonuc">        
    <span>text2</span>  
  </div>

JS:

if ($(".sonuc").has(":contains('text1')").length) {
  $('.sonuc').parent().addClass('hobi')
}

它的工作原理,但会将 hobi 类添加到所有父级 div 中。但我只想添加到 text1 的父级 div 中。我该如何修复它?


他的代码本身正在将“hobi”添加到两个div中,但问题是它正在添加到两个div中。因此,我认为他的if条件检查不正确。 - Suchit kumar
@Bariskonat,您能否澄清一下您是否需要匹配所有包含文本“text1”的实例,仅限于该文本,还是您还需要匹配例如“text11”和“text1 abc”等内容? - JM Hicks
8个回答

18

您可以将:contains选择器与所需的div选择器一起使用:

 $('.views-row:contains(text1)').addClass('hobi');

可运行的代码示例


2
使用 :contains 时遇到了一点问题,你可以在这个 fiddle 中查看。 - Alex Char
1
这不是 OP 拥有的 DOM。这个解决方案适用于当前提供的 DOM。 - Milind Anantwar

15

jquery选择器 :contains() 匹配包含指定字符串的任何元素。我建议使用 .filter()

$(".sonuc span").filter(function() {
  return this.innerText === "text1";
}).parents("div.views-row").addClass("active");
.active {
  background: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="views-row views-row-10 views-row-even views-row-last">
  <div class="sonuc">
    <span>text1</span> 
  </div>
</div>
<div class="views-row views-row-11 views-row-even views-row-last">
  <div class="sonuc">
    <span>text2</span> 
  </div>
  <div class="views-row views-row-11 views-row-even views-row-last">
    <div class="sonuc">
      <span>text11</span> 
    </div>


1
这就是我即将发布的内容。 - Jai
1
这是 OP 应该使用的内容。 - Suchit kumar

10

尝试在不使用if语句的情况下,因为它在这种情况下完全没有必要。

$(".sonuc").has("span:contains('text1')").parent().addClass('hobi')

4

您可以在一个筛选器中找到正确的元素:

$(".sonuc:contains('text1')").parent().addClass('hobi');

如果你真的是指第一个父级,那么只需要使用:eq()

$(".sonuc:eq(0)").parent().addClass('hobi');

1
你正在尝试查找 sonuc 的父级,但只给 sonuc 添加类。
if ($(".sonuc").has(":contains('text1')").length) {
  $('.sonuc').addClass('hobi')
}

1

只需将您已经拥有的内容组合在一起。

$('.sonuc').has(":contains('text1')").parent().addClass('hobi');

Maybe its不是测试文本的好主意,它可能会改变...
要获取一组元素的第一个元素,您可以:
$('.sonuc').eq(0).parent().addClass('hobi');

or

$('.sonuc:eq(0)').parent().addClass('hobi');

1

Just add first() in your jquery

if ($(".sonuc").has(":contains('text1')").length) {
  $('.sonuc').first().parent().addClass('hobi')
}
.hobi{
color:red;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="views-row views-row-10 views-row-even views-row-last">    
  <div class="sonuc">        
    <span>text1</span>  
  </div>
</div>
<div class="views-row views-row-11 views-row-even views-row-last">    
  <div class="sonuc">        
    <span>text2</span>  
  </div>


0

一种更简单、直接的方法而不使用:contains.filter()是:

$('.sonuc > span:first').parent().addClass('hobi');

它选择 .sonuc 类下的第一个直接子元素span,然后通过使用 .parent() 选择其父元素,并在其中添加 '.hobi' 类。

工作的JSFiddle演示


$('.sonuc > span:first').parent().addClass('hobi');
.hobi {
  background: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script>
<div class="views-row views-row-10 views-row-even views-row-last">
  <div class="sonuc"> <span>text1</span>

  </div>
</div>
<div class="views-row views-row-11 views-row-even views-row-last">
  <div class="sonuc"> <span>text2</span> 
  </div>
</div>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接