<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");
#2 楼
您还可以使用$(this).find('img');
,这将返回所有
img
的后代div
评论
在一般情况下,似乎$(this).children('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
– 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>
评论
对于它的价值: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