2012-02-01 22 views
12

jqueryを使用して、html/valがゼロに等しい「span」要素を含む「li」要素にクラスを追加したいとします。私は、要素の属性値をチェックするためのコードを使用していた過去に特定のhtml値を持つ子要素を含む要素を取得するJquery

<ul> 
    <li><span>Item 1</span><span class="num">30</span></li> 
    <li class="disabled"><span>Item 2</span><span class="num">0</span></li> 
    <li><span>Item 3</span><span class="num">20</span></li> 
</ul> 

が、例えば:

私のコードは次のように見える場合:私は次のように変更したい

<ul> 
    <li><span>Item 1</span><span class="num">30</span></li> 
    <li><span>Item 2</span><span class="num">0</span></li> 
    <li><span>Item 3</span><span class="num">20</span></li> 
</ul> 

この効果に何かをしているhtml/valは決してありません...

$('li').has('span.num').addClass('disabled'); 

しかし、この場合結果内:明らかに作業を行っていない

<ul> 
    <li class="disabled"><span>Item 1</span><span class="num">30</span></li> 
    <li class="disabled"><span>Item 2</span><span class="num">0</span></li> 
    <li class="disabled"><span>Item 3</span><span class="num">20</span></li> 
</ul> 

...おかげ

+2

無効なクラスではなく、選択したクラスを追加する理由は何ですか? – palAlaa

+0

アイテムを無効にしているため、ユーザーによって何も選択されていません。 –

答えて

15

これは、あなたが欲しいものを行う必要があります。

$('li').each(function(){ 
    if($(this).find('span.num').text() == '0') $(this).addClass('disabled') 
}); 

JS Fiddle

は、私は次のよう提案しているだろう:

$('li').has('span.num:contains(0)').addClass('disabled') 

をしかし、それは価値がHTML内に存在するかどうかをチェックするように、それは、動作しません - ではない正確に一致します。この場合、span.num要素のそれぞれに0があるため、すべてのliは選択されたクラスを取得します。 :contains()セレクタに対応するequals()のようには見えません。 jsFiddle example

$('li .num').each(function(){ 
    if ($(this).text() == '0') $(this).parent().addClass('disabled'); 
}); 

+0

これは素晴らしいです。ありがとうございます。 –

+0

.hasと "contains"を使用して追加のコメントをいただきありがとうございます。それはまさに私が取ることを望んでいたアプローチです。おそらくそれは不可能ですが、私は将来このようなものが必要かもしれないことを知っています。 –

2

試してみてください。

$('li span.num').filter(
    function(i){ 
     return $(this).text() == '0'; 
    }).closest('li').addClass('selected'); 

JS Fiddle demo

+2

これは、OPが要求する出力を生成しません。 – ShankarSangoli

+0

なぜあなたは$(これ)を返すのですか? – gdoron

+0

@ShankarSangoli:oops。ええ、そうです。何らかの理由で私は彼が「30」スパンを望んだと思った。ありがとう!そして編集されました! =) –

5

これを試してください。

$('ul span.num').filter(function(){ 
    return $(this).text() == "0"; 
}).parent().addClass('disabled'); 

Demo

+0

私はすぐにこれを見ていませんでしたが、これも素晴らしいです。 –

+0

.filter vsを使用するとパフォーマンス上の利点はありますか?各? –

+1

'filter'と' each'は2つの異なる操作に使用されます。 'each'が全てのマッチした要素のセットをループして、それらに対して何らかの操作を行うのに使われる条件に基づいて、マッチした要素のセットをフィルタリングしたいときは' filter'を使います。あなたの場合、 'filter'は要素をフィルタリングし(text == 0)、必要なクラスを適用する(disbaled)ために最適です。 – ShankarSangoli

0

あなたはparent()とその親<div>を取得し、その後、filter()<span>要素を一致させることができます:

$("li > span.num").filter(function() { 
    return $(this).text() === "0"; 
}).parent().addClass("disabled"); 
+0

'span.num'以外のテキストに' span'を追加するのはどうですか? – ShankarSangoli

+0

「アイテム1」のようなテキストですか?質問者のマークアップにはすでに ''要素があります。何か不足していますか? –

+0

ああ、あなたは正しいです:P – ShankarSangoli

0

ここではそれまでに高速な方法です。