Π‘Ρ‚Π°Ρ‚ΡŒΡ

πŸ“˜ Π£Ρ€ΠΎΠΊ 5: Навигация ΠΏΠΎ DOM β€” Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅, Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ ΠΈ сосСдниС элСмСнты Π² jQuery

ЦСль: ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ jQuery для пСрСмСщСния ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ DOM — Π²Π²Π΅Ρ€Ρ… ΠΊ родитСлям, Π²Π½ΠΈΠ· ΠΊ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌ ΠΈ Π² стороны ΠΊ сосСдним элСмСнтам. Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ структурами, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, списками, Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ, Π±Π»ΠΎΠΊΠ°ΠΌΠΈ с ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ ΠΈ Ρ‚. Π΄.


πŸ”Ή Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ DOM?

DOM (Document Object Model) — это иСрархичСская структура HTML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ HTML-элСмСнт — это ΡƒΠ·Π΅Π» Π΄Π΅Ρ€Π΅Π²Π°.

jQuery Π΄Π°Ρ‘Ρ‚ ΠΌΠΎΡ‰Π½Ρ‹Π΅ инструмСнты для Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ ΠΏΠΎ этому Π΄Π΅Ρ€Π΅Π²Ρƒ: Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Π½ΡƒΠΆΠ½Ρ‹ΠΉ элСмСнт Π½Π΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΏΠΎ сСлСктору, Π° ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ — Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

  • Найти родитСля ΠΊΠ½ΠΎΠΏΠΊΠΈ,

  • Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ всСх Π΄Π΅Ρ‚Π΅ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°,

  • ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ сосСдний элСмСнт послС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΈ Ρ‚. Π΄.


πŸ”Έ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ

ΠœΠ΅Ρ‚ΠΎΠ΄ Π§Ρ‚ΠΎΠ΄Π΅Π»Π°Π΅Ρ‚
.parent() ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ родитСля
.parents() ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всСх Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ Π²Π²Π΅Ρ€Ρ… ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ
.children() ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всСх прямых ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ²
.find() Найти всСх ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² ΠΏΠΎ сСлСктору
.siblings() ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всСх сосСдСй элСмСнта
.next() Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ сосСд
.prev() ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ сосСд
.closest() Найти блиТайшСго родитСля ΠΏΠΎ сСлСктору

πŸ”Έ Π Π°Π±ΠΎΡ‚Π° с родитСлями

parent()

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ родитСля элСмСнта:

$('#text').parent().css('border', '1px solid red');

πŸ“Œ ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

<div class="box">
  <p id="text">Абзац</p>
</div>

Π’ΠΎΠ³Π΄Π° $('#text').parent() Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ .box.


parents()

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ всСх Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ Π΄ΠΎ <html>:

$('#text').parents().addClass('ancestor');

МоТно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ:

$('#text').parents('.container');

closest()

Π˜Ρ‰Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ родитСля, подходящСго ΠΏΠΎΠ΄ сСлСктор:

$('#text').closest('.card').css('background', '#eee');

ПолСзно для дСлСгирования событий ΠΈ локального поиска.


πŸ”Έ Π Π°Π±ΠΎΡ‚Π° с ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌΠΈ

children()

Находит прямых ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ²:

$('.list').children().css('color', 'blue');

МоТно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€:

$('.list').children('li.active');

find()

Находит всСх ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² ΠΏΠΎ сСлСктору (Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎ):

$('.form').find('input[type="text"]').val('ΠŸΡ€ΠΈΠΌΠ΅Ρ€');

πŸ“Œ Π Π°Π·Π½ΠΈΡ†Π°:

  • children() — Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 1 ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π²Π½ΠΈΠ·.

  • find() — всС ΡƒΡ€ΠΎΠ²Π½ΠΈ Π²Π½ΠΈΠ·.


πŸ”Έ БосСдниС элСмСнты

siblings()

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ всСх Π±Ρ€Π°Ρ‚ΡŒΠ΅Π²/сСстёр элСмСнта:

$('.selected').siblings().removeClass('highlight');

next() ΠΈ prev()

next() — сосСд Π²ΠΏΠ΅Ρ€Π΅Π΄ΠΈ, prev() — сосСд ΠΏΠΎΠ·Π°Π΄ΠΈ:

$('#current').next().css('font-weight', 'bold');
$('#current').prev().css('opacity', 0.5);

πŸ”Έ ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅

πŸ“¦ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1: ΠŸΠΎΠ΄ΡΠ²Π΅Ρ‚ΠΊΠ° строки Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΡ€ΠΈ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΈ

<table>
  <tr><td>ΠŸΠ΅Ρ€Π²Π°Ρ</td></tr>
  <tr class="target"><td>Вторая</td></tr>
  <tr><td>Π’Ρ€Π΅Ρ‚ΡŒΡ</td></tr>
</table>

<script>
  $('.target').hover(
    function() {
      $(this).siblings().css('opacity', 0.5);
    },
    function() {
      $(this).siblings().css('opacity', 1);
    }
  );
</script>

πŸ“¦ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2: Найти родитСля ΠΏΠΎ сСлСктору

<div class="card">
  <div class="content">
    <button class="like">Like</button>
  </div>
</div>

<script>
  $('.like').click(function() {
    $(this).closest('.card').toggleClass('liked');
  });
</script>

πŸ”Έ Π¦Π΅ΠΏΠΎΡ‡ΠΊΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² (chaining)

Π’ jQuery ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ подряд:

$('#block')
  .parent()
  .css('border', '1px solid blue')
  .children('p')
  .text('Новый тСкст');

Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎ ΠΈ экономит строки ΠΊΠΎΠ΄Π°.


πŸ”Έ ЧастыС ошибки

❌ Ошибка: использованиС children() вмСсто find()

$('.container').children('.target'); // Ρ‚ΠΎΠ»ΡŒΠΊΠΎ прямыС Π΄Π΅Ρ‚ΠΈ
$('.container').find('.target'); // Π»ΡŽΠ±Ρ‹Π΅ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅

❌ ИспользованиС parents() Π±Π΅Π· Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ слишком ΠΌΠ½ΠΎΠ³ΠΎ элСмСнтов. Π›ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ closest() ΠΈΠ»ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ:

$(this).parents('.wrapper:first'); // Ρ‚ΠΎΠ»ΡŒΠΊΠΎ блиТайший

πŸ“‹ УпраТнСния

  1. Найди блиТайший Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ элСмСнта .delete с классом .item ΠΈ ΡƒΠ΄Π°Π»ΠΈ Π΅Π³ΠΎ.

  2. Для всСх .card, добавь класс .selected ΠΈΡ… послСднСму Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΌΡƒ элСмСнту.

  3. По Π½Π°ΠΆΠ°Ρ‚ΠΈΡŽ Π½Π° .next-btn Π²Ρ‹Π±Π΅Ρ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ .slide ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠΈ Π΅Π³ΠΎ.

  4. ΠžΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈ всСх Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ элСмСнта #comment Π² консоли.


πŸ“Œ Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Навигация ΠΏΠΎ DOM — основа Π³ΠΈΠ±ΠΊΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с HTML-структурой. Π‘ Π΅Ρ‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Ρ‹ моТСшь Π»Π΅Π³ΠΊΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ элСмСнты Π½Π΅ ΠΏΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ сСлСктору, Π° ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ элСмСнта, Ρ‡Ρ‚ΠΎ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с динамичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ, ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ, Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ ΠΈ Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ.

Для ΠΎΡ‚Π²Π΅Ρ‚Π° Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ