$(this)セレクターの子を取得するにはどうすればよいですか?


2229

私はこれに似たレイアウトを持っています:

<div id="..."><img src="..."></div>

そして子供を選択するために、jQueryのセレクタを使用したいimgの内側divをクリックしてください。

を取得するためにdiv、私はこのセレクターを持っています:

$(this)

imgセレクターを使用して子を取得するにはどうすればよいですか?

回答:


2854

jQueryコンストラクターはcontext、選択のコンテキストをオーバーライドするために使用できる2番目のパラメーターを受け入れます。

jQuery("img", this);

これは次のように使用するのと同じ.find()です:

jQuery(this).find("img");

必要なimgがクリックされた要素の直接の子孫のみである場合は、次のものも使用できます.children()

jQuery(this).children("img");

575
何が価値があるのか​​:jQuery( "img"、this)は内部的に次のように変換されます:jQuery(this).find( "img")ですから、2番目はこれまでよりもわずかに高速です。:)
ポールアイリッシュ

24
@Paulに感謝します。find()の使用が間違っていると心配しました。それが唯一の方法であることがわかりました;)
Agos

5
ノードが直接の子である場合、$(this).children( 'img');を実行するのが最速ではないでしょうか。?
adamyonk

11
@adamyonk影響はない、少なくともこれが何かであるかどうかではない:jsperf.com/jquery-children-vs-find/3
Simon Stender

3
この例で@PaulIrishが述べたものとは正反対のjsperf.com/jquery-selectors-comparison-aが表示され ます。誰かが光を当てることはできますか?テストケースが間違っているか、jqueryが過去4年間でこの最適化を変更しました。
ジョナサンヴァナスコ2013年

471

あなたも使うことができます

$(this).find('img');

img子孫であるすべてのを返しますdiv


一般的なケースでは、$(this).children('img')より良いように思われます。たとえば<div><img src="..." /><div><img src="..." /></div></div>、おそらくユーザーが第1レベルのimgを検索したいためです。
バトルButkus 2014年

137

あなたがimg正確に1レベル下の最初のものを取得する必要がある場合は、行うことができます

$(this).children("img:first")

6
1つ下のレベル」に:firstのみ一致するか、または見つかっ「最初の」に一致するか。 img
Ian Boyd

3
@IanBoyd .children()は、「1つ下のレベル」:firstがどこから来たかであり、「最初」がどこから来たかです。
タイラークロンプトン

3
@IanBoyd、その要素は考慮されません。.find()代わりに使用する場合にのみ適用されます.children()
Tyler Crompton

2
.find()で:firstを使用している場合は注意してください。jQueryがすべての子孫を検出し、最初の要素を返すようです。非常に高価な場合があります
Clarence Liu

1
@ButtleButkus質問でthisは、既に<div>を含むへの参照でしたが、参照から<img>トラバースするタグのレベルが複数ある場合は、間違いなく複数のchildren()呼び出しを作成できます
rakslice

76

DIVタグの直後にIMGタグが続く場合は、次のものも使用できます。

$(this).next();

16
.next()は本当に壊れやすい要素です。要素が次の要素になることを常に保証できない場合は、別のメソッドを使用することをお勧めします。この場合、IMGはdivの子孫であり、兄弟ではありません。
LocalPCGuy 2011

OPは、div内の子imgを明示的に要求しました。
ジョルジョテンペスタ2018年


41

あなたは以下のように親divのすべてのimg要素を見つけることができます

$(this).find('img') or $(this).children('img')

特定のimg要素が必要な場合は、次のように書くことができます

$(this).children('img:nth(n)')  
// where n is the child place in parent list start from 0 onwards

divに含まれるimg要素は1つだけです。このため、以下は正しいです

 $(this).find("img").attr("alt")
                  OR
  $(this).children("img").attr("alt")

しかし、divに以下のようなimg要素が含まれている場合

<div class="mydiv">
    <img src="test.png" alt="3">
    <img src="test.png" alt="4">
</div>

次に、2番目のimg要素のalt値を見つけるために上位コードを使用することはできません。だからあなたはこれを試すことができます:

 $(this).find("img:last-child").attr("alt")
                   OR
 $(this).children("img:last-child").attr("alt")

この例は、親オブジェクト内で実際のオブジェクトを見つける方法の一般的な考え方を示しています。クラスを使用して子オブジェクトを区別できます。それは簡単で楽しいです。すなわち

<div class="mydiv">
    <img class='first' src="test.png" alt="3">
    <img class='second' src="test.png" alt="4">
</div>

以下のようにしてこれを行うことができます:

 $(this).find(".first").attr("alt")

より具体的に:

 $(this).find("img.first").attr("alt")

上記のコードのようにfindまたはchildrenを使用できます。詳細については、Children http://api.jquery.com/children/およびFind http://api.jquery.com/find/をご覧ください。例を参照してくださいhttp://jsfiddle.net/lalitjs/Nx8a6/


35

jQueryで子を参照する方法。次のjQueryに要約しました。

$(this).find("img"); // any img tag child or grandchild etc...   
$(this).children("img"); //any img tag child that is direct descendant 
$(this).find("img:first") //any img tag first child or first grandchild etc...
$(this).children("img:first") //the first img tag  child that is direct descendant 
$(this).children("img:nth-child(1)") //the img is first direct descendant child
$(this).next(); //the img is first direct descendant child

私はnth-child()を使用します
A McGuinness

31

DIVのIDがわからなければ、次のようにIMGを選択できると思います。

$("#"+$(this).attr("id")+" img:first")

54
これはおそらく実際に機能しますが、Rube Goldbergの回答のようなものです:)
Scott Evernden 2009

8
そのコードを使用する場合は、少なくとも次のようにします:$( "#" + this.id + "img:first")
LocalPCGuy

10
@LocalPCGuyあなたが意味したこと:「そして、もしあなたがヘルプのためにそのコードコールを使うつもりなら」
gdoronは

「this」がすでに実際のdivを選択しているのに、なぜこれを行うのですか さらに、divにIDがない場合、このコードは機能しません。
ジョルジョテンペスタ2018年

31

このコードを試してください:

$(this).children()[0]

13
jqオブジェクトではなくdom要素を返しますが、これは機能します
redsquare

2
それが現在の状況への最良のアプローチであるかどうかはわかりませんが、このルートをたどり、それでもjQueryオブジェクトで終了する場合は、そのようにラップするだけです$($(this).children()[0])
パトリッジ

19
またはもっと簡単に$(this:first-child)
レミー

4
代わりに$($(this).children()[x])使用$(this).eq(x)またはちょうど、あなたが最初のものをしたい場合$(this).first()
クリスティミハイ

16
@rémy:それは有効な構文ではありません。(誰もが気づくように2年間すべて
かかりました

23

次のいずれかの方法を使用できます。

1 find():

$(this).find('img');

2人の子供():

$(this).children('img');

21

jQuery eachは1つのオプションです。

<div id="test">
    <img src="testing.png"/>
    <img src="testing1.png"/>
</div>

$('#test img').each(function(){
    console.log($(this).attr('src'));
});

15

あなたは使用することができます子供Selecorを親内で利用可能な子要素を参照するために。

$(' > img', this).attr("src");

そして、以下は、参照がなく、他の関数から$(this)参照imgできるようにするdiv場合です。

 $('#divid > img').attr("src");


8

これが関数コードです。実行できます(簡単なデモです)。

DIVをクリックすると、いくつかの異なる方法で画像を取得できます。この場合、「this」はDIVです。

$(document).ready(function() {
  // When you click the DIV, you take it with "this"
  $('#my_div').click(function() {
    console.info('Initializing the tests..');
    console.log('Method #1: '+$(this).children('img'));
    console.log('Method #2: '+$(this).find('img'));
    // Here, i'm selecting the first ocorrence of <IMG>
    console.log('Method #3: '+$(this).find('img:eq(0)'));
  });
});
.the_div{
  background-color: yellow;
  width: 100%;
  height: 200px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="my_div" class="the_div">
  <img src="...">
</div>

それが役に立てば幸い!


5

<img>内に0個から多数のタグを含めることができます<div>

要素を見つけるには、 .find()ます。

コードを安全に保つには、を使用し.each()ます。

.find()およびを.each()一緒に使用すると、<img>要素が0の場合のnull参照エラーが防止され、複数の<img>要素の処理も可能になります。

// Set the click handler on your div
$("body").off("click", "#mydiv").on("click", "#mydiv", function() {

  // Find the image using.find() and .each()
  $(this).find("img").each(function() {
  
        var img = this;  // "this" is, now, scoped to the image element
        
        // Do something with the image
        $(this).animate({
          width: ($(this).width() > 100 ? 100 : $(this).width() + 100) + "px"
        }, 500);
        
  });
  
});
#mydiv {
  text-align: center;
  vertical-align: middle;
  background-color: #000000;
  cursor: pointer;
  padding: 50px;
  
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<div id="mydiv">
  <img src="" width="100" height="100"/>
</div>


どうしてこれをやったの? $("body").off("click", "#mydiv").on("click", "#mydiv", function() {
Chris22、2017

@Alexが彼のスニペットをどこでどのように使用しているかはわかりません。それで、私はそれを可能な限り安全で一般的なものにしました。イベントをbodyにアタッチすると、イベントが作成されたときにdivがdomになかった場合でもイベントがトリガーされます。新しいイベントを作成する前にイベントをクリアすると、イベントがトリガーされたときにハンドラーが複数回実行されなくなります。私のやり方で行う必要はありません。イベントをdivに添付するだけでも機能します。
Jason Williams

ありがとう。これはスクリプトで以前に見たことがありますが、プログラマーが意図したとおりに機能する一方で、モーダルウィンドウに使用しようとすると、イベントはシングルクリックでいくつかのモーダルを作成しました。私はそれを間違って使用していたと思いますが、それがevent.stopImmediatePropagation()起こらないようにするために要素を使用することにしました。
Chris22、2017

4

$(document).ready(function() {
  // When you click the DIV, you take it with "this"
  $('#my_div').click(function() {
    console.info('Initializing the tests..');
    console.log('Method #1: '+$(this).children('img'));
    console.log('Method #2: '+$(this).find('img'));
    // Here, i'm selecting the first ocorrence of <IMG>
    console.log('Method #3: '+$(this).find('img:eq(0)'));
  });
});
.the_div{
  background-color: yellow;
  width: 100%;
  height: 200px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="my_div" class="the_div">
  <img src="...">
</div>


0

あなたは使うことができます

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
 $(this).find('img');
</script>

これは11年前のphilnashの回答とどう違うのですか?
デビッド

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.