jQuery一致したクラスが指定されたIDを持っているかどうかを判別します


95

jQueryには次のステートメントと同等のIDがありますか?

$('#mydiv').hasClass('foo')

そのため、クラス名を付けて、指定されたIDが含まれていることを確認できます。

何かのようなもの:

$('.mydiv').hasId('foo')

特定のdivにスタイルを適用したい。たとえば、ロード時にfooのクラスを持つすべてが表示されますが、barのIDを持つクラスfooの1つのインスタンスをオフに切り替えたい場合があります。
Nicholas Murray、

1
次に$('#bar.foo').toggle();、ドキュメントに対して一意である必要があるため、IDは1つだけになります。それがクラスのものである場合にのみそのIDを切り替える必要がある場合は、fooそのクラスをIDセレクターに追加するだけです。セレクタが空のセットを見つけた場合、何も起こりません。結果のセット(1つしかない)が見つかった場合、要素を切り替えます。私はこれを考えすぎていると思います。
prodigitalson 2010

3
「なぜそんなことをしたいの?」とイライラする人を言うだけです。今これをやろうとしているとき。hasClassの問題は、セレクターに一致するすべての要素が指定されたクラスを持つ場合にTrueを返すことです。したがって、「ケーキ」というクラスと、それぞれに追加のクラス名(「1つ」、「2つ」など)を持つpがたくさんある場合、問題が発生します。p.cakeの一般的なセットを選択してから、条件付き(class = "one"-$ var = 23-などの場合)を設定します。ポイントは、追加のクラス名に応じて異なる$ varを渡そうとしていることです。私は全体を繰り返す必要がないようにしていますo
Stella

回答:


171

複数のセレクターを組み合わせることで、そのロジックをセレクターに焼き込むことができます。たとえば、特定のクラスを持つ特定のIDを持つすべての要素をターゲットにすることができます。

$("#foo.bar"); // Matches <div id="foo" class="bar">

これは、CSSで作成するものに似ているはずです。これはすべての#foo要素に適用されるわけではなく(1つしか存在しないはずです)、すべての要素には適用されないことに注意してください.bar(多数ある場合もあります)。両方の属性に該当する要素のみを参照します。

jQueryには、要素に特定の品質があるかどうかを判断できる優れた.isメソッドもあります。文字列セレクター、HTML要素、または別のjQueryオブジェクトに対してjQueryコレクションをテストできます。この場合は、文字列セレクターと照合するだけです。

$(".bar:first").is("#foo"); // TRUE if first '.bar' in document is also '#foo'

32
の+1 is()。あるはずです.hasId()、それは明らかに、パートナーのように思えるだという理由だけで、セレクタ.hasClass()...本当に
マット・フレッチャー

43

私はおそらく$('.mydiv').is('#foo');それを使用するでしょうIdを知っているなら、なぜそれを最初にセレクターに適用しないのですか?


17
たぶん、コードは、特定のケースを異なる方法で処理する必要があるコールバック関数に入ります。したがって、関数には、不明な属性を持つjQueryオブジェクトが自動的に渡されます。この場合、$( 'your answer')。is( 'helpful');
ピーター・G

1
理由はいくつも考えられます。要素にid = "mobile"がある場合など、モバイル固有の設定を適用する場合はどうでしょうか。理由は重要ではありません。
2015年

さて、1つの要素だけが特定idの属性を持つ必要があります。それ以外の場合は、他の属性である必要があります...問題の要素の構造的な場所がページまたはクライアント/ユーザーエージェントに基づいて変更されたとしても、それ以外は問題ないでしょう。 。
prodigitalson

19

更新:質問を誤解して申し訳ありません、回答を削除しまし.has()た。

別の代替方法、.hasId()プラグインを作成する

// the plugin
$.fn.hasId = function(id) {
  return this.attr('id') == id;
};

// select first class
$('.mydiv').hasId('foo') ?
  console.log('yes') : console.log('no');

// select second class
// $('.mydiv').eq(1).hasId('foo')
// or
$('.mydiv:eq(1)').hasId('foo') ?
  console.log('yes') : console.log('no');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="mydiv" id="foo"></div>
<div class="mydiv"></div>


5
申し訳ありませんが、質問を誤って解釈したと思います。has ()APIはこれを報告します:一致する要素のセットを、セレクターまたはDOM要素に一致する子孫を持つ要素に減らします。OPは、クラス 'myDiv'の要素にもID fooがあるかどうかをテストする方法を尋ねていますが、has()は、ID 'foo'を持つ 'myDiv'の子孫を探します。
2014

7

いくつかのDOMオブジェクトを反復処理していて、特定のIDを持つ要素を見つけてキャッチしたいとします。

<div id="myDiv">
    <div id="fo"><div>
    <div id="bar"><div>
</div>

あなたは見つけるようなものを書くことができます

$('#myDiv').find('#bar')

クラスセレクターを使用する場合、findメソッドは一致するすべての要素を返すことに注意してください。

または、より高度な作業を行う反復関数を作成することもできます

<div id="myDiv">
    <div id="fo"><div>
    <div id="bar"><div>
    <div id="fo1"><div>
    <div id="bar1"><div>
    <div id="fo2"><div>
    <div id="bar2"><div>
</div>

$('#myDiv div').each(function() {
   if($(this).attr('id') == 'bar1')
       //do something with bar1
});

同じコードをクラスセレクター用に簡単に変更できます。

<div id="myDiv">
    <div class="fo"><div>
    <div class="bar"><div>
    <div class="fo"><div>
    <div class="bar"><div>
    <div class="fo"><div>
    <div class="bar"><div>
</div>

$('#myDiv div').each(function() {
   if($(this).hasClass('bar'))
       //do something with bar
});

index()で問題を解決できてうれしいです。これでうまくいきます。これが同じ問題を持つ他の人の助けになることを願っています。乾杯:)


4
$('#' + theMysteryId + '.someClass').each(function() { /* do stuff */ });

1つしか存在しないため、それぞれが不要#theMysteryIdです。
prodigitalson 2010

2
まあ、それを変数に割り当て、長さが空でないかどうかを確認してからコードを続行するという手間を省くことができます。セレクターが何にも一致しない場合、jQueryは「each」関数を呼び出さないだけなので、きれいです。次に、jQuery APIを呼び出すだけでよい場合は、確認してください。
先のとがった

4

ただ言うと、私は最終的にこれをindex()を使用して解決しました。

他に何も機能していないようです。

したがって、兄弟要素の場合、これは、最初に共通のクラスで選択し、次に特定のクラスごとに異なるものを変更したい場合の適切な回避策です。

編集:(私のように)知らない人のために、index()は、DOMでの順序に応じて、セレクターに一致する各要素のインデックス値を0から数えます。class = "foo"で要素の数がわかっている限り、IDは必要ありません。

明らかにこれが常に役立つとは限りませんが、誰かがそれを役に立つと思うかもしれません。



1

次のようにして、id要素が使用されているかどうかを確認することもできます。

if(typeof $(.div).attr('id') == undefined){
   //element has no id
} else {
   //element has id selector
}

このメソッドをグローバルdataTablesおよび特定の順序付けられたdataTablesに使用します


未定義のは、「未定義の」そうのような動作するために引用符で囲む必要があります
レオ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.