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

2229

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

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

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

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

$(this)

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

Alex
источник

Ответы:

2854

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

jQuery("img", this);

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

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

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

jQuery(this).children("img");
Саймон
источник
575
для чего это стоит: jQuery ("img", this) внутренне преобразуется в: jQuery (this) .find ("img"), так что второй намного быстрее. :)
Пол Ирландский
24
Спасибо @Paul, я волновался, что использование find () было неправильным , оказывается, что это единственный выход;)
Agos
5
Если узел является прямым потомком, не будет ли быстрее всего сделать $ (this) .children ('img'); ?
adamyonk
11
@adamyonk нет, по крайней мере, если это что-то сделать: jsperf.com/jquery-children-vs-find/3
Саймон Стендер Боизен
3
Я вижу полную противоположность тому, что @PaulIrish заявил в этом примере - jsperf.com/jquery-selectors-comparison-a . Кто-нибудь может пролить свет? Либо я ошибся в тестовом примере, либо jquery изменил эту оптимизацию за последние 4 года.
Джонатан Ванаско
471

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

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

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

philnash
источник
В общем случае кажется, что $(this).children('img')было бы лучше. например, <div><img src="..." /><div><img src="..." /></div></div>потому что предположительно пользователь хочет найти imgs 1-го уровня.
Баттл Буткус
137

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

$(this).children("img:first")
rakslice
источник
6
Имеет ли :firstсоответствовать только « вниз ровно на один уровень », или же она соответствует «первой» , который был найден? img
Ян Бойд
3
@IanBoyd, .children()откуда происходит «вниз ровно на один уровень» и :firstоткуда «первый».
Тайлер Кромптон
3
@IanBoyd, этот элемент будет пропущен. Это будет применяться только если вы используете .find()вместо.children()
Тайлер Кромптон
2
если вы используете: сначала с .find () будьте осторожны, jQuery, похоже, находит всех потомков, а затем возвращает первый элемент, иногда очень дорогой
Clarence Liu
1
@ButtleButkus В вопросе thisуже была ссылка на <div>содержащую <img>, но если у вас есть несколько уровней тега для перехода от ссылки, которую вы имели, то вы определенно могли бы составить более одного children()вызова
rakslice,
76

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

$(this).next();
Roccivic
источник
16
.next () действительно хрупкий, если вы не всегда можете гарантировать, что элемент будет следующим элементом, лучше использовать другой метод. В этом случае IMG является потомком, а не родным братом div.
LocalPCGuy
ОП явно просил ребенка img внутри div.
Джорджио Темпеста,
65

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

$('> .child-class', this)
Райрон Виктор
источник
3
Этот ответ может вводить в заблуждение, так как нет элемента с дочерним классом, поэтому он не будет работать.
Джорджо Темпеста,
41

Вы можете найти все элементы 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/

Лалит Кумар Маурья
источник
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
Oskar
источник
Я бы использовал nth-child ()
McGuinness
31

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

$("#"+$(this).attr("id")+" img:first")
Адам
источник
54
это, вероятно, на самом деле работает, но это своего рода ответ Рубе Голдберга :)
Скотт Эверден
8
и если вы собираетесь использовать этот код, по крайней мере, выполните: $ ("#" + this.id + "img: first")
LocalPCGuy
10
@LocalPCGuy Вы имели в виду: «и если вы собираетесь использовать этот код, зовите на помощь »
gdoron поддерживает Monica
Зачем вам это делать, если «this» уже выбирает фактический div? Кроме того, если у div нет идентификатора, этот код не будет работать.
Джорджио Темпеста,
31

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

$(this).children()[0]
Maxam
источник
13
это будет работать, хотя он возвращает элемент dom, а не объект
jq
2
Я не знаю , если это лучший подход к текущей ситуации, но если вы хотите идти по этому пути и до сих пор в конечном итоге с объектом JQuery, просто обернуть его таким образом: $($(this).children()[0]).
Патридж
19
или даже проще$(this:first-child)
Реми
4
вместо того, чтобы $($(this).children()[x])использовать $(this).eq(x)или, если вы хотите первый, просто $(this).first().
Кристи Михай
16
@ Реми: Это даже не правильный синтаксис. (Потребовалось все 2 года, чтобы кто-нибудь заметил ...)
BoltClock
23

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

1 найти ():

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

2 детей ():

$(this).children('img');
Майк Кларк
источник
21

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

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

$('#test img').each(function(){
    console.log($(this).attr('src'));
});
Тирумалай Муруган
источник
15

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

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

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

 $('#divid > img').attr("src");
Деннис Р
источник
12

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

$("#id img")
tetutato
источник
2
this
Опер
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>

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

RPichioli
источник
5

У вас может быть от 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>

Джейсон Уильямс
источник
зачем ты это сделал? $("body").off("click", "#mydiv").on("click", "#mydiv", function() {
Chris22
Я не знаю, как и где @Alex использует его фрагмент. Итак, я сделал это максимально безопасным и общим. Прикрепление события к телу сделает это так, что событие сработает, даже если div не было в dom во время создания события. Очистка события перед созданием нового препятствует запуску обработчика более одного раза, когда событие инициируется. Не нужно делать это по-своему. Простое присоединение события к div также будет работать.
Джейсон Уильямс
Спасибо. Я видел это раньше в скрипте, и хотя он работал для того, что задумал программист, когда я попытался использовать его для модального окна, событие все же создало несколько модальных за один клик. Я думаю, что я использовал это неправильно, но я использовал event.stopImmediatePropagation()элемент, чтобы предотвратить это.
Chris22
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>

CSEngineer
источник
0

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

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
 $(this).find('img');
</script>
Хасан Файяз
источник
Чем это отличается от ответа philnash 11 лет назад?
Дэвид
0

Если ваш img точно первый элемент внутри div, попробуйте

$(this.firstChild);

Камил Келчевски
источник