Как получить дочерние элементы селектора $ (this)?

У меня есть макет, похожий на этот:

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

и хотел бы использовать селектор jQuery, чтобы выбрать дочернего imgэлемента внутри divклика.

Чтобы получить div, у меня есть этот селектор:

$(this)

Как я могу получить ребенка imgс помощью селектора?

20.11.2008 19:44:05
17 ОТВЕТОВ
РЕШЕНИЕ

Конструктор jQuery принимает второй вызываемый параметр, contextкоторый можно использовать для переопределения контекста выбора.

jQuery("img", this);

Что так же, как использовать, .find()как это:

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

Если ГИМ вы желаете являются только прямыми потомками щелкнутого элемента, вы также можете использовать .children():

jQuery(this).children("img");
2850
25.06.2014 20:45:42
для чего это стоит: jQuery ("img", this) внутренне преобразуется в: jQuery (this) .find ("img"), так что вторая намного быстрее. :)
Paul Irish 8.01.2010 23:49:52
Спасибо @Paul, я волновался, что использование find () было неправильным , оказывается, что это единственный выход;)
Agos 17.02.2010 11:36:32
Если узел является прямым потомком, не будет ли быстрее всего сделать $ (this) .children ('img'); ?
adamyonk 5.08.2011 11:58:42
@adamyonk нет, по крайней мере, если это что-то сделать: jsperf.com/jquery-children-vs-find/3
Simon Stender Boisen 13.10.2011 06:21:36
Я вижу полную противоположность тому, что @PaulIrish заявил в этом примере - jsperf.com/jquery-selectors-comparison-a . Кто-нибудь может пролить свет? Либо я ошибся в тестовом примере, либо jquery изменил эту оптимизацию за последние 4 года.
Jonathan Vanasco 21.11.2013 20:19:18

Попробуйте этот код:

$(this).children()[0]
31
17.06.2013 18:40:39
это будет работать, хотя он возвращает элемент dom, а не объект
redsquare 20.11.2008 21:07:38
Я не знаю , если это лучший подход к текущей ситуации, но если вы хотите идти по этому пути и до сих пор в конечном итоге с объектом JQuery, просто обернуть его таким образом: $($(this).children()[0]).
patridge 24.02.2010 17:16:56
или даже проще$(this:first-child)
rémy 11.05.2011 09:52:55
вместо того, чтобы $($(this).children()[x])использовать $(this).eq(x)или, если вы хотите первый, просто $(this).first().
Cristi Mihai 21.05.2012 20:03:33
@ Реми: Это даже не правильный синтаксис. (Потребовалось все 2 года, чтобы кто-нибудь заметил ...)
BoltClock♦ 17.06.2013 18:40:36

Не зная ID DIV, я думаю, вы можете выбрать IMG следующим образом:

$("#"+$(this).attr("id")+" img:first")
31
20.11.2008 19:56:20
это, вероятно, на самом деле работает, но это своего рода ответ Рубе Голдберга :)
Scott Evernden 9.04.2009 00:39:37
и если вы собираетесь использовать этот код, по крайней мере, выполните: $ ("#" + this.id + "img: first")
LocalPCGuy 28.12.2011 18:08:02
@LocalPCGuy Вы имели в виду: «и если вы собираетесь использовать этот код, обратитесь за помощью »
gdoron is supporting Monica 24.03.2013 13:36:27
Зачем вам это делать, если «this» уже выбирает фактический div? Кроме того, если у div нет идентификатора, этот код не будет работать.
Giorgio Tempesta 25.05.2018 10:21:26

Вы также можете использовать

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

который вернул бы все imgs, которые являются потомкамиdiv

469
20.11.2008 21:23:15
В общем случае кажется, что $(this).children('img')было бы лучше. например, <div><img src="..." /><div><img src="..." /></div></div>потому что предположительно пользователь хочет найти imgs 1-го уровня.
Buttle Butkus 28.10.2014 06:47:07

Если за вашим тегом DIV сразу же следует тег IMG, вы также можете использовать:

$(this).next();
75
27.11.2011 00:03:20
.next () действительно хрупкий, если вы не всегда можете гарантировать, что элемент будет следующим элементом, лучше использовать другой метод. В этом случае IMG является потомком, а не родным братом div.
LocalPCGuy 28.12.2011 18:12:02
ОП явно просила ребенка img внутри div.
Giorgio Tempesta 25.05.2018 10:15:58

Если вам нужно получить первый уровень imgниже ровно на один уровень, вы можете сделать

$(this).children("img:first")
137
21.07.2011 18:47:31
Имеет ли :firstсоответствовать только « вниз ровно на один уровень », или же она соответствует «первой» , который был найден? img
Ian Boyd 15.05.2012 21:08:26
@IanBoyd .children()- это то, откуда происходит «вниз ровно на один уровень» и :firstоткуда «первое».
Tyler Crompton 3.07.2012 21:43:21
@IanBoyd, этот элемент будет пропущен. Это будет применяться только если вы используете .find()вместо.children()
Tyler Crompton 4.07.2012 01:26:16
если вы используете: сначала с .find () будьте осторожны, jQuery, похоже, находит всех потомков, а затем возвращает первый элемент, иногда очень дорогой
Clarence Liu 8.10.2012 23:43:29
@ButtleButkus В вопросе thisуже была ссылка на <div>содержащую <img>, но если у вас есть несколько уровней тега для перехода от ссылки, которую вы имели, то вы определенно могли бы составить более одного children()вызова
rakslice 28.10.2014 17:47:05

В прямых детей

$('> .child-class', this)
64
19.12.2019 18:29:13
Этот ответ может вводить в заблуждение, так как нет элемента с дочерним классом, поэтому он не будет работать.
Giorgio Tempesta 25.05.2018 10:17:32

Вы можете найти все элементы img родительского div, как показано ниже

$(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. Так что вы можете попробовать это:

 $(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, как указано выше. Для получения дополнительной информации посетите Дети http://api.jquery.com/children/ и найдите http://api.jquery.com/find/ . Смотрите пример http://jsfiddle.net/lalitjs/Nx8a6/

41
4.12.2013 04:59:04

JQuery's eachявляется одним из вариантов:

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

$('#test img').each(function(){
    console.log($(this).attr('src'));
});
21
23.06.2014 07:11:48

Вы можете использовать Child Selecor для ссылки на дочерние элементы, доступные в родительском элементе .

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

И ниже, если у вас нет ссылки на $(this)и вы хотите сделать ссылку imgдоступной в divдругой функции.

 $('#divid > img').attr("src");
15
25.07.2014 21:56:40

Способы обращения к ребенку в 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
35
25.01.2015 13:25:03
Я бы использовал nth-child ()
A McGuinness 29.09.2018 20:11:49

Также это должно работать:

$("#id img")
11
21.08.2015 06:22:13
this
Bhargav Nanekalva 7.09.2015 09:03:53

Вы можете использовать любой из следующих методов:

1 найти ():

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

2 детей ():

$(this).children('img');
23
21.08.2015 06:36:05

Вот функциональный код, вы можете запустить его (это простая демонстрация).

Когда вы щелкаете по 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>

Надеюсь, это поможет!

8
9.10.2017 13:12:55

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

4
5.03.2017 13:27:33

У вас может быть от 0 до много <img>тегов внутри вашего <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>

5
11.09.2017 20:01:14
зачем ты это сделал? $("body").off("click", "#mydiv").on("click", "#mydiv", function() {
Chris22 16.09.2017 01:18:41
Я не знаю, как и где @Alex использует его фрагмент. Итак, я сделал это максимально безопасным и общим. Прикрепление события к телу сделает это так, что событие сработает, даже если div не было в dom на момент создания события. Очистка события перед созданием нового препятствует запуску обработчика более одного раза при запуске события. Не нужно делать это по-своему. Простое присоединение события к div также подойдет.
Jason Williams 26.09.2017 21:32:04
Спасибо. Я видел это раньше в скрипте, и хотя он работал для того, что задумал программист, когда я пытался использовать его для модального окна, событие все же создало несколько модальных за один клик. Я думаю, что я использовал это неправильно, но я использовал event.stopImmediatePropagation()элемент, чтобы предотвратить это.
Chris22 30.09.2017 01:48:23

Вы могли бы использовать

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
 $(this).find('img');
</script>
0
19.09.2019 07:18:23
Чем это отличается от ответа philnash 11 лет назад?
David 19.09.2019 07:37:10