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

πŸ“˜ Π£Ρ€ΠΎΠΊ 6: Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅, ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнтов β€” `append()`, `prepend()`, `clone()`, `remove()`, `empty()` ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅

ОглавлСниС

ЦСль: Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ динамичСски Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ, ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ HTML-элСмСнты Π½Π° страницС ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ jQuery. Π­Ρ‚ΠΎ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡ€ΠΈ создании Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½Ρ‹Ρ… интСрфСйсов — Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, списков Π·Π°Π΄Π°Ρ‡, ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡Π΅ΠΊ Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ², ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΈ Ρ‚. Π΄.


πŸ”Ή Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Одна ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ jQuery — Ρ€Π°Π±ΠΎΡ‚Π° с DOM. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ρ‚Ρ‹ моТСшь:

  • Π”ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ элСмСнты Π² HTML,

  • Π£Π΄Π°Π»ΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΡ‡ΠΈΡ‰Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅,

  • ΠšΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΡƒΠΆΠ΅ созданныС элСмСнты.

Π­Ρ‚ΠΈ дСйствия Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².


πŸ”Έ append() ΠΈ prepend()

Оба ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π²ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π½ΠΎΠ²Ρ‹ΠΉ HTML Π²Π½ΡƒΡ‚Ρ€ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ элСмСнта:

ΠœΠ΅Ρ‚ΠΎΠ΄ Π§Ρ‚ΠΎΠ΄Π΅Π»Π°Π΅Ρ‚
append() ДобавляСт Π² ΠΊΠΎΠ½Π΅Ρ† элСмСнта
prepend() ДобавляСт Π² Π½Π°Ρ‡Π°Π»ΠΎ элСмСнта

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

$('#list').append('<li>Новый ΠΏΡƒΠ½ΠΊΡ‚</li>');
$('#list').prepend('<li>ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡƒΠ½ΠΊΡ‚</li>');

πŸ“¦ HTML Π΄ΠΎ:

<ul id="list">
  <li>ΠŸΡƒΠ½ΠΊΡ‚ 1</li>
</ul>

πŸ“¦ ПослС Π²Ρ‹Π·ΠΎΠ²Π° append():

<ul id="list">
  <li>ΠŸΡƒΠ½ΠΊΡ‚ 1</li>
  <li>Новый ΠΏΡƒΠ½ΠΊΡ‚</li>
</ul>

πŸ”Έ after() ΠΈ before()

Π­Ρ‚ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ Π²Π½Π΅ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ элСмСнта:

ΠœΠ΅Ρ‚ΠΎΠ΄ Π§Ρ‚ΠΎΠ΄Π΅Π»Π°Π΅Ρ‚
after() ВставляСт послС элСмСнта
before() ВставляСт ΠΏΠ΅Ρ€Π΅Π΄ элСмСнтом

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

$('h2').after('<p>ВСкст послС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°</p>');
$('h2').before('<hr>');

πŸ”Έ clone()

ΠœΠ΅Ρ‚ΠΎΠ΄ clone() ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ элСмСнт. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±Π΅Π· событий, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ true, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ.


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

let copy = $('.note').clone();
$('#container').append(copy);

Π‘ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ:

let copy = $('.note').clone(true);

πŸ“¦ ПолСзно для:

  • Π¨Π°Π±Π»ΠΎΠ½ΠΎΠ² ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡Π΅ΠΊ Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ²,

  • ΠœΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΠΎΠ½,

  • Π“Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ„ΠΎΡ€ΠΌ ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π΅ΠΉ.


πŸ”Έ remove() ΠΈ empty()

ΠœΠ΅Ρ‚ΠΎΠ΄ Π§Ρ‚ΠΎΠ΄Π΅Π»Π°Π΅Ρ‚
remove() УдаляСт элСмСнт ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ· DOM
empty() УдаляСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ содСрТимоС

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

$('#block').remove(); // ΡƒΠ΄Π°Π»ΠΈΡ‚ сам <div id="block">
$('#block').empty();  // очистит, Π½ΠΎ оставит <div>

πŸ”Έ ΠŸΡ€ΠΈΠΌΠ΅Ρ€: динамичСский список Π·Π°Π΄Π°Ρ‡

<ul id="tasks"></ul>
<input type="text" id="taskInput">
<button id="addTask">Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ</button>

<script>
  $('#addTask').click(function() {
    let text = $('#taskInput').val();
    if (text !== '') {
      $('#tasks').append('<li>' + text + '</li>');
      $('#taskInput').val('');
    }
  });
</script>

πŸ“Œ Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠ΄:

  • ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ тСкст ΠΈΠ· поля Π²Π²ΠΎΠ΄Π°,

  • Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ элСмСнт <li> ΠΈ добавляСт Π΅Π³ΠΎ Π² список,

  • ΠžΡ‡ΠΈΡ‰Π°Π΅Ρ‚ ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄Π°.


πŸ”Έ ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠΈ

<div class="card">
  <p>Π’ΠΎΠ²Π°Ρ€</p>
</div>

<button id="cloneCard">Π‘ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ</button>

<script>
  $('#cloneCard').click(function() {
    let card = $('.card').first().clone();
    $('body').append(card);
  });
</script>

πŸ”Έ ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°: ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнта ΠΏΠΎ ΠΊΠ»ΠΈΠΊΡƒ

<ul id="items">
  <li>ΠŸΡƒΠ½ΠΊΡ‚ 1 <button class="del">Π£Π΄Π°Π»ΠΈΡ‚ΡŒ</button></li>
  <li>ΠŸΡƒΠ½ΠΊΡ‚ 2 <button class="del">Π£Π΄Π°Π»ΠΈΡ‚ΡŒ</button></li>
</ul>

<script>
  $('#items').on('click', '.del', function() {
    $(this).parent().remove();
  });
</script>

πŸ“Œ ΠžΠ±Ρ€Π°Ρ‚ΠΈ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: здСсь ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ события Ρ‡Π΅Ρ€Π΅Π· .on().


πŸ”Έ Π Π°Π±ΠΎΡ‚Π° с шаблонами

МоТно Π·Π°Ρ€Π°Π½Π΅Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ шаблон элСмСнта ΠΈ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈ нСобходимости:

<template id="itemTemplate">
  <li>Π¨Π°Π±Π»ΠΎΠ½ <button class="del">Π£Π΄Π°Π»ΠΈΡ‚ΡŒ</button></li>
</template>

<button id="add">Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ</button>

<script>
  $('#add').click(function() {
    let template = $('#itemTemplate').html();
    $('#items').append(template);
  });
</script>

πŸ”Έ Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ ΠΈ best practices

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ clone(true) Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ нСобходимости ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ.

  • Для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π±Π»ΠΎΠΊΠΎΠ² — ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ template ΠΈΠ»ΠΈ innerHTML, Π° Π½Π΅ append() ΠΏΠΎ кускам.

  • ВсСгда провСряй содСрТимоС ΠΏΠ΅Ρ€Π΅Π΄ вставкой Π² DOM — это ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ XSS ΠΈ ошибок.

  • НС Π·Π°Π±Ρ‹Π²Π°ΠΉ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ лишниС элСмСнты, Ссли ΠΎΠ½ΠΈ большС Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ — это экономит ΠΏΠ°ΠΌΡΡ‚ΡŒ.


❗ ЧастыС ошибки

❌ Π—Π°Π±Ρ‹Π» Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΊ скопированному элСмСнту

βœ… Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ clone(true) ΠΈΠ»ΠΈ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅:

$('#container').on('click', '.btn', function() {
  alert('Π½Π°ΠΆΠ°Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ°');
});

❌ Π‘Π»ΡƒΡ‡Π°ΠΉΠ½ΠΎΠ΅ пСрСзаписываниС содСрТимого

βœ… Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ append() вмСсто html():

$('#list').append('<li>НовоС</li>'); // Π΄ΠΎΠ±Π°Π²ΠΈΡ‚
$('#list').html('<li>НовоС</li>');   // Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ всё

❌ ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ remove() Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… элСмСнтах, Π½Π΅ провСряя ΠΈΡ… Π½Π°Π»ΠΈΡ‡ΠΈΠ΅

βœ… ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠΉ length, Ссли Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½:

if ($('.popup').length) {
  $('.popup').remove();
}

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

  1. Π‘Π΄Π΅Π»Π°ΠΉ ΠΊΠ½ΠΎΠΏΠΊΡƒ, которая добавляСт Π² список случайноС число.

  2. ΠšΠ»ΠΎΠ½ΠΈΡ€ΡƒΠΉ послСдний Π±Π»ΠΎΠΊ .card ΠΈ вставляй Π΅Π³ΠΎ Π² ΠΊΠΎΠ½Π΅Ρ†.

  3. Π‘Π΄Π΅Π»Π°ΠΉ список Π·Π°Π΄Π°Ρ‡, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ.

  4. Добавляй Π±Π»ΠΎΠΊΠΈ с тСкстом ΠΈΠ· поля Π²Π²ΠΎΠ΄Π°, ΠΏΡ€ΠΈ этом ΠΎΡ‡ΠΈΡ‰Π°ΠΉ ΠΏΠΎΠ»Π΅ послС добавлСния.


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

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ добавлСния, клонирования ΠΈ удалСния — это Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚ для создания ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… интСрфСйсов. Π‘ Π½ΠΈΠΌΠΈ Ρ‚Ρ‹ моТСшь ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ динамичСскиС списки, Ρ„ΠΎΡ€ΠΌΡ‹, ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠΈ, Π±Π»ΠΎΠΊΠΈ — ΠΈ всё это Π±Π΅Π· ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ страницы.

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