我的布局与此类似:

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


,并希望使用jQuery选择器在单击时选择img内部的子级div

要获得div,我有以下选择器:

$(this)


如何使用选择器获得子img

#1 楼

jQuery构造函数接受名为context的第二个参数,该参数可用于覆盖选择的上下文。

jQuery("img", this);


与使用.find()的相同,例如:

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


如果您想要的imgs是仅是clicked元素的直接后代,也可以使用.children()

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


评论


对于它的价值:jQuery(“ img”,this)在内部被转换为:jQuery(this).find(“ img”)所以第二个要快得多。 :)

–保罗·爱尔兰(Paul Irish)
2010年1月8日23:49

谢谢@Paul,我担心使用find()是错误的,事实证明这是唯一的方法;)

–前
2010-2-17在11:36

如果该节点是直接子节点,那么仅仅执行$(this).children('img');会不是最快的。 ?

–adamyonk
2011年8月5日,11:58

@adamyonk实际上没有,如果要这样做,至少也没有:jsperf.com/jquery-children-vs-find/3

–西蒙·斯坦德·博伊森(Simon Stender Boisen)
2011年10月13日在6:21



我看到的与@PaulIrish在此示例中所说的完全相反-jsperf.com/jquery-selectors-comparison-a。谁能阐明一些想法?要么我弄错了测试用例,要么jquery在最近4年中更改了此优化。

–乔纳森·瓦纳斯科
13年11月21日在20:19

#2 楼

您还可以使用

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


,这将返回所有img的后代div

评论


在一般情况下,似乎$(this).children('img')会更好。例如
,因为大概用户希望找到第一级img。

–瓶Butkus
14-10-28在6:47

#3 楼

如果您需要将第一个img降到一个水平以下,可以执行

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


评论


:first只匹配“精确向下一个级别”,还是匹配找到的“ first” img?

–伊恩·博伊德(Ian Boyd)
2012年5月15日在21:08



@IanBoyd,.children()是“向下精确一级”的来源,而:first是“第一级”的来源。

–泰勒·克朗普顿(Tyler Crompton)
2012年7月3日在21:43

@IanBoyd,该元素将无法说明。仅当您使用.find()而不是.children()时才适用

–泰勒·克朗普顿(Tyler Crompton)
2012年7月4日在1:26

如果您使用:first和.find()时要小心,jQuery似乎会找到所有后代,然后返回第一个元素,有时会非常昂贵

–刘嘉玲
2012年10月8日23:43

@ButtleButkus在问题中,这已经是对包含
的引用,但是,如果您要从该引用中遍历多个级别的标记,那么您肯定可以构成多个不止一个child()调用

– rakslice
14-10-28在17:47

#4 楼

如果您的DIV标签后面紧跟着IMG标签,则还可以使用:

$(this).next();


评论


.next()确实很脆弱,除非您始终可以保证该元素将是下一个元素,否则最好使用其他方法。在这种情况下,IMG是div的后代,而不是同级。

– LocalPCGuy
2011-12-28 18:12

OP明确要求div内有一个子img。

–乔治·坦佩斯塔(Giorgio Tempesta)
18年5月25日在10:15

#5 楼

直接的孩子是

$('> .child-class', this)


评论


这个答案可能会引起误解,因为“子”类中没有任何元素,因此无法正常工作。

–乔治·坦佩斯塔(Giorgio Tempesta)
18年5月25日在10:17

#6 楼

您可以找到父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元素。所以下面这个是正确的

 $(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>


那么您将无法使用较高的代码来查找第二个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或child。有关更多信息,请访问儿童http://api.jquery.com/children/并找到http://api.jquery.com/find/。
请参见示例http://jsfiddle.net/lalitjs/Nx8a6/

#7 楼

在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()

–麦吉尼斯
18-09-29在20:11



#8 楼

我不知道DIV的ID,我认为您可以像这样选择IMG:

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


评论


这可能实际上有效,但这有点像鲁伯·戈德堡的答案:)

–斯科特·埃弗登(Scott Evernden)
09年4月9日,0:39

如果要使用该代码,至少要这样做:$(“#” + this.id +“ img:first”)

– LocalPCGuy
2011-12-28 18:08



@LocalPCGuy您的意思是:“如果要使用该代码调用来寻求帮助”

– gdoron支持Monica
13年3月24日在13:36

如果“ this”已经选择了实际的div,为什么还要这样做呢?此外,如果div没有ID,则此代码将无效。

–乔治·坦佩斯塔(Giorgio Tempesta)
18年5月25日在10:21

#9 楼

尝试以下代码:

$(this).children()[0]


评论


尽管它返回的是dom元素而不是jq对象,但这仍然可以工作

–红场
08年11月20日在21:07

我不知道这是否是解决当前情况的最佳方法,但是如果您想走这条路线而仍然以jQuery对象结尾,只需用以下方式包装它即可:$($(this).children()[ 0])。

–墨盒
2010-2-24在17:16

甚至更简单的$(this:first-child)

–rémy
2011年5月11日在9:52

而不是$($(this).children()[x])使用$(this).eq(x),或者如果您想要第一个,则只需$(this).first()。

–克里斯蒂·米海(Cristi Mihai)
2012年5月21日在20:03



@rémy:这甚至不是有效的语法。 (花了整整2年的时间让任何人注意到...)

– BoltClock♦
2013年6月17日18:40



#10 楼

您可以使用以下方法之一:

1 find():

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


2 children():

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


#11 楼

jQuery的each是一种选择:

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

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


#12 楼

您可以使用Child Selecor引用父级中可用的子级元素。

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


如果您没有引用$(this),而您想引用,则以下内容img在其他功能的div中可用。

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


#13 楼

这也应该起作用:

$("#id img")


评论


操作人员想要使用此

–巴尔加夫Nanekalva
2015年9月7日上午9:03

#14 楼

这是一个功能代码,您可以运行它(这是一个简单的演示)。

当您单击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> 





希望有帮助!

#15 楼

您的<img>内部可能有0到许多<div>标签。

要查找元素,请使用.find()

为了确保代码安全,请使用.each()

同时使用.find().each()可以防止出现0个<img>元素时出现空引用错误,同时还可以处理多个<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
17年9月16日在1:18

我不知道@Alex使用他的代码片段的方式或位置。因此,我使它尽可能安全和通用。将事件附加到正文将使事件得以触发,即使在创建事件时div不在dom中,事件也将触发。在创建新事件之前清除事件可防止处理程序在触发事件时多次运行。没必要按照我的方式去做。只需将事件附加到div上也可以。

–詹森·威廉姆斯(Jason Williams)
17年9月26日在21:32

谢谢。我以前在脚本中已经看到过这一点,尽管它可以满足程序员的预期,但是当我尝试将其用于模式窗口时,该事件仍然可以单击创建多个模式。我想我用错了,但是我最后在元素上使用event.stopImmediatePropagation()来防止这种情况的发生。

– Chris22
17-09-30在1:48



#16 楼




 $(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> 




#17 楼

您可以使用

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


评论


这与11年前philnash的回答有何不同?

–大卫
19-09-19在7:37

#18 楼

如果您的img恰好是div中的第一个元素,请尝试

$(this.firstChild);





 $( "#box" ).click( function() {
  let img = $(this.firstChild);
  console.log({img});
}) 

 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id="box"><img src="https://picsum.photos/seed/picsum/300/150"></div>