MakeFirstStep· Frontend + зеҳни сунъӣ

Дарси 8 · DOM

DOM: ҷустуҷӯ ва тағйири унсурҳо

То ҳол JavaScript дар консол зиндагӣ мекард: мо ҳисоб мекардем, филтр мекардем ва матн мебароридем. Имрӯз вай ба саҳифа мебарояд. Феҳристи молҳо, сабад, рӯйхати вазифаҳо, баҳоҳо дар кабинети шахсӣ — ҳамаи инро дар сайтҳои воқеӣ JavaScript мекашад, ки ҷойи лозимиро дар саҳифа меёбад ва онро тағйир медиҳад. Имрӯз шумо саҳифаеро месозед, ки тамоми мундариҷааш аз массив эҷод мешавад.

  • Шарҳ додан, ки DOM чист ва аз файли HTML чӣ фарқ дорад
  • Унсурҳоро тавассути querySelector ва querySelectorAll ёфтан
  • Матн, ҳамбандӣ (разметка), классҳо, атрибутҳо ва data-*-ро тағйир додан
  • Унсурҳоро тавассути createElement эҷод кардан, ҷойгир кардан ва нест кардан
  • Рӯйхати кортҳоро аз массиви объектҳо кашидан ва тоза кардан
  • Кори худро бо ЗС тақсим кардан: ӯ ҳамбандӣ ва услубҳоро менависад, шумо — мантиқро
Бо ин саҳифа чӣ тавр кор кардан лозим

Дар ин дарс қуттиҳои реги (песочница) бисёранд. Дар ҳар кадом се ҷадвалча: index.html (ҳамбандӣ), style.css (услубҳо, агар бошанд) ва script.js (коди шумо). ▶ Иҷро ё Ctrl + Enter-ро пахш кунед — дар поён саҳифаи зинда пайдо мешавад, ва дар зери он — консол. Вазифаҳо аз рӯи он санҷида мешаванд, ки шумо тавассути console.log чиро баровардед, бинобар ин сатрҳои баромадро дар ҷояшон гузоред. Ишораҳо пинҳонанд: аввал худатон кӯшиш кунед.

Як қоидаи қуттии реги: ҳамбандии шумо дар <body> танҳо нест — пас аз он браузер <script>-ҳои хидматиро илова мекунад. Бинобар ин мо мундариҷаро ҳамеша ба як печонак мегузорем ё унсурҳоро бо селектор меҷӯем, на ин ки кӯдакони body-ро ҳисоб кунем.

01 DOM чист

Шумо HTML менависед — ин матни оддӣ дар файл аст. Вақте браузер саҳифаро мекушояд, ин матнро мехонад ва аз он дарахти объектҳо-ро месозад. Ин дарахт DOM — Document Object Model, «модели объектии ҳуҷҷат» ном дорад. Ҳар тег ба объект табдил меёбад, ки хосиятҳо (матн, классҳо, андозаҳо) ва методҳо дорад. Маҳз бо ҳамин объектҳо JavaScript кор мекунад.

Монандӣ аз ҳаёт

Файли HTML — менюи чопшуда дар ҷузвдон аст. DOM — дастурхони густурда дар чойхона аст, ки аз рӯи ин меню сохта мешавад. Пешхизмат (JavaScript) метавонад ба дастурхон боз як самбуса гузорад, косаи холиро бардорад ё чойро иваз кунад. Менюи чопшуда дар ҷузвдон аз ин тағйир намеёбад. Саҳифаро навсозӣ кардед — дастурхон аз нав аз рӯи меню густурда мешавад.

Инак саҳифаи оддӣ ва дарахте, ки аз он ҳосил мешавад:

Файли HTML
<body>
  <h1>Меню</h1>
  <ul class="menu">
    <li>Самбуса</li>
    <li>Курутоб</li>
  </ul>
</body>
  • document
    • body
      • h1
        • «Меню»гиреҳи матнӣ
      • ul.menu
        • li → «Самбуса»
        • li → «Курутоб»
Тег дар дохили тег — ин «кӯдак» дар дохили «волидайн» аст. Матн низ гиреҳи дарахт аст.
document
Решаи тамоми дарахт ва «дари даромад» ба саҳифа. Тавассути он шумо унсурҳоро меҷӯед: document.querySelector(...).
Унсур
Объекти мувофиқ ба тег: <h1>, <li>, <div>. Маҳз онҳоро мо меҷӯем, тағйир медиҳем, эҷод мекунем ва нест мекунем.
Волидайн ва кӯдакон
<ul> — волидайни ду <li>. Ду <li> — ҳамсоя (siblings).
Гиреҳи матнӣ
Порчаи матн дар дохили унсур. Фосилаҳо ва гузаришҳои сатр байни тегҳо — низ гиреҳҳои матнианд.

DOM-ро бо чашми худ чӣ тавр дидан

Ягон сайтро кушоед, F12-ро пахш кунед ва ба ҷадвалчаи Elements гузаред. Ин маҳз DOM-и зинда аст: шумо дарахтро мебинед, ба унсурҳо клик карда метавонед, матнро бо ду клик тағйир диҳед, тегҳоро кашед — ва саҳифа фавран вокуниш нишон медиҳад. Худи файл ҳангоми ин тағйир намеёбад. Унсури дар Elements интихобшуда дар консол чун $0 дастрас аст.

Дар дарахт мегардем

Ҳар унсур «тирҳо» ба гиреҳҳои ҳамсоя дорад. Онҳо вақте ба кор меоянд, ки як унсур ёфт шуд ва ба ҳамсояҳо расидан лозим аст:

ХосиятЧӣ медиҳад
el.parentElementволидайн
el.childrenҳамаи кӯдакони-унсурҳо (рӯйхат, он .length дорад)
el.firstElementChild / el.lastElementChildкӯдаки аввал ва охирин
el.nextElementSibling / el.previousElementSiblingҳамсояи навбатӣ ва пешина
Дар дарахт мегардем · Ctrl + Enter
<ul class="menu">
  <li>Самбуса</li>
  <li>Курутоб</li>
  <li>Шакароб</li>
</ul>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.

textContent — матни дохили унсур. Муфассалтар дар бораи он — дар бахши сеюм, ҳоло танҳо истифода баред.

Хатои маъмул: childNodes ба ҷойи children

Хосияти монанди childNodes ҳаст. Он ҳамаи гиреҳҳоро, аз ҷумла фосилаҳо ва гузаришҳои сатр байни тегҳоро бармегардонад. Бинобар ин «кӯдакон» аз он ки бо чашм мебинед, бештар мебароянд. Барои кор бо унсурҳо children ва оилаи ...ElementChild, ...ElementSibling-ро истифода баред.

childNodes фосилаҳоро низ ҳисоб мекунад · Ctrl + Enter
const box = document.createElement("div");
box.innerHTML = `
  <p>Один</p>
  <p>Два</p>
`;

console.log(box.children.length);    // → 2 — ду банд
console.log(box.childNodes.length);  // → 5 — ду банд ва се гиреҳи матнии «холӣ»

Муфассалтар хонед: learn.javascript.ru — Дарахти DOM · Ҳаракат дар унсурҳои DOM

Амалия: мустаҳкам мекунем

Се вазифа оид ба гардиш дар дарахт. Натиҷа аз рӯи баромад дар консол дар зери қуттии реги санҷида мешавад.

ВАЗИФАИ 1.1

Рӯйхат чанд кӯдак дорад

осон

Дар қуттии реги — рӯйхати таомҳо. Ба консол се сатр баровед: рӯйхат чанд кӯдак дорад, матни таоми аввал ва матни охирин.

Рӯйхати таомҳо · Ctrl + Enter
<ul>
  <li>Нон</li>
  <li>Сомса</li>
  <li>Чой</li>
  <li>Мева</li>
</ul>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
4
Нон
Мева
Ишора 1

Шумораи кӯдакон — list.children.length.

Ишора 2

Кӯдаки аввал — list.firstElementChild, охирин — list.lastElementChild. Матнро тавассути .textContent мегирем. Ҳар қимат — console.log-и алоҳида.

ВАЗИФАИ 1.2

Баромадро пешбинӣ кунед

осон

Аввал бе иҷрои код, дар дафтар нависед, ки панҷ сатр чиро мебарорад. Баъд иҷро кунед ва муқоиса намоед. Пас аз ин сатри шашумро илова кунед: матни банди «Преподаватель…»-ро баровед, аммо аз охир ҳаракат карда — тавассути group.lastElementChild.previousElementSibling.

Гурӯҳи JS-12 · Ctrl + Enter
<div class="group">
  <h2>Группа JS-12</h2>
  <p>Преподаватель: Шахром</p>
  <p>Студентов: 12</p>
</div>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
H2
Преподаватель: Шахром
Студентов: 12
DIV
3
Преподаватель: Шахром
Ишора 1

Кӯдаки охирини гурӯҳ — банди «Студентов: 12». Ба мо банди пеш аз он лозим аст.

Ишора 2

console.log(group.lastElementChild.previousElementSibling.textContent);

ВАЗИФАИ 1.3

Гиреҳҳои изофӣ

миёна

Ба консол баровед: рӯйхат чанд childNodes дорад, чанд children, ва баъд матни ҳар шаҳр — ҳар кадом дар сатри худ (for...of-ро бар list.children истифода баред). Фикр кунед, ки фарқ дар ду адади аввал аз куҷо пайдо шуд.

Шаҳрҳо · Ctrl + Enter
<ul>
  <li>Душанбе</li>
  <li>Худжанд</li>
  <li>Бохтар</li>
</ul>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
7
3
Душанбе
Худжанд
Бохтар
Ишора 1

Байни тегҳо дар ҳамбандӣ гузаришҳои сатр ва ақибравӣ ҳастанд. Ҳар чунин порча — гиреҳи матнии алоҳида: се то пеш аз <li> ва як то пас аз охирин. Ҳамагӣ 3 унсур + 4 гиреҳи матнӣ = 7.

Ишора 2

for (const li of list.children) { console.log(li.textContent); }

02 Ҷустуҷӯи унсурҳо: querySelector

Барои чизеро дар саҳифа тағйир додан, аввал бояд ин «чиз»-ро ёфт. Барои ҷустуҷӯ дар JavaScript-и муосир қариб ҳамеша ду метод кофист. Асосӣ: дар онҳо шумо селектори оддии CSS-ро менависед — ҳамон, ки дар файли услубҳо ҳаст. Забони нав омӯхтан лозим нест.

document.querySelector(селектор)
Аввалин унсури мувофиқро бармегардонад. Агар чизе ёфт нашавад — null.
document.querySelectorAll(селектор)
Рӯйхати ҳамаи унсурҳои мувофиқро (NodeList) бармегардонад. Агар чизе набошад — рӯйхати холӣ, на null.
Бо селекторҳо меҷӯем · Ctrl + Enter
<h1 id="title">Чайхона «Сомон»</h1>
<ul class="menu">
  <li class="item">Курутоб</li>
  <li class="item">Оши палав</li>
  <li class="item hot">Шакароб</li>
</ul>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Монандӣ аз ҳаёт

Шумо дар Бозори Сабз истодаед ва мегӯед: «Барои ман аввалин чодари зардолуи хушкро ёбед» — ин querySelector аст. Ва «Ба ман ҳамаи чодарҳои зардолуи хушкро нишон диҳед» — ин querySelectorAll аст. Селектор — ин тавсифи шумо аз чодар аст: аз рӯи рақам (#id), аз рӯи лавҳа (.class) ё аз рӯи навъ (li).

Кадом селекторҳоро навиштан мумкин аст

СелекторЧиро меёбад
"#title"унсур бо id="title"
".item"унсурҳо бо классии item
"li"ҳамаи тегҳои <li>
".menu li"<li> дар дохили .menu (дар ҳар чуқурӣ)
".menu > li"<li> — кӯдакони мустақими .menu
"li:first-child", "li:nth-child(2)"якум ва дуюм аз рӯи шумора
"[data-id='17']"аз рӯи атрибут
"input[type='text']"тег ва атрибут якҷоя
Маслиҳат

Агар боварӣ надоред, ки селектор дуруст аст, онро дар DevTools санҷед: дар ҷадвалчаи Elements Ctrl + F-ро пахш кунед ва селекторро гузоред. Браузер ёфтшударо равшан мекунад ва нишон медиҳад, ки чанд мувофиқат ҳаст.

NodeList: ба массив монанд аст, аммо массив нест

querySelectorAll NodeList бармегардонад. Он .length дорад, ба унсурҳо бо индекс муроҷиат кардан мумкин аст, онро тавассути for...of ва forEach гузаштан мумкин аст. Аммо методҳои map, filter ва reduce надорад. Агар лозим бошанд — ба массиви воқеӣ табдил медиҳем:

Таҳрир кардан мумкин аст · Ctrl + Enter
const box = document.createElement("div");
box.innerHTML = `<p class="n">10</p><p class="n">20</p><p class="n">30</p>`;

const nodes = box.querySelectorAll(".n");

console.log(nodes.length);         // → 3
console.log(nodes[1].textContent); // → 20

nodes.forEach(p => console.log("p:", p.textContent));   // forEach ҳаст

const numbers = Array.from(nodes).map(p => Number(p.textContent)); // map — танҳо дар массив
// ҳамон чиз: [...nodes].map(...)
console.log(numbers);              // → [10, 20, 30]

На дар тамоми саҳифа, балки дар дохили унсур меҷӯем

Методи querySelector на танҳо дар document, балки дар ҳар унсур ҳам ҳаст. Он гоҳ ҷустуҷӯ танҳо дар дохили он мегузарад. Ин вақте муҳим аст, ки дар саҳифа кортҳои якхелаи бисёр ҳастанд ва нархро маҳз аз ҳамин корт гирифтан лозим аст:

Ҷустуҷӯ дар дохили корт · Ctrl + Enter
<div class="card"><span class="name">Шапка</span> — <span class="price">60</span></div>
<div class="card"><span class="name">Шарф</span> — <span class="price">45</span></div>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.

Методҳои кӯҳна низ ҳастанд: getElementById("title"), getElementsByClassName, getElementsByTagName. Онҳо кор мекунанд, ва шумо онҳоро дар коди бегона вомехӯред, аммо querySelector универсалтар аст — як усулро дар хотир доштан кифоя аст.

Хатои маъмул: унсур ёфт нашуд (null)

Агар querySelector чизеро наёфта бошад, null бармегардонад. Ва null на textContent дорад, на хосиятҳои дигар — машҳуртарин хатои DOM-ро мегирем. Сабабҳо одатан се ҳастанд: хатои имлоӣ дар селектор, нуқта ё решёткаи фаромӯшшуда ("item" ба ҷойи ".item"), ё скрипт пештар аз пайдо шудани унсур дар саҳифа оғоз шуд.

Ин код хато медиҳад · Ctrl + Enter
const price = document.querySelector(".price"); // дар саҳифа чунин унсур нест → null
console.log(price);                              // → null
console.log(price.textContent);                  // ✖ TypeError: Cannot read properties of null

Дар бораи сабаби сеюм: дар лоиҳаи воқеӣ скриптро бо атрибути defer пайваст кунед — он гоҳ он пас аз он иҷро мешавад, ки браузер тамоми дарахтро сохт. Дар қуттиҳои реги дарс ин аллакай барои шумо анҷом дода шудааст.

index.html — чӣ тавр скриптро дар лоиҳаи воқеӣ пайваст кардан
<body>
  <ul id="list"></ul>
  <script src="script.js" defer></script>
</body>
Одат барои тамоми умр

Унсурҳои ёфтшударо ба тағйирёбандаҳо як бор дар оғози скрипт гузоред: const list = document.querySelector("#list");. Як унсури якхеларо даҳ бор наҷӯед — код кӯтоҳтар мешавад, ва браузер зудтар.

Муфассалтар хонед: learn.javascript.ru — Ҷустуҷӯ: getElement*, querySelector* · MDN — querySelector

Амалия: мустаҳкам мекунем

Унсурҳоро бо усулҳои гуногун меёбем.

ВАЗИФАИ 2.1

Бо id ва класс ёбед

осон

Ба консол се сатр баровед: матни сарлавҳа (онро аз рӯи id ёбед), матни таоми аввал бо классии item ва шумораи ҳамаи таомҳо бо ин класс.

Менюи чойхона · Ctrl + Enter
<h1 id="title">Чайхона «Сомон»</h1>
<ul class="menu">
  <li class="item">Курутоб</li>
  <li class="item">Оши палав</li>
  <li class="item hot">Шакароб</li>
</ul>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
Чайхона «Сомон»
Курутоб
3
Ишора 1

Сарлавҳа: document.querySelector("#title"). Решётка — барои id, нуқта — барои класс.

Ишора 2

.item-и аввал — querySelector(".item"), ҳама — querySelectorAll(".item") ва баъд .length.

ВАЗИФАИ 2.2

Се хатогиро дар селекторҳо ёбед

миёна

Код мехоҳад сарлавҳа, шумораи молҳо ва матни моли бо тахфифро барорад, аммо ҳеҷ чиз кор намекунад. Онро иҷро кунед, хаторо дар консол хонед ва се ҷойеро, ки бо рақамҳо қайд шудаанд, ислоҳ кунед. Яктоӣ ислоҳ кунед ва ҳар дафъа иҷро кунед — хатогиҳо навбат ба навбат кушода мешаванд.

Сабад (бо хатогиҳо) · Ctrl + Enter
<h1 id="title">Корзина</h1>
<ul id="cart">
  <li class="item">Нон — 4</li>
  <li class="item">Молоко — 12</li>
  <li class="item sale">Зардолу — 25</li>
</ul>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
Корзина
3
Зардолу — 25
Ишора 1

Хатои 1: сарлавҳа на класс, балки id дорад — яъне решётка лозим аст. Хатои 3 — баръакс: sale — класс аст, на id.

Ишора 2

Хатои 2: querySelector як унсурро бармегардонад, ва он .length надорад. Барои ҳисоб кардани ҳамаи молҳо querySelectorAll лозим аст.

ВАЗИФАИ 2.3

Нархҳо аз кортҳо

душвор

Дар феҳрист чор корт ҳаст. Онҳоро гузаред, аз ҳар кадом нарх ва номро гиред (ҷустуҷӯ дар дохили корт), ҷамъи умумиро ҳисоб кунед ва гаронтаринро ёбед. Нарх дар textContent — сатр аст, онро тавассути Number(...) ба адад табдил диҳед.

Феҳрист · Ctrl + Enter
<div class="card"><span class="name">Шапка</span> <span class="price">60</span></div>
<div class="card"><span class="name">Шарф</span> <span class="price">45</span></div>
<div class="card"><span class="name">Перчатки</span> <span class="price">35</span></div>
<div class="card"><span class="name">Носки</span> <span class="price">15</span></div>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
Итого: 155 сомони
Самый дорогой: Шапка
Ишора 1

Давра for (const card of cards) { ... }. Дар дохил: const price = Number(card.querySelector(".price").textContent); ва сатри ҳамон гуна барои ном.

Ишора 2

Ҷамъ: total += price. Агар price > maxPrice бошад, нархи навро ба maxPrice ва номро ба maxName нависед.

03 Мундариҷаро тағйир медиҳем: textContent ва innerHTML

Унсур ёфт шуд. Акнун он чиро, ки дар дохили он аст, хондан ва иваз кардан мумкин аст. Барои ин ҳар унсур ду хосияти асосӣ дорад. Онҳо монанданд, аммо корҳои гуногун мекунанд — ва фарқ на танҳо барои зебоӣ, балки барои бехатарӣ низ муҳим аст.

textContent — танҳо матн

Матни оддӣ-ро мехонад ва менависад. Ҳар гуна < ва > оддӣ аломат ҳисоб мешаванд, тегҳо эҷод намешаванд. Зуд ва бехатар.

innerHTML — матн ва ҳамбандӣ

Сатри HTML-ро мехонад ва менависад. Тегҳои дохилӣ ба унсурҳои воқеӣ табдил меёбанд. Қудратманд, аммо хатарнок аст, агар дар сатр матни бегона бошад.

textContent ва innerHTML · Ctrl + Enter
<h2 id="dish">Загрузка…</h2>
<div id="box">Старое содержимое</div>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Монандӣ аз ҳаёт

Тасаввур кунед, ки шумо торт бо навишта фармоиш медиҳед. textContent — вақте ки қаннод дар торт маҳз он чиро, ки шумо гуфтед менависад, ҳатто агар аломатҳои аҷибро гуфта бошед. innerHTML — вақте ки шумо ба қаннод дастур медиҳед: «дар ин ҷо ороиш гузор, ва дар ин ҷо навиштаи ғафс кун». Вай дастурро айнан иҷро мекунад. Агар дастурро шахси бегона навишта бошад — вай метавонад қанноддро водор кунад, ки ҳар чизро кунад.

Мехонем ва менависем

  • el.textContent — тамоми матни дохили унсурро хондан (аз ҷумла тегҳои дарунравӣ, аммо бе худи тегҳо).
  • el.textContent = "матни нав" — тамоми мундариҷаро бо як матн иваз кардан.
  • el.innerHTML — мундариҷаро якҷоя бо тегҳо чун сатр хондан.
  • el.innerHTML = "<b>ғафс</b>" — мундариҷаро иваз кардан, сатрро чун HTML таҳлил карда.

Боз innerText ҳаст: вай CSS-ро ба назар мегирад ва матни пинҳонро нишон намедиҳад. Барои кори оддӣ textContent-ро гиред — вай соддатар ва пешбинишавандатар аст.

Чаро innerHTML хатарнок аст

Фарз мекунем, дар сайти шумо корбар шарҳ менависад, ва шумо онро тавассути innerHTML ба саҳифа ҷойгир мекунед. Агар ба ҷойи «Курси аъло!» ӯ теги махсус омодакардаи <img>-ро бо коди пинҳонӣ нависад — браузер ин унсурро эҷод мекунад ва коди бегонаро дар саҳифаҳои дигар боздидкунандагон иҷро мекунад. Чунин ҳамла XSS номида мешавад ва аз маъмултарин ҳамлаҳо дар веб мебошад.

Қоидаи бехатарӣ

Ҳар чизе, ки аз корбар, аз шакл, аз сатри суроға ё аз API-и берунӣ омад, тавассути textContent ҷойгир кунед. innerHTML — танҳо барои ҳамбандие, ки худатон навиштаед (ё ЗС, ва шумо онро санҷидед). Бинед, фарқ чӣ гуна менамояд:

Таҳрир кардан мумкин аст · Ctrl + Enter
const comment = "Круто! <b>Пять звёзд</b>";      // тасаввур мекунем, ки инро корбар ворид кард

const safe = document.createElement("div");
safe.textContent = comment;          // матн матн монд
console.log(safe.children.length);   // → 0 — ягон теги нав пайдо нашуд

const risky = document.createElement("div");
risky.innerHTML = comment;           // сатр чун HTML таҳлил шуд
console.log(risky.children.length);  // → 1 — теги воқеии <b> пайдо шуд

Қапқон: += барои innerHTML

Навишти list.innerHTML += "<li>…</li>" чун «ба охир илова кардан» менамояд, аммо дар асл браузер тамоми рӯйхатро хароб мекунад ва аз нав ҷамъ мекунад. Ҳамаи унсурҳои қаблан ёфтшуда дар тағйирёбандаҳои шумо пайванд бо саҳифаро гум мекунанд.

Ҳангоми += барои innerHTML чӣ рӯй медиҳад · Ctrl + Enter
const list = document.createElement("ul");
list.innerHTML = "<li>Нон</li>";

const first = list.firstElementChild;     // банди аввалро дар хотир гирифтем
list.innerHTML += "<li>Чой</li>";         // «илова кардем» дуюмро

console.log(list.children.length);             // → 2
console.log(first === list.firstElementChild); // → false — ин аллакай унсури дигар, нав аст!
console.log(list.contains(first));             // → false — банди кӯҳна партофта шуд

Дар бахши 5 шумо мефаҳмед, ки унсурҳоро бе чунин таъсири иловагӣ чӣ тавр илова кардан мумкин — тавассути createElement ва append.

Рӯйхатро бо сатр ҷамъ мекунем

Агар ҳамбандиро худатон менависед, ва додаҳо бехатаранд (массиви шумо, на воридоти корбар), қулай аст, ки HTML-ро бо сатрҳои қолабӣ ва методҳои массив, ки шумо аллакай медонед, ҷамъ кунед:

Таҳрир кардан мумкин аст · Ctrl + Enter
const dishes = ["Самбуса", "Курутоб", "Шакароб"];

const html = dishes.map(d => `<li>${d}</li>`).join("");
console.log(html);   // → <li>Самбуса</li><li>Курутоб</li><li>Шакароб</li>

const menu = document.createElement("ul");
menu.innerHTML = html;
console.log(menu.children.length); // → 3

Муфассалтар хонед: learn.javascript.ru — Хосиятҳои гиреҳҳои DOM · MDN — textContent

Амалия: мустаҳкам мекунем

Мундариҷаро мехонем ва менависем.

ВАЗИФАИ 3.1

Сарлавҳа ва нарх

осон

Саҳифа ҷойхолиҳои «Загрузка…»-ро нишон медиҳад. Матни сарлавҳаро ба Курутоб, ва матни нархро ба 35 сомони тавассути textContent иваз кунед. Пас аз ивазкунӣ ҳарду матнро ба консол баровед.

Корти таом · Ctrl + Enter
<h1 id="title">Загрузка…</h1>
<p class="price">0 сомони</p>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
Курутоб
35 сомони
Ишора 1

Навиштан ба хосият — таъини оддӣ аст: title.textContent = "...";

Ишора 2

Ду сатр байни ҷустуҷӯ ва console.log: title.textContent = "Курутоб"; ва price.textContent = "35 сомони";

ВАЗИФАИ 3.2

Баровардани бехатари ном

миёна

Сатри userName — ин «воридоти корбар» аст. Онро ба блоки #a тавассути innerHTML, ва ба блоки #b — тавассути textContent гузоред. Ба preview нигоҳ кунед: дар кадом блок тегҳо намоёнанд? Консол фарқро тасдиқ мекунад.

Ду ҷойгиркунӣ · Ctrl + Enter
<div id="a"></div>
<div id="b"></div>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
1
0
Ali <b>Pro</b>
Ишора 1

Ҳар блок — як сатри таъин: a.innerHTML = userName;

Ишора 2

Блоки дуюм — айнан ҳамин тавр, аммо хосияти textContent. Дар #a теги воқеии <b> пайдо мешавад (1 кӯдак), дар #b — оддӣ матн бо қавсайни кунҷии намоён (0 кӯдак).

ВАЗИФАИ 3.3

Меню тавассути map ва join

миёна

Сатри HTML-ро аз массиви dishes ҷамъ кунед: ҳар таом — <li>. map ва join("")-ро истифода баред. Сатрро ба #menu тавассути innerHTML нависед ва ба консол шумораи кӯдакон ва худи ҳамбандиро баровед.

Меню аз массив · Ctrl + Enter
<ul id="menu"></ul>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
3
<li>Самбуса</li><li>Курутоб</li><li>Шакароб</li>
Ишора 1

map ҳар таомро ба сатр бо тегҳо табдил медиҳад, join("") онҳоро бе фосила мечаспонад. Қолаб: `<li>${d}</li>`.

Ишора 2

menu.innerHTML = dishes.map(d => `<li>${d}</li>`).join("");

04 Классҳо, услубҳо ва атрибутҳо

Намуди зоҳирии унсур қариб ҳамеша дар CSS муайян мешавад. JavaScript набояд саҳифаро худаш ранг кунад, кори он — ба кор андохтан ва хомӯш кардани классҳои тайёр аст. Шумо дар CSS менависед, ки .hot чӣ гуна менамояд, ва дар JS танҳо қарор медиҳед, ки кай онро ба унсур диҳед. Ҳамин тавр код тоза мемонад, ва тарроҳӣ дар як ҷой тағйир меёбад.

Монандӣ аз ҳаёт

Класс — ин нишони шахсӣ дар курс аст: бейҷи «омӯзгор», «донишҷӯ», «меҳмон». Бейҷро як бор ихтироъ карданд, тарроҳиро тасдиқ карданд. Посбон (JS) ба ҳар кас бейҷи нав намекашад, балки танҳо тайёрро медиҳад ё мегирад. Додан — add, гирифтан — remove, ба муқобил иваз кардан — toggle.

classList: классҳоро идора мекунем

МетодЧӣ мекунад
el.classList.add("hot")классро илова мекунад (агар аллакай бошад — чизе рӯй намедиҳад)
el.classList.remove("old")классро мебарорад
el.classList.toggle("open")бошад — мебарорад, набошад — илова мекунад
el.classList.contains("hot")true ё false бармегардонад
el.classList.replace("old", "new")як классро бо дигаре иваз мекунад
«Гарм»-ро равшан мекунем · Ctrl + Enter
<ul class="menu">
  <li class="item">Самбуса</li>
  <li class="item">Курутоб</li>
  <li class="item">Шакароб</li>
</ul>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Хатои маъмул: className = "…" ҳамаи классҳоро пок мекунад

Хосияти className тамоми сатри классҳоро нигоҳ медорад. Агар ба он қимати нав нависед, ҳамаи классҳои пешина нест мешаванд. Барои илова ва нест кардан classList-ро истифода баред.

Таҳрир кардан мумкин аст · Ctrl + Enter
const el = document.createElement("div");
el.className = "card sale";

el.className = "hot";                 // «card» ва «sale»-ро пок кардем!
console.log(el.className);            // → hot

el.className = "card sale";
el.classList.add("hot");              // дуруст: ба мавҷудҳо илова кардем
console.log(el.className);            // → card sale hot

style: усули зуд, аммо дағал

Тавассути el.style.хосият услубро мустақиман барои унсур додан мумкин аст. Номҳои хосиятҳо бо camelCase навишта мешаванд: background-color ба backgroundColor табдил меёбад, ва қиматҳо — ҳамеша сатрҳо:

el.style · Ctrl + Enter
<p id="note">Скидка до конца недели</p>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.

Қоида: агар услуб муддати дароз ё барои якчанд унсур лозим бошад — класс эҷод кунед. style-ро барои қиматҳое монед, ки дар код ҳисоб карда мешаванд (бари навори боркунӣ, мавқеъ). Ҳамин тавр JS бо тарроҳӣ омехта намешавад, ва ёрдамчии ЗС ба шумо осонтар кумак мекунад.

Атрибутҳо: getAttribute, setAttribute ва хосиятҳо

Атрибутҳо — он чизе ҳастанд, ки дар теги кушоянда навишта мешавад: href, src, alt, disabled, data-id. Онҳоро бо ду усул хондан ва тағйир додан мумкин аст:

УсулМисолКай истифода бурдан
Методҳоel.getAttribute("href"), el.setAttribute("href", "…"), el.removeAttribute("disabled"), el.hasAttribute("disabled")универсалӣ, барои ҳама атрибутҳо мувофиқ аст, аз ҷумла data-*
Хосиятҳоinput.value, button.disabled = true, el.hidden = true, img.src, a.hrefбарои атрибутҳои стандартӣ — кӯтоҳтар ва қулайтар

data-атрибутҳо: додаҳои худӣ дар ҳамбандӣ

Мехоҳед ба унсур додаҳои худро «пайваст» кунед — масалан, id-и мол ё нархи онро? Барои ин атрибутҳое ихтироъ шудаанд, ки бо data- оғоз мешаванд. Дар JS онҳо тавассути el.dataset дастраванд, ва ном пас аз data- ба хосият табдил меёбад:

dataset · Ctrl + Enter
<button id="buy" data-id="17" data-price="35" data-product-name="Курутоб">Купить</button>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Қапқон: ҳама чиз дар dataset — сатр аст

dataset.price "35"-ро бармегардонад, на 35-ро. Чунин қиматҳоро ҷамъ кардан хатарнок аст: "35" + "5" "355" медиҳад. Пеш аз ҳисобҳо ҳамеша тавассути Number(...) ба адад табдил диҳед.

Муфассалтар хонед: learn.javascript.ru — Услубҳо ва классҳо · Атрибутҳо ва хосиятҳо · MDN — classList

Амалия: мустаҳкам мекунем

Классҳо, услубҳо ва атрибутҳо дар амал.

ВАЗИФАИ 4.1

Бейҷҳо дар меню

осон

Ба таоми «Курутоб» класси hot-ро илова кунед, ва аз «Шакароб» класси old-ро бардоред. Баъд className-и ҳар бандро баровед — яктоӣ дар як сатр.

Меню бо бейҷҳо · Ctrl + Enter
<ul class="menu">
  <li class="item">Самбуса</li>
  <li class="item">Курутоб</li>
  <li class="item old">Шакароб</li>
</ul>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
item
item hot
item
Ишора 1

classList.add("...") ва classList.remove("...")-ро истифода баред, на className =.

Ишора 2

items[1].classList.add("hot"); ва items[2].classList.remove("old");

ВАЗИФАИ 4.2

Панел: toggle ва contains

осон

Панел аз аввал классҳои panel open дорад. Бо тартиб иҷро кунед: 1) баровед, ки класси open ҳаст ё не; 2) open-ро иваз кунед ва боз баровед, ки ҳаст ё не; 3) open-ро баръакс иваз кунед, бо ивазкунӣ класси dark-ро илова кунед ва className-ро баровед.

Панел · Ctrl + Enter
<div id="panel" class="panel open">Меню</div>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
true
false
panel open dark
Ишора 1

Пас аз toggle("open")-и аввал класс нахоҳад буд (false), пас аз дуюм — он ба охири рӯйхати классҳо бармегардад.

Ишора 2

Қадами сеюм: panel.classList.toggle("open"); panel.classList.toggle("dark"); console.log(panel.className); Тартиби классҳо — аз рӯи тартиби иловашавӣ.

ВАЗИФАИ 4.3

Истинод ва тугмаи харид

миёна

Чор амалро иҷро кунед ва натиҷаи ҳар кадомро баровед: 1) href-и истинодро ба https://makefirststep.tj иваз кунед ва онро тавассути getAttribute баровед; 2) нархро аз data-price, ки ба 2 зарб шудааст (ҳамчун адад), баровед; 3) data-id-ро ба 18 тавассути dataset иваз кунед ва қиматро тавассути getAttribute("data-id") баровед; 4) тугмаро ғайрифаъол кунед ва hasAttribute("disabled")-ро баровед.

Истинод ва тугма · Ctrl + Enter
<a id="link" href="https://example.com">Сайт</a>
<button id="buy" data-id="17" data-price="35">Купить</button>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
https://makefirststep.tj
70
18
true
Ишора 1

link.setAttribute("href", "https://makefirststep.tj"); — бо аргументи аввал номи атрибут, бо дуюм қимат.

Ишора 2

Хосияти disabled дар тугма — мантиқӣ аст: buy.disabled = true;. Пас аз ин атрибути disabled дар ҳамбандӣ пайдо мешавад, ва hasAttribute true бармегардонад.

ВАЗИФАИ 4.4

Светофори нархҳо

душвор

Ҳар корт data-price дорад. Кортҳоро гузаред: агар нарх 50 ва зиёдтар бошад — класси expensive-ро илова кунед, агар аз 20 камтар — класси sale-ро, вагарна чизе накунед. className-и ҳар кортро баровед, ва баъд шумораи кортҳоро бо класси expensive (тавассути querySelectorAll).

Светофори нархҳо · Ctrl + Enter
<div class="card" data-price="60">Шапка</div>
<div class="card" data-price="45">Шарф</div>
<div class="card" data-price="35">Перчатки</div>
<div class="card" data-price="15">Носки</div>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
card expensive
card
card
card sale
1
Ишора 1

Дар дохили давра ду if лозим аст: if (price >= 50) card.classList.add("expensive"); ва ҳамон гуна барои price < 20. Number(...)-ро фаромӯш накунед — шумо онро аллакай доред.

Ишора 2

Дар охир: console.log(document.querySelectorAll(".expensive").length);

05 Унсурҳоро эҷод ва нест мекунем

То ҳол мо танҳо он чиро меёфтем ва тағйир медодем, ки дар HTML навишта шудааст. Аммо дар сайти воқеӣ, масалан мағозаи интернетӣ, рӯйхати молҳо аз додаҳо меояд, ва ҳамбандӣ барои он пешакӣ навишта намешавад. Унсурҳоро бояд аз код эҷод кард. Ин се қадам аст:

  1. Эҷод кардем — document.createElement("li"). Унсур «дар анбор» пайдо шуд: он вуҷуд дорад, аммо дар саҳифа ҳоло намоён нест.
  2. Танзим кардем — матн, классҳо, атрибутҳоро додем: li.textContent = "Самбуса", li.classList.add("item").
  3. Ҷойгир кардем — parent.append(li). Танҳо пас аз ин он дар саҳифа пайдо мешавад.
Монандӣ аз ҳаёт

Бозор. Фурӯшанда мол аз халта мебарорад (createElement), нархнома мечаспонад (танзим) ва танҳо баъд ба пештахта мегузорад (append). То даме ки мол дар халта аст, харидорон онро намебинанд. Хатои аз ҳама маъмули навомӯз — ду қадами аввалро иҷро кардан ва дар бораи пештахта фаромӯш кардан.

Эҷод кардем, танзим кардем, ҷойгир кардем · Ctrl + Enter
<h2>Сегодня в меню</h2>
<ul id="menu"></ul>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.

Ба куҷо ҷойгир кардан

МетодУнсур ба куҷо меафтад
parent.append(el)ба охир-и волидайн
parent.prepend(el)ба оғоз-и волидайн
ref.before(el)пеш аз унсури ref, дар як сатҳ бо он
ref.after(el)пас аз унсури ref
el.remove()унсурро аз саҳифа нест мекунад
el.cloneNode(true)нусха эҷод мекунад (бо мундариҷа, агар true бошад)
parent.replaceChildren()ҳамаи кӯдаконро нест мекунад. Бо аргументҳо — кӯдаконро бо додашудаҳо иваз мекунад

append якчанд унсурро якбора гирифта метавонад: card.append(title, price). Агар сатр дода шавад, он чун матн (на чун HTML) ҷойгир мешавад, бинобар ин ин бехатар аст.

Навбат: ҷойгир ва нест мекунем · Ctrl + Enter
<ol id="queue">
  <li>Рустам</li>
  <li class="gone">Мадина</li>
  <li>Фарход</li>
</ol>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.

Унсур нусха намешавад, балки кӯч мебандад

Як унсур наметавонад дар ду ҷойи дарахт бошад. Агар унсури аллакай мавҷударо ба ҷойи дигар ҷойгир кунед, он кӯч мебандад, ва дар ҷойи кӯҳна нопадид мешавад. Нусха лозим аст — cloneNode(true)-ро кунед.

Таҳрир кардан мумкин аст · Ctrl + Enter
const a = document.createElement("ul");
const b = document.createElement("ul");

const li = document.createElement("li");
li.textContent = "Самбуса";
a.append(li);

b.append(li);                        // аз a ба b кӯч баст
console.log(a.children.length, b.children.length);  // → 0 1

a.append(li.cloneNode(true));        // нусха ҳам дар он ҷо, ҳам дар ин ҷо мемонад
console.log(a.children.length, b.children.length);  // → 1 1

createElement ё innerHTML?

createElement + appendinnerHTML бо сатр
Навишта мешаваддарозтаркӯтоҳтар, ба HTML-и воқеӣ монанд
Бехатарӣматн ҳамеша тавассути textContent — бехатархатарнок, агар дар сатр матни бегона бошад
Истинодҳои кӯҳна ба унсурҳонигоҳ дошта мешавандҳангоми += ва аз нав навиштан вайрон мешаванд
Кай интихоб кардандодаҳои корбар ва API, вақте ки унсур дар тағйирёбанда лозим астқолаби статикӣ, ки худатон навиштаед

Дар ин дарс мо бо роҳи бехатар меравем: createElement. Вай каме дарозтар аст, аммо меомӯзонад, ки сохтори саҳифаро чун дарахт бинем — ва маҳз ин баъдтар дар React ба кор меояд.

Хатои маъмул: ҷойгир карданро фаромӯш карданд

Унсурро эҷод кардан — маънои нишон додани онро надорад. Бе append (ё prepend, before, after) вай «дар халта» мемонад. Агар дар саҳифа чизе пайдо нашуд, ва хатоҳо нестанд, — аввал санҷед, ки ҷойгиркунӣ дар ҳақиқат даъват мешавад.

Муфассалтар хонед: learn.javascript.ru — Тағйири ҳуҷҷат · MDN — createElement · MDN — replaceChildren

Амалия: мустаҳкам мекунем

Эҷод мекунем, ҷойгир мекунем, ҷой иваз мекунем, нест мекунем.

ВАЗИФАИ 5.1

Унсури аввал

осон

<li>-ро бо матни Самбуса эҷод кунед ва ба рӯйхати #menu ҷойгир кунед. Шумораи кӯдакони рӯйхат ва матни онро баровед.

Менюи холӣ · Ctrl + Enter
<ul id="menu"></ul>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
1
Самбуса
Ишора 1

Се қадам: createElement("li"), баъд textContent, баъд menu.append(...).

Ишора 2

const li = document.createElement("li"); li.textContent = "Самбуса"; menu.append(li);

ВАЗИФАИ 5.2

Се банд бо давра

осон

Барои ҳар таом аз массив <li>-ро бо класси item эҷод кунед ва ба #menu ҷойгир кунед. Шумораи бандҳо, матни охирин ва класси аввалро баровед.

Меню бо давра · Ctrl + Enter
<ul id="menu"></ul>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
3
Чой
item
Ишора 1

Бадани давра for (const dish of dishes) { ... } ҳамон се қадамро дорад, ки дар вазифаи 5.1, илова li.classList.add("item").

Ишора 2

Эҷоди li-и нав бояд дар дохили давра бошад — барои ҳар банд унсури худ.

ВАЗИФАИ 5.3

Навбат дар бонк

миёна

Чор амалро бо навбат иҷро кунед: 1) касеро, ки класси old дорад, нест кунед; 2) Зарина-ро ба худи оғоз гузоред; 3) Далер-ро фавран пас аз Алии гузоред; 4) Нилуфар-ро ба охир илова кунед. Функсияи ёридиҳандаи make аллакай ҳаст.

Навбат · Ctrl + Enter
<ul id="line">
  <li>Алия</li>
  <li class="old">Бахром</li>
  <li>Умар</li>
</ul>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
Зарина, Алия, Далер, Умар, Нилуфар
Ишора 1

Амали аввал: .old-ро тавассути querySelector ёбед ва аз он remove()-ро даъват кунед. «Пас аз Алия» — ин метод аз худи alia аст: alia.after(...).

Ишора 2

line.querySelector(".old").remove(); line.prepend(make("Зарина")); alia.after(make("Далер")); line.append(make("Нилуфар"));

ВАЗИФАИ 5.4

Кӯч баст ё нусха шуд

душвор

Аввал ду адади сатрҳои якуми баромадро пешбинӣ кунед — пас аз ҳар амал дар рӯйхатҳои чап ва рости чанд унсур хоҳад буд. Баъд иҷро кунед. Сипас кодро пурра кунед: клон пеш аз ҷойгиркунӣ бояд матни Курутоб (копия)-ро гирад (ба матни клон " (копия)"-ро илова кунед), ва дар охир матни унсури охирини рӯйхати ростро баровед.

Ду рӯйхат · Ctrl + Enter
<ul id="left">
  <li>Самбуса</li>
  <li>Курутоб</li>
  <li>Шакароб</li>
</ul>
<ul id="right"></ul>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
2 1
2 2
Курутоб (копия)
Ишора 1

append-и аввал «Самбуса»-ро интиқол медиҳад — дар чап 2 мемонад, дар рост 1. Дуюм нусха-ро ҷойгир мекунад — дар чап боз 2, дар рост 2.

Ишора 2

clone.textContent += " (копия)"; пеш аз ҷойгиркунӣ, ва дар охир — console.log(right.lastElementChild.textContent);

06 Рендер: аз массив ба кортҳо

Акнун ҳар чизеро, ки медонед, ҳамроҳ мекунем. Дар дарсҳои 6 ва 7 шумо бо массивҳои объектҳо кор кардед — феҳристҳои молҳо, донишҷӯён, фармоишҳо. Акнун ин додаҳоро кашидан мумкин аст. Калимаи рендер (render) маҳз маънои «аз додаҳо он чиро, ки дар экран намоён аст, сохтан»-ро дорад. Тарҳ ҳамеша як аст:

  1. Додаҳо — массиви объектҳо: const products = [{ title: "Нон", price: 4 }, …]. Ин сарчашмаи асосии ҳақиқат аст.
  2. Функсияи-фабрика createCard(product) — як объектро мегирад ва унсури тайёрро бармегардонад.
  3. Функсияи рендер render(items) — контейнерро тоза мекунад ва ба он кортҳоро барои тамоми массив ҷойгир мекунад.
  4. Даъват render(products) — саҳифа кашида шуд. Массивро тағйир додед — боз render-ро даъват кардед.
Монандӣ аз ҳаёт

Оши палав дар тӯй. Дастур ва рӯйхати меҳмонон — ин додаҳо мебошанд. Ошпаз — функсияи-фабрика: дар вуруд биринҷ ва гӯшт, дар хуруҷ як пурсон. Ва пешхизмат — render: аз тамоми рӯйхати меҳмонон мегузарад, пеши ҳар кас пурсон мегузорад. Меҳмони нав омад — дастурро тағйир додан лозим нест, танҳо боз як пурсон аз рӯи ҳамон дастур.

Рендери феҳрист + тугмаи тоза кардан · Ctrl + Enter
<button id="clear">Очистить</button>
<div id="catalog" class="catalog"></div>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.

Иҷро кунед, баъд тугмаи «Очистить»-ро дар preview пахш кунед — кортҳо нопадид мешаванд. Нарх тағйир диҳед ё ба массив боз як мол илова кунед, боз иҷро кунед: саҳифа худаш аз нав кашида мешавад. Додаҳоро тағйир медиҳем — саҳифа аз паси онҳо меравад.

Render-ро аз рӯи қисмҳо ҷудо мекунем

items.map(createCard)
map ҳар молро ба createCard медиҳад ва унсурҳои баргардонидашударо ба массиви нав ҷамъ мекунад.
...cards
Оператори spread аз дарси гузашта: массиви унсурҳоро ба аргументҳои replaceChildren(card1, card2, …) «мерезад».
replaceChildren(…)
Аввал ҳамаи кӯдакони кӯҳнаро мебарорад, баъд навҳоро ҷойгир мекунад. Бинобар ин render-и такрорӣ кортҳоро дубора намекунад.
replaceChildren()
Бе аргументҳо — контейнерро оддӣ тоза мекунад. Ин маҳз «тугмаи тоза кардан» аст.
Тугма ҳоло «ба ҳалолӣ» кор мекунад

Сатри clearBtn.onclick = … — нигоҳи аввал ба ҳодисаҳо аст. Ҳоло онро чун «вақте ки тугмаро пахш кунанд — инро иҷро кун» дар хотир доред. Ҳодисаҳоро пурра (addEventListener, объекти ҳодиса, делегатсия) мо дар дарси оянда ҷудо мекунем. Барои вазифаи хонагӣ ин сатр кифоя аст.

Ҳолати холӣ

Корбар чӣ мебинад, агар аз рӯи филтраш чизе ёфт нашавад? Саҳифаи холии сафед — гӯё сайт вайрон шудааст. Рендери хуб ҳамеша массиви холиро коркард мекунад:

render бо ҳолати холӣ
function render(items) {
  if (items.length === 0) {
    const empty = document.createElement("p");
    empty.className = "empty";
    empty.textContent = "Ничего не найдено";
    catalog.replaceChildren(empty);
    return;                              // баромади барвақт — мисли дарс дар бораи функсияҳо
  }
  catalog.replaceChildren(...items.map(createCard));
}
Ду хатои маъмули рендер

1. Кортҳоро бе тоза кардани контейнер ҷойгир кардан: ҳар render-и нав молҳоро ба кӯҳнаҳо илова мекунад, ва рӯйхат мерӯяд. replaceChildren-ро истифода баред.

2. Унсурро берун аз функсия ё берун аз давра эҷод кардан: const card = document.createElement(…) як бор ва баъд борҳо append(card). Унсур як аст — яъне вай кӯч мебандад, ва дар натиҷа дар саҳифа як корт мемонад (бахши 5-ро ба ёд оред).

Ҳамон рендер бо сатр

Варианти кӯтоҳ бо сатри қолабӣ низ ҷоиз аст, агар додаҳо аз они шумо ва бехатар бошанд. Муқоиса кунед — натиҷа якхела аст:

Варианти бо сатр (танҳо барои додаҳои худӣ, бехатар)
function render(items) {
  catalog.innerHTML = items
    .map(p => `<article class="card"><h3>${p.title}</h3><p class="price">${p.price} сомони</p></article>`)
    .join("");
}

Аммо агар title метавонад аз корбар ё аз сервери бегона ояд — танҳо createElement ва textContent.

Муфассалтар хонед: learn.javascript.ru — Тағйири ҳуҷҷат · MDN — replaceChildren

Амалия: мустаҳкам мекунем

Чор вазифа аз сода ба мураккаб: аз як функсияи-фабрика то гурӯҳбандӣ аз рӯи категорияҳо.

ВАЗИФАИ 6.1

Фабрикаи бандҳо

осон

Функсияи createItem(product)-ро пурра кунед: он <li>-ро бо матни намуди Нон — 4 сомони эҷод мекунад ва онро бармегардонад. Рендер дар охир аллакай навишта шудааст.

Рӯйхати харид · Ctrl + Enter
<ul id="list"></ul>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
4
Нон — 4 сомони
Ишора 1

Функсия бояд бо return li; анҷом ёбад — вагарна map массиви undefined-ро ҷамъ мекунад.

Ишора 2

li.textContent = `${product.title} — ${product.price} сомони`;

ВАЗИФАИ 6.2

Ҳолати холӣ

миёна

Функсияи render(items)-ро нависед: он #catalog-ро тоза мекунад; агар массив холӣ бошад — банди <p class="empty">Ничего не найдено</p>-ро ҷойгир мекунад; вагарна — яктоӣ <div class="card"> бо номи мол. Бо се маҷмӯи додаҳо санҷед.

Феҳрист бо ҳолати холӣ · Ctrl + Enter
<div id="catalog"></div>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
3
2
1
Ничего не найдено
Ишора 1

Функсияро бо санҷиши if (items.length === 0) ва return-и барвақт оғоз кунед. Коди боқимонда танҳо барои массиви ғайрихолӣ мешавад.

Ишора 2

Дар ҳарду шоха catalog.replaceChildren(...)-ро истифода баред: дар холӣ — бо як банд, дар оддӣ — бо массиви кортҳо тавассути items.map.

ВАЗИФАИ 6.3

Корт бо қайди «дар мавҷуд нест»

миёна

createCard({ title, price, inStock })-ро пурра кунед: дар дохили <article class="card"> <h3> бо ном ва <p class="price"> бо матни 60 сомони мемонанд. Агар мол дар мавҷуд набошад, ба корт боз класси out лозим аст. Деструктуризатсия дар параметрҳо — мисли дарс дар бораи объектҳо.

Феҳрист бо мавҷудият · Ctrl + Enter
<div id="catalog"></div>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
4
1
60 сомони
Ишора 1

Тарҳ ҳамон аст, ки дар мисоли боло: card, h3, p.price, баъд card.append(h3, p) ва return card.

Ишора 2

if (!inStock) card.classList.add("out"); — пеш аз return.

ВАЗИФАИ 6.4

Гурӯҳбандӣ аз рӯи категорияҳо

душвор

Молҳоро аз рӯи бахшҳо нишон диҳед: барои ҳар категория <section>-ро бо сарлавҳаи <h3> (номи категория) ва рӯйхати <ul> эҷод кунед, ки дар он ҳар мол — <li> аст. Аввал массивро тавассути reduce ба объекти «категория → массиви номҳо» гурӯҳбандӣ кунед, баъд DOM-ро аз Object.entries(groups) созед. Тартиби бахшҳо — тартиби пайдошавии аввали категория.

Феҳрист аз рӯи бахшҳо · Ctrl + Enter
<div id="catalog"></div>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
3
Продукты: 2
Кухня: 1
Сувениры: 2
Ишора 1

Гурӯҳбандӣ: products.reduce((acc, p) => { if (!acc[p.category]) acc[p.category] = []; acc[p.category].push(p.title); return acc; }, {}). Қимати оғозӣ — объекти холӣ.

Ишора 2

Давра for (const [category, titles] of Object.entries(groups)). Дар дохил section, h3 (матн — category), ul эҷод кунед; барои ҳар ном аз titles — li. section-и ҷамъшуда — catalog.append(section).

07 Тақсими меҳнат: ЗС ҳамбандиро менависад, шумо — мантиқро

DOM — ҷойи беҳтарин аст, то меомӯзед, ки бо ЗС дуруст кор кунед. Ҳамбандӣ ва CSS — кори ҳаҷман калон, аммо якмонанд: ЗС онро зуд ва одатан хуб иҷро мекунад. Аммо мантиқ — кадом додаҳо, бо кадом тартиб, дар ҳолати рӯйхати холӣ чӣ кардан — ин аст, ки шумо бояд то сатри охирин фаҳмед. Бинобар ин дар курси мо қоида чунин аст:

Қоидаи дарси 8

ЗС HTML ва CSS менависад. Мантиқи JavaScript-ро худатон менависед. Аввал 15 дақиқа худатон кӯшиш мекунед, ва танҳо баъд бо промпт ба ЗС меравед. Кодеро, ки сатр ба сатр шарҳ дода наметавонед, ҷойгир накунед.

Ба ЗС медиҳемХудамон мекунем
Ҳамбандии корт, шакл, сарлавҳаи саҳифаСохтори додаҳо (молро кадом майдонҳо доранд)
CSS: тӯр, рангҳо, фосилаҳо, мутобиқшавӣФунксияҳои createCard ва render
Додаҳои санҷишӣ (массиви 10 мол)Санҷиш: додаҳо воқеънамо, навъҳо дурустанд
Шарҳи методи ношиносҚарор, ки кадом метод ва кай татбиқ кардан

Маълумоти кӯтоҳ: BEM — номҳои классҳо бе бесаранҷомӣ

Вақте ки ЗС ҳамбандӣ мекунад, хоҳиш кунед, ки классҳоро аз рӯи BEM ном гузорад. Ин мувофиқа дар бораи номҳост, то аз рӯи класс фавран маълум шавад, ки ин чист:

Блок
Ҷузъи мустақил: product-card.
Унсур
Қисми блок, бо ду зерхат: product-card__title, product-card__price.
Модификатор
Варианти блок, бо ду тире: product-card--out («дар мавҷуд нест»). Дар JS онро тавассути classList фаъол ва хомӯш мекунанд — ҳамон гуфтугӯ дар бораи бейҷҳо аз бахши 4.

Промпт барои қолаби HTML

Ду дархости ба ЗС-ро муқоиса кунед. Якум — чунон ки навомӯзон мекунанд. Дуюм — аз рӯи формулаи курс: замина → вазифа → маҳдудиятҳо → формати ҷавоб → санҷиш.

корти молро бисоз
Замина: ман JavaScript меомӯзам, мағозаи таълимии интернетиро бо HTML/CSS/JS-и тоза бе китобхонаҳо месозам. Ба ман танҳо ҳамбандӣ лозим аст — JavaScript-ро худам менависам. Вазифа: қолаби HTML-и як корти молро (ном, нарх, тугмаи «В корзину») ва CSS барои он, илова CSS барои тӯри мутобиқшавандаи чунин кортҳо (grid) бисоз. Маҳдудиятҳо: классҳо аз рӯи BEM (product-card, product-card__title, product-card__price, product-card__btn, модификатори product-card--out барои моле, ки дар мавҷуд нест). Бе JavaScript, бе услубҳои inline, бе onclick, бе тасвирҳо ва ҳарфҳои берунӣ. Мавзӯи равшан, кунҷҳои мудаввар. Формати ҷавоб: ду блоки код — HTML ва CSS. Пас аз онҳо — рӯйхати классҳо ва маънои ҳар кадом, дар се то панҷ сатр. Санҷиш: нависед, ки кадом унсурҳои қолабро ман бояд аз JavaScript пур кунам.

ЗС аз промпти дуюм чӣ мегирад? Стек, сатҳ, ҳудудҳо («JavaScript нанавис»), номҳои мушаххаси классҳо, формати ҷавоб ва хоҳиши худро санҷидан. Ва ба шумо мантиқ мемонад — ва шумо дақиқ медонед, ки он ба кадом классҳо такя мекунад.

ЗС чӣ ҷавоб дода метавонист — ва онро чӣ тавр ба код табдил додан

Фарз мекунем, ЗС чунин ҳамбандии як кортро баргардонд:

Ҷавоби ЗС: HTML
<article class="product-card">
  <h3 class="product-card__title">Название товара</h3>
  <p class="product-card__price">0 сомони</p>
  <button class="product-card__btn">В корзину</button>
</article>

Вазифаи шумо — ин кортро даҳ маротиба нусха кардан не, балки онро як бор дар функсия тавсиф кардан аст. Ҳар теги қолаб ба се сатр табдил меёбад: эҷод кардем, танзим кардем, ҷойгир кардем.

Дар қолаби ЗСДар функсияи createCard-и шумо
<article class="product-card">createElement("article") + className = "product-card"
<h3 class="product-card__title">Название</h3>createElement("h3"), класс, textContent = product.title
<p class="product-card__price">createElement("p"), класс, textContent = product.price + " сомони"
<button class="product-card__btn">createElement("button"), класс, textContent = "В корзину"
дарунравӣ: ҳама дар дохили articlecard.append(title, price, btn)
Қолаб аз ЗС + createCard-и шумо · Ctrl + Enter
<div id="catalog" class="catalog"></div>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.

Ҷавоби ЗС-ро месанҷем: феҳристи санҷиш

  • Оё дар ҷавоб <script>, onclick="…", услубҳои inline style="…" ҳастанд? Шумо бе онҳо хоҳиш карда будед — яъне мебарорем.
  • Оё номҳои классҳо бо онҳое, ки шумо дар JS истифода мебаред, мувофиқ меоянд? Як ҳарфи изофӣ — ва querySelector null бармегардонад.
  • Оё тегҳо мувофиқанд: article барои корт, h3 барои ном, button барои тугма (на div бо клик)?
  • Оё тасвирҳо ва ҳарфҳои берунӣ нестанд, ки бор намешаванд?
  • Агар ЗС innerHTML-ро бо ҷойгиркунии додаҳо пешниҳод кард — пурсед, ки ин бехатар аст ё не, ва ба textContent аз нав нависед.
  • Оё ЗС методҳои вуҷуднадоштаро ихтироъ накардааст? Ношиносро дар MDN санҷед.
«Тамоми рендерро бинавис» хоҳиш накунед

Агар аз ЗС хоҳиш кунед, ки createCard ва render-ро нависад, вай кори коддорро дар панҷ сония менависад — ва шумо чизе намеомӯзед. Ҳангоми санҷиши вазифаи хонагӣ омӯзгор метавонад хоҳиш кунад, ки ҳар сатрро шарҳ диҳед. Роҳи хуби истифодаи ЗС барои мантиқ: аввал варианти худро нависед, баъд хоҳиш кунед «сатр ба сатр шарҳ деҳ, ки коди ман чӣ мекунад, ва 2 ҷойро ном бар, ки дар онҳо вайрон мешавад».

Инак функсияи createCard-и ман: [код]. Сатр ба сатр шарҳ деҳ, ки вай чӣ мекунад. Чизеро аз нав нанавис. Дар охир ду ҳолати канориро ном бар, ки дар онҳо вай вайрон мешавад (масалан, майдони price нест).

Амалия бо ЗС

Як вазифа оид ба санҷиши коди бегона, як — оид ба навиштани промпти худ.

ВАЗИФАИ 7.1

Коди ЗС-ро санҷед

миёна

Шумо аз ЗС хоҳиш кардед, ки феҳристро бикашад. Вай коди зерро баргардонд. Дар он се хато ҳаст. Талабҳо: дар саҳифа ду корт бояд бошад; дар ҳар кадом — сарлавҳа бо ном ва банди .price бо матни намуди 450 сомони. Хатоҳоро яктоӣ ёбед ва ислоҳ кунед, кодро аз нав иҷро карда. Аввал хаторо дар консол хонед.

Коди ЗС (бо хатоҳо) · Ctrl + Enter
<div id="catalog" class="catalog"></div>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
2
Чапан
450 сомони
Ишора 1

Хатои якум фавран намоён аст: дар консол null. Селекторро бо классии контейнер дар HTML муқоиса кунед. Дуюм: ба ёд оред, ки вақте як унсури якхеларо якчанд маротиба ҷойгир мекунанд, чӣ мешавад. Сеюм — дар матни нарх: аз рӯи талабҳо чӣ намерасад?

Ишора 2

Селектор бояд ".catalog" бошад. Эҷоди card-ро бояд ба дохили forEach гузаронд, то барои ҳар мол унсури худ бошад. Дар сатри қолабии нарх сомони-ро пас аз ${p.price} илова кунед.

ВАЗИФАИ 7.2

Промпти худро тартиб диҳед

осон

Аз рӯи формулаи курс промпт барои ЗС тартиб диҳед: HTML ва CSS-и корти курси MakeFirstStep (ном, давомнокӣ, нарх, тугмаи «Записаться»). Ҳатмист: BEM, бе JavaScript, бе услубҳои inline, ҷавоб — ду блоки код. Онро ба ЗС фиристед, ҷавобро аз рӯи феҳристи санҷиши боло санҷед ва промптро ба файли prompt.txt захира кунед — он барои вазифаи хонагӣ муфид мешавад.

Барои ин вазифа санҷиши худкор нест: онро ҳангоме иҷрошуда қайд кунед, ки промпт тартиб дода шуда, ва ҷавоб аз рӯи ҳамаи бандҳои феҳристи санҷиш санҷида шудааст.

Ишора 1

Аз рӯи формула гузаред: замина (лоиҳа, сатҳ), вазифа (як), маҳдудиятҳо (BEM, бе JS), формат (ду блоки код), санҷиш (чӣ аз JS пур кардан).

Ишора 2

Промптро аз ин бахш гиред ва молро ба курс иваз кунед: майдонҳои title, duration, price, тугмаи «Записаться».

08 Амалия дар дарс: феҳристи кортҳоро ҷамъ мекунем

Вақти он расид, ки ҳамаро якҷоя ҷамъ кунем. Мақсад: саҳифаи мағоза, ки дар он 10 корт аз массив кашида мешавад, ва тугмаи «Очистить» ҳамаи онҳоро мебарорад. Ҳамбандӣ ва услубҳоро мо аз ЗС гирифтем (онҳо аллакай дар қуттиҳои реги зер ҳастанд), мантиқро шумо менависед — қадам ба қадам.

  1. Додаҳо. Массиви 10 объектро эҷод кунед: title, price, category, inStock, rating. Дар ҳаёти воқеӣ чунин додаҳоро аз ЗС хоҳиш кардан мумкин аст (дарси 7) — аммо 2–3 объектро бо чашм санҷидан ба ҳар ҳол лозим аст.
    JavaScript
    const products = [
      { title: "Самбуса", price: 5, category: "Еда", inStock: true, rating: 4.9 },
      // ... боз 9 мол
    ];
  2. Ёфтани контейнер ва тугма — як бор, дар оғози скрипт.
    JavaScript
    const catalog = document.querySelector("#catalog");
    const clearBtn = document.querySelector("#clear");
  3. Фабрикаи корт. Функсияи createCard(product): article, h3, p-ро эҷод мекунад, классҳоро аз рӯи BEM ва матнро тавассути textContent танзим мекунад, тавассути append ҷамъ мекунад ва кортро бармегардонад. Барои моли дар мавҷуднабуда — модификатори product-card--out.
  4. Рендер. Функсияи render(items): catalog.replaceChildren(...items.map(createCard)).
  5. Даъват. render(products) — ва ба саҳифа нигоҳ кунед.
  6. Тугмаи тоза кардан. clearBtn.onclick = () => catalog.replaceChildren();
  7. Санҷиш: баровардани шумораи кортҳо ба консол — пеш аз тоза кардан, пас аз он ва пас аз рендери такрорӣ.
Чӣ тавр қадам ба қадам рафтан

Пас аз ҳар қадам ▶ Иҷро-ро пахш кунед ва ба preview нигоҳ кунед. Ҳамаро якбора нанависед: агар дар қадами 3 корт пайдо нашуд, шумо дақиқ медонед, ки дар куҷо ҷустан. Ин ҳамон усул аст, ки дар «Тақсими меҳнат»-и бахши 7: қадамҳои хурд, санҷиш пас аз ҳар кадом.

Амалия: мағозаи «Бозор»

Ду вазифа: аввал саҳифаи пурра, баъд беҳсозиҳо. Дар қуттии реги ҳамбандӣ ва CSS аз ЗС аллакай ҳаст; додаҳо низ тайёранд.

ВАЗИФАИ 8.1

Феҳристи 10 корт ва тугмаи тоза кардан

миёна

createCard, render ва тугмаи тоза карданро аз рӯи қадамҳои боло пурра кунед. Коди санҷишӣ дар поён худаш тугмаро бо методи click() «пахш мекунад». Он мебарорад: чанд корт шуд, чандто аз онҳо «нет в наличии» ҳастанд, пас аз тоза кардан чанд ва пас аз рендери такрорӣ чанд.

Мағозаи «Бозор»: феҳрист · Ctrl + Enter
<header class="shop__head">
  <h2 class="shop__title">Магазин «Бозор»</h2>
  <button id="clear" class="shop__btn">Очистить</button>
</header>
<div id="catalog" class="catalog"></div>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
10
2
0
10
Ишора 1

Агар дар саҳифа холӣ аст, ва хатоҳо нестанд — санҷед, ки createCard бо return card; анҷом меёбад, ва render дар ҳақиқат натиҷаро ба catalog ҷойгир мекунад.

Ишора 2

render — як сатр: catalog.replaceChildren(...items.map(createCard)); Тугма: clearBtn.onclick = () => catalog.replaceChildren();

ВАЗИФАИ 8.2

Хитҳо ва ҳисобкунак

душвор

Феҳрист аллакай кор мекунад. Онро беҳтар кунед: 1) ба молҳои дорои рейтинги 4.8 ва боло класси product-card--hit ва нишони <span class="product-card__badge">Хит</span>-ро ба дохили корт илова кунед; 2) пас аз ҳар render дар #stats сатри намуди Хитов: 3 из 10-ро нишон диҳед (шумораи умумӣ — ин items.length, хитҳоро аз рӯи массиви items ҳисоб кунед). Нишонро танҳо тавассути createElement ҷойгир кунед.

Мағозаи «Бозор»: хитҳо · Ctrl + Enter
<header class="shop__head">
  <h2 class="shop__title">Магазин «Бозор»</h2>
  <button id="clear" class="shop__btn">Очистить</button>
</header>
<p id="stats" class="shop__stats"></p>
<div id="catalog" class="catalog"></div>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
3
Хитов: 3 из 10
Ишора 1

Шарти product.rating >= 4.8 дар дохили createCard: классро тавассути classList илова кунед, span эҷод кунед, класс ва матнро диҳед ва онро ба корт тавассути card.append(...) ҷойгир кунед.

Ишора 2

Ҳисобкунак: const hits = items.filter(p => p.rating >= 4.8).length; ва stats.textContent = `Хитов: ${hits} из ${items.length}`;

09 Вазифаи хонагӣ

Мавзӯъ: «Саҳифаи аз JS ҷамъшуда». Саҳифаи феҳристи худро ҷамъ кунед: тамоми мундариҷа аз массив пайдо мешавад, ва дар файли HTML ягон корт нест.

Чӣ кор кардан лозим

  • ☐ Додаҳо. Массиви на камтар аз 10 объект дар мавзӯи интихоби шумо: мағоза, менюи чойхона, курсҳои MakeFirstStep, маршруткаҳои Душанбе, филмҳо. Ҳар объект на камтар аз 4 майдон дорад, ки дар байни онҳо title ва майдони мантиқӣ (масалан, inStock) ҳаст.
  • ☐ Ҳамбандӣ аз ЗС. Қолаби HTML ва CSS аз рӯи промпт бо формулаи курс гирифта шудааст. Промпт дар файли prompt.txt нигоҳ дошта шудааст. Классҳо — аз рӯи BEM.
  • ☐ createCard(item). Функсияи алоҳида, ки тавассути createElement кортро ҷамъ мекунад ва онро бармегардонад. Тамоми матн — тавассути textContent.
  • ☐ render(items). Функсияи алоҳида: контейнерро тавассути replaceChildren тоза мекунад ва кортҳоро ҷойгир мекунад. Барои массиви холӣ «Ҳеҷ чиз ёфт нашуд»-ро нишон медиҳад.
  • ☐ Тугмаи тоза кардан. Тугмаи «Тоза кардан» ҳамаи кортҳоро мебарорад (тавассути onclick, чун дар дарс). Бонус: тугмаи «Ҳамаро нишон деҳ» онҳоро бармегардонад.
  • ☐ Ҳисобкунак. Матни «Нишон дода шуд: N» дар дохили render навсозӣ мешавад.
  • ☐ Модификатор. Кортҳое, ки майдони мантиқӣ барояшон дурӯғ аст, класси иловагӣ (--out, --sold ва ғ.) тавассути classList мегиранд, ва CSS онҳоро ҷудо мекунад.
  • ☐ Бонус. render-ро бо массиви филтршуда (масалан, танҳо арзонҳо) даъват кунед — оддӣ бо сатр дар код, бе тугмаҳо. Тугмаҳои-филтр дар дарси оянда мешаванд.
Қоидаҳои кор бо ЗС дар ин вазифаи хонагӣ

ЗС-ро барои ҳамбандӣ, CSS ва додаҳои санҷишӣ истифода бурдан мумкин аст. Мантиқро (createCard, render, тоза кардан, ҳисобкунак) худатон менависед. Ҳангоми санҷиш омӯзгор метавонад хоҳиш кунад, ки ҳар сатри JS-и шуморо шарҳ диҳед. Агар натавонед — баҳо паст мешавад.

Чӣ супурдан лозим

  • Се файл: index.html, style.css, script.js ва файли prompt.txt бо промпте, ки аз рӯи он ЗС ҳамбандиро сохт.
  • Скриншоти саҳифа бо 10 корт ва скриншот пас аз пахши «Тоза кардан».
  • Ду-се ҷумла дар чати гурӯҳ: чӣ аз ҳама душвор баромад ва пас аз санҷиши коди ЗС чиро ислоҳ кардед.

Чӣ тавр баҳо медиҳем (0–10)

МеъёрБаллҳо
На камтар аз 10 корт аз массив кашида мешавад, дар HTML нестанд3
createCard ва render — функсияҳои алоҳида, render бе такрорҳо даъват мешавад1
Тугмаи тоза кардан кор мекунад1
Ҳисобкунак ва ҳолати холӣ1
Модификатори класс тавассути classList ва услуб барои он1
Ҷойгиркунии бехатар: додаҳо тавассути textContent, на innerHTML1
Коди тоза: номҳои бомаъно, нусхабардории бесарусомон нест, унсурҳои ёфтшуда дар тағйирёбандаҳо1
Промпт аз рӯи формула дар prompt.txt ва қобилияти шарҳ додани код1
Маслиҳат: аз куҷо оғоз кардан

Аввал дастӣ дар HTML як кортро нависед ва ба он ноил шавед, ки он зебо аст. Баъд онро аз HTML баред ва дар createCard аз нав сохтед — ин тавр шумо дақиқ медонед, ки кадом сохтор лозим аст. Пас аз ҳар қадам console.log ва ҷадвалчаи Elements-ро дар DevTools истифода баред, то бинед, ки кодатон дар асл чиро сохт.

✓ Хулосаи дарс

  • DOM — дарахти зиндаи объектҳо, ки браузер аз HTML месозад. JavaScript бо он тавассути document кор мекунад. Файли HTML ҳангоми ин тағйир намеёбад.
  • Ҳаракат: parentElement, children, firstElementChild, lastElementChild, nextElementSibling, previousElementSibling. childNodes фосилаҳоро низ ҳисоб мекунад.
  • Ҷустуҷӯ: querySelector(sel) — унсури аввал ё null; querySelectorAll(sel) — NodeList (барои map — Array.from). Дар дохили унсур ҷустан мумкин аст: card.querySelector(".price").
  • Матн ва ҳамбандӣ: textContent — матни бехатар; innerHTML — ҳамбандӣ, танҳо барои додаҳои худӣ. Матни бегона — ҳамеша textContent. += барои innerHTML истинодҳои кӯҳнаро вайрон мекунад.
  • Классҳо: classList.add / remove / toggle / contains. className = ҳамаро пок мекунад. Тарроҳӣ — дар классҳои CSS, на дар el.style.
  • Атрибутҳо: getAttribute / setAttribute / removeAttribute / hasAttribute; хосиятҳои value, disabled, hidden; додаҳои худӣ — data-* ва el.dataset.name (ҳамеша сатр).
  • Эҷод: createElement → танзим кардан → append / prepend / before / after. Нест кардан — el.remove(), тоза кардан — parent.replaceChildren(), нусха — cloneNode(true). Унсур нусха намешавад, балки кӯч мебандад.
  • Рендер: додаҳо (массив) → createCard(item) унсурро бармегардонад → render(items) replaceChildren(...items.map(createCard))-ро иҷро мекунад. Ҳамеша массиви холиро коркард кунед.
  • Бо ЗС: ЗС HTML ва CSS менависад (BEM, бе JS ва услубҳои inline), шумо — мантиқро. Номҳои классҳо, бехатарии ҷойгиркунӣ ва методҳои ихтироъшударо санҷед. Кодеро, ки шарҳ дода наметавонед, ҷойгир накунед.