2012-04-15 2 views
15

私はjQueryで要素をチェックするより意味のある方法を作ることに取り組んでいます。 $("#element").length > 0を使用して本当に非常によく私に言葉を選んだ感じがしないので、私は.isで使用するために私自身のセレクター加算を作ってるんだ:空のjQueryセレクタ配列で "True"を返しますか?

if($("#element").is(":present")) { 
    console.log("It's aliiiveeee!!"); 
} 

その部分は簡単だった、次のように:

$.extend($.expr[':'],{ 
    present: function(a) { 
     return $(a).length > 0; 
    } 
}); 

$.extend($.expr[':'],{ 
    present: function(a) { 
     return $(a).length > 0; 
    }, 
    absent: function(a) { 
     return $(a).length === 0; 
    } 
}); 

$(function() { 
    if($("#element").is(":absent")) { 
    console.log("He's dead, Jim."); 
    } 
}); 

しかし、この部分を行うのは意外に難しいです:私は、同様の構文を使用して、さらに一歩進んで、要素が存在しない場合、それは簡単に見ることにしたいです。結果を得るために返された要素を解析し、セレクタを.length = 0にパージすることは、要素を要求しないことと同じです。何があってもfalseを返します。

私はそれがない場合は、物事を逆転し、要素が存在しない場合、これはtrueを返すために取得するさまざまな方法の多くを試みたが、偽ました:

return $(a).length === 0; 

return !($(a).length > 0); 

if(!($(a).length > 0)) { 
    return true; 
} 

if($(a).length > 0) { 
    return false; 
} else { 
    return true; 
} 

return !!($(a).length === 0); 

// etc... 

はへの簡単な方法はあります要素が存在しない場合はtrueを返し、存在する場合はfalseを返します。

答えて

14

isの定義:

はセレクタ、要素、またはjQueryオブジェクトに対する要素の現在の一致セットを確認し、これらの元素のうちの少なくとも一方が指定された引数と一致する場合、真を返します。

問題があるのは、要素がないため、要素の1つが条件と一致しない可能性があるということです。要素がないので、jQueryはコードを呼び出していません。

EDIT:少し明確にするために、オブジェクト内のすべての要素に対してコードが1回呼び出されます(少なくとも1つが真を返すまで)。要素がないということは、コードが呼び出されないことを意味します。コード内のaは常に単一の要素です。

EDIT2:このことを念頭に置いて、これはpresentのより効率的な実装のようになります。

$.extend($.expr[':'],{ 
    present: function(a) { 
     return true; 
    } 
}); 
+0

したがって、一致したセレクタセットに要素が存在しない場合、 '.is'は本当にtrueを返すように設計されていませんか? 私は使っていたと考えるのだ別のオプション: '場合(。$( "#要素")(ある ":ない(本)が")){ はconsole.logは( "彼は、ジム・死にました。" ); } ' しかし、奇妙なことに、それはどちらも動作していません。 –

+1

@ Code Junkie:もう一度、 '.is()'を使用する要素がないので、関数は単に呼び出されません。あなたがそれに投げるセレクタに関係なく、何も起こりません! – BoltClock

+0

空のセレクタ結果に対してtrueを返す方法がないかもしれませんか? –

1

0はJavaScriptで「偽」です。

!$(a).lengthを返すことができます。

if (!$(a)[0]) { 
    // $(a) is empty 
} 

ので、$(a)[0]はjQueryオブジェクトの最初の要素を取得しますについてどのように

+4

は、あなたがそこに欲しいものを置くことができ、要素がない場合はコードが実行されることはありません。 –

0

。その要素がnull/undefinedの場合、jQueryオブジェクトが空であることを意味します。

5

あなたは単に

if(​$('element').length) // 1 or 0 will be returned 

または

$.extend($.expr[':'],{ 
    present: function(a) { 
     return $(a).length; 
    } 
}); 

if($('#element').is(':present')) 
{ 
    // code for existence 
} 
else 
{ 
    // code for non-existence 
} 

Exampleを使用することができます。

2

コレクションが空のときに$().is()が実行されないとすれば、:presentセレクタはむしろ余計です。だから、むしろ$.expr[':']で遊んよりも、私は例えば、適切な関数を含むように$.fnを拡張して行くだろう:

$.fn.extend({ 
    hasAny: function() { 
     return this.length > 0; 
    }, 
}); 

または

$.fn.extend({ 
    isEmpty: function() { 
     return this.length == 0; 
    }, 
}); 

私は個人的にこのアプローチとなるだろう理由は、セレクタは、一般的であるということですjQueryの要素の要素(:checked:enabled:selected:hover、等を比較されたい)の特定の特性を確認するために使用ない特性は、例えば.size()、(全体として設定します)。

使い方はもちろん、次のようになります。それは本当ですが

if ($('#element').isEmpty()) 
    console.log("He's dead, Jim."); 
+0

ええ、これはおそらく最終的には良い方法です。私は、最も良い方法が何であるかを見るために、すべてのオプションでほとんど遊んでいました。私はこの次のものと一緒に遊んでいきます。 ^^ –

関連する問題