2009-09-03 122 views
7

鑑於下面的HTML,我試圖使用jQuery來匹配所有列表項目,它們與類「foo」具有跨度,並且該跨度應該包含文本「相關」。jQuery:has(.something:contains())不受支持?

<ul> 
    <li>Some text <span class="foo">relevant</span></li> 
    <li>Some more text <span class="foo">not</span> <span class="bar">relevant</span></li> 
    <li>Even more <span class="foo">not so either</span></li> 
    <li>Blablabla <span class="foo">relevant</span> <span class="bar">blabla</span></li> 
    <li>No foo here <span class="bar">relevant</span></li> 
</ul> 

注意,也有幾個跨度的與類「欄」,而且還具有文本「相關的」,不應該包括在內。

我在選擇嘗試:

ul li:has(.foo:contains('relevant")) 

這是行不通的。下一個例子選擇的東西,但沒有考慮到有多個跨度的名單裏:

ul li:has(span:contains('relevant")) 

Here is a live example that you can play with。在工作版本中,只應該選擇該列表的第一個和第四個元素。

+2

+1在問題中使用jsbin,節省了我們所有的工作時間。 – Kobi 2009-09-03 11:33:57

+2

@Kobi - +1讓你在工作:)所以 – karim79 2009-09-03 11:37:53

回答

6

檢查了這一點:

$(document).ready(function(){ 
    $('span.foo:contains(relevant)').parents('li').each(function() { 
     alert($(this).text()); 
    }); 
}); 
+0

選擇span.foo,而不是列表項。 – 2009-09-03 11:11:53

+0

@Vegard拉森 - 對不起,編輯。 – karim79 2009-09-03 11:16:37

1

我知道這可能不是優雅,但它至少會工作:

$("ul li .foo:contains('relevant')").parent("li"); 

我不能讓你的版本來工作的。 ..

2

我試圖扭轉選擇器的順序:

$("ul li:has(:contains('relevant').foo)").css('background-color', 'red'); 

這似乎很好地工作,不能說爲什麼,但:http://jsbin.com/asoma

4

毆打,...但如果你想要一個純粹的選擇你織補接近

ul li:has(span[class='foo']:contains('relevant')) 
0

不知道爲什麼你雖然在選擇器中遇到了問題,但確認這確實可行:

$("ul li").filter(":has(span.foo:contains('relevant'))").css('background-color', 'green');