Дарси 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< ul class ="menu" >
< li > Самбуса</ li >
< li > Курутоб</ li >
< li > Шакароб</ li >
</ ul >
// body.firstElementChild — унсури аввали ҳамбандии мо, яъне <ul>
const menu = document.body.firstElementChild;
console.log (menu.tagName); // UL
console.log (menu.children.length); // 3
console.log (menu.firstElementChild.textContent); // Самбуса
console.log (menu.lastElementChild.textContent); // Шакароб
const second = menu.children[1 ]; // кӯдакон мисли массив меистанд: 0, 1, 2
console.log (second.textContent); // Курутоб
console.log (second.previousElementSibling.textContent); // Самбуса
console.log (second.parentElement.tagName); // 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< ul >
< li > Нон</ li >
< li > Сомса</ li >
< li > Чой</ li >
< li > Мева</ li >
</ ul >
const list = document.body.firstElementChild; // ин <ul> аст
// 1) рӯйхат чанд кӯдак дорад
// 2) матни кӯдаки аввал
// 3) матни кӯдаки охирин
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 4
Нон
Мева
Ишора 1 Шумораи кӯдакон — list.children.length.
Ишора 2 Кӯдаки аввал — list.firstElementChild, охирин — list.lastElementChild. Матнро тавассути .textContent мегирем. Ҳар қимат — console.log-и алоҳида.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 1.2 Баромадро пешбинӣ кунед осон
Аввал бе иҷрои код , дар дафтар нависед, ки панҷ сатр чиро мебарорад. Баъд иҷро кунед ва муқоиса намоед. Пас аз ин сатри шашумро илова кунед: матни банди «Преподаватель…»-ро баровед, аммо аз охир ҳаракат карда — тавассути group.lastElementChild.previousElementSibling.
Гурӯҳи JS-12 · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< div class ="group" >
< h2 > Группа JS-12</ h2 >
< p > Преподаватель: Шахром</ p >
< p > Студентов: 12</ p >
</ div >
const group = document.body.firstElementChild;
const title = group.firstElementChild;
console.log (title.tagName);
console.log (title.nextElementSibling.textContent);
console.log (title.nextElementSibling.nextElementSibling.textContent);
console.log (title.parentElement.tagName);
console.log (group.children.length);
// сатри шашум — аз они шумо
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда H2
Преподаватель: Шахром
Студентов: 12
DIV
3
Преподаватель: Шахром
Ишора 1 Кӯдаки охирини гурӯҳ — банди «Студентов: 12». Ба мо банди пеш аз он лозим аст.
Ишора 2 console.log(group.lastElementChild.previousElementSibling.textContent);
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 1.3 Гиреҳҳои изофӣ миёна
Ба консол баровед: рӯйхат чанд childNodes дорад, чанд children, ва баъд матни ҳар шаҳр — ҳар кадом дар сатри худ (for...of-ро бар list.children истифода баред). Фикр кунед, ки фарқ дар ду адади аввал аз куҷо пайдо шуд.
Шаҳрҳо · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< ul >
< li > Душанбе</ li >
< li > Худжанд</ li >
< li > Бохтар</ li >
</ ul >
const list = document.body.firstElementChild;
// childNodes.length
// children.length
// давраи for...of бар list.children — матни ҳар шаҳрро баровед
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< h1 id ="title" > Чайхона «Сомон»</ h1 >
< ul class ="menu" >
< li class ="item" > Курутоб</ li >
< li class ="item" > Оши палав</ li >
< li class ="item hot" > Шакароб</ li >
</ ul >
const title = document.querySelector ("#title" ); // аз рӯи id
const first = document.querySelector (".item" ); // аз рӯи класс — аввалини се
const hot = document.querySelector (".item.hot" ); // ду класс якбора
const all = document.querySelectorAll (".item" ); // ҳар се
console.log (title.textContent); // Чайхона «Сомон»
console.log (first.textContent); // Курутоб
console.log (hot.textContent); // Шакароб
console.log (all.length); // 3
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Монандӣ аз ҳаёт
Шумо дар Бозори Сабз истодаед ва мегӯед: «Барои ман аввалин чодари зардолуи хушкро ёбед» — ин 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< 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 >
const cards = document.querySelectorAll (".card" );
for (const card of cards) {
const name = card.querySelector (".name" ).textContent; // танҳо дар дохили card меҷӯем
const price = card.querySelector (".price" ).textContent;
console.log (name + ": " + price);
}
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Методҳои кӯҳна низ ҳастанд: 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< h1 id ="title" > Чайхона «Сомон»</ h1 >
< ul class ="menu" >
< li class ="item" > Курутоб</ li >
< li class ="item" > Оши палав</ li >
< li class ="item hot" > Шакароб</ li >
</ ul >
// 1) матни сарлавҳа аз рӯи id
// 2) матни аввалини .item
// 3) ҳамагӣ чандто .item
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Чайхона «Сомон»
Курутоб
3
Ишора 1 Сарлавҳа: document.querySelector("#title"). Решётка — барои id, нуқта — барои класс.
Ишора 2 .item-и аввал — querySelector(".item"), ҳама — querySelectorAll(".item") ва баъд .length.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 2.2 Се хатогиро дар селекторҳо ёбед миёна
Код мехоҳад сарлавҳа, шумораи молҳо ва матни моли бо тахфифро барорад, аммо ҳеҷ чиз кор намекунад. Онро иҷро кунед, хаторо дар консол хонед ва се ҷойеро, ки бо рақамҳо қайд шудаанд, ислоҳ кунед. Яктоӣ ислоҳ кунед ва ҳар дафъа иҷро кунед — хатогиҳо навбат ба навбат кушода мешаванд.
Сабад (бо хатогиҳо) · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< h1 id ="title" > Корзина</ h1 >
< ul id ="cart" >
< li class ="item" > Нон — 4</ li >
< li class ="item" > Молоко — 12</ li >
< li class ="item sale" > Зардолу — 25</ li >
</ ul >
const title = document.querySelector (".title" ); // 1
const items = document.querySelector (".item" ); // 2
const sale = document.querySelector ("#sale" ); // 3
console.log (title.textContent);
console.log (items.length);
console.log (sale.textContent);
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Корзина
3
Зардолу — 25
Ишора 1 Хатои 1: сарлавҳа на класс, балки id дорад — яъне решётка лозим аст. Хатои 3 — баръакс: sale — класс аст, на id.
Ишора 2 Хатои 2: querySelector як унсурро бармегардонад, ва он .length надорад. Барои ҳисоб кардани ҳамаи молҳо querySelectorAll лозим аст.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 2.3 Нархҳо аз кортҳо душвор
Дар феҳрист чор корт ҳаст. Онҳоро гузаред, аз ҳар кадом нарх ва номро гиред (ҷустуҷӯ дар дохили корт), ҷамъи умумиро ҳисоб кунед ва гаронтаринро ёбед. Нарх дар textContent — сатр аст, онро тавассути Number(...) ба адад табдил диҳед.
Феҳрист · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< 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 >
const cards = document.querySelectorAll (".card" );
let total = 0 ;
let maxPrice = 0 ;
let maxName = "" ;
// аз болои cards гузаред: name ва price-ро гиред, total, maxPrice, maxName-ро навсозӣ кунед
console.log ("Итого: " + total + " сомони" );
console.log ("Самый дорогой: " + maxName);
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Итого: 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< h2 id ="dish" > Загрузка…</ h2 >
< div id ="box" > Старое содержимое</ div >
const dish = document.querySelector ("#dish" );
const box = document.querySelector ("#box" );
dish.textContent = "Оши палав" ; // матнро иваз кардем
console.log (dish.textContent); // Оши палав
box.innerHTML = "<b>Цена:</b> 35 сомони" ; // теги <b> унсури воқеӣ мешавад
console.log (box.children.length); // 1 — дар дохил <b> пайдо шуд
console.log (box.innerHTML); // <b>Цена:</b> 35 сомони
console.log (box.textContent); // Цена: 35 сомони — танҳо матн, бе тегҳо
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Монандӣ аз ҳаёт
Тасаввур кунед, ки шумо торт бо навишта фармоиш медиҳед. 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< h1 id ="title" > Загрузка…</ h1 >
< p class ="price" > 0 сомони</ p >
const title = document.querySelector ("#title" );
const price = document.querySelector (".price" );
// матнҳоро иваз кунед
console.log (title.textContent);
console.log (price.textContent);
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Курутоб
35 сомони
Ишора 1 Навиштан ба хосият — таъини оддӣ аст: title.textContent = "...";
Ишора 2 Ду сатр байни ҷустуҷӯ ва console.log: title.textContent = "Курутоб"; ва price.textContent = "35 сомони";
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 3.2 Баровардани бехатари ном миёна
Сатри userName — ин «воридоти корбар» аст. Онро ба блоки #a тавассути innerHTML, ва ба блоки #b — тавассути textContent гузоред. Ба preview нигоҳ кунед: дар кадом блок тегҳо намоёнанд? Консол фарқро тасдиқ мекунад.
Ду ҷойгиркунӣ · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< div id ="a" > </ div >
< div id ="b" > </ div >
const userName = "Ali <b>Pro</b>" ;
const a = document.querySelector ("#a" );
const b = document.querySelector ("#b" );
// ба a — тавассути innerHTML, ба b — тавассути textContent
console.log (a.children.length);
console.log (b.children.length);
console.log (b.textContent);
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
const dishes = ["Самбуса" , "Курутоб" , "Шакароб" ];
const menu = document.querySelector ("#menu" );
// сатрро ҷамъ кунед ва ба menu гузоред
console.log (menu.children.length);
console.log (menu.innerHTML);
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 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 ↺ Аз нав ▶ Иҷро кардан
index.html style.css script.js
< ul class ="menu" >
< li class ="item" > Самбуса</ li >
< li class ="item" > Курутоб</ li >
< li class ="item" > Шакароб</ li >
</ ul >
.item { padding : 6px 10px ; margin : 4px 0 ; border-radius : 8px ; background : #eef1f6 ; list-style : none; }
.hot { background : #ffd9a8 ; font-weight : 700 ; }
.hot::after { content : " 🔥" ; }
const items = document.querySelectorAll (".item" );
items[1 ].classList.add ("hot" ); // бейҷи «hot»-ро ба Курутоб додем
console.log (items[1 ].className); // item hot
console.log (items[1 ].classList.contains ("hot" )); // true
console.log (items[0 ].classList.contains ("hot" )); // false
items[1 ].classList.toggle ("hot" ); // буд — хомӯш шуд
console.log (items[1 ].className); // item
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Хатои маъмул: 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< p id ="note" > Скидка до конца недели</ p >
const note = document.querySelector ("#note" );
note.style.color = "white" ;
note.style.backgroundColor = "tomato" ; // camelCase!
note.style.padding = "8px 12px" ;
note.style.borderRadius = "8px" ;
console.log (note.style.color); // white
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Қоида: агар услуб муддати дароз ё барои якчанд унсур лозим бошад — класс эҷод кунед. 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< button id ="buy" data-id ="17" data-price ="35" data-product-name ="Курутоб" > Купить</ button >
const buy = document.querySelector ("#buy" );
console.log (buy.dataset.id); // "17" — ҳамеша сатр!
console.log (buy.dataset.price); // "35"
console.log (buy.dataset.productName); // data-product-name → productName
console.log (Number (buy.dataset.price) * 2 ); // 70 — барои ҳисобҳо ба адад табдил медиҳем
buy.dataset.price = "40" ; // навиштан низ тавассути dataset
console.log (buy.getAttribute ("data-price" )); // 40 — атрибут дар ҳамбандӣ тағйир ёфт
buy.disabled = true ; // хосияти disabled — тугма хокистарӣ ва ғайрифаъол аст
console.log (buy.hasAttribute ("disabled" )); // true
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Қапқон: ҳама чиз дар dataset — сатр аст
dataset.price "35"-ро бармегардонад, на 35-ро. Чунин қиматҳоро ҷамъ кардан хатарнок аст: "35" + "5" "355" медиҳад. Пеш аз ҳисобҳо ҳамеша тавассути Number(...) ба адад табдил диҳед.
Муфассалтар хонед: learn.javascript.ru — Услубҳо ва классҳо · Атрибутҳо ва хосиятҳо · MDN — classList
Амалия: мустаҳкам мекунем
Классҳо, услубҳо ва атрибутҳо дар амал.
ВАЗИФАИ 4.1 Бейҷҳо дар меню осон
Ба таоми «Курутоб» класси hot-ро илова кунед, ва аз «Шакароб» класси old-ро бардоред. Баъд className-и ҳар бандро баровед — яктоӣ дар як сатр.
Меню бо бейҷҳо · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
index.html style.css script.js
< ul class ="menu" >
< li class ="item" > Самбуса</ li >
< li class ="item" > Курутоб</ li >
< li class ="item old" > Шакароб</ li >
</ ul >
.item { padding : 6px 10px ; margin : 4px 0 ; border-radius : 8px ; background : #eef1f6 ; list-style : none; }
.hot { background : #ffd9a8 ; font-weight : 700 ; }
.old { opacity : .5 ; text-decoration : line-through; }
const items = document.querySelectorAll (".item" );
// items[1] — «Курутоб»: класси hot-ро илова кунед
// items[2] — «Шакароб»: класси old-ро бардоред
for (const item of items) {
console.log (item.className);
}
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< div id ="panel" class ="panel open" > Меню</ div >
const panel = document.querySelector ("#panel" );
// 1) panel.classList.contains("open")-ро баровед
// 2) toggle("open") ва боз contains-ро баровед
// 3) боз як бор toggle("open"), toggle("dark") ва panel.className-ро баровед
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< a id ="link" href ="https://example.com" > Сайт</ a >
< button id ="buy" data-id ="17" data-price ="35" > Купить</ button >
const link = document.querySelector ("#link" );
const buy = document.querySelector ("#buy" );
// 1) setAttribute("href", ...) ва getAttribute("href")-ро баровед
// 2) Number(buy.dataset.price) * 2-ро баровед
// 3) buy.dataset.id = "18" ва getAttribute("data-id")-ро баровед
// 4) buy.disabled = true ва hasAttribute("disabled")-ро баровед
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 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 ↺ Аз нав ▶ Иҷро кардан
index.html style.css script.js
< 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 { display : inline-block; padding : 10px 14px ; margin : 4px ; border : 2px solid #ccd3df ; border-radius : 10px ; }
.expensive { border-color : #c98a00 ; background : #fff3d6 ; }
.sale { border-color : #1a9a5a ; background : #dff6e8 ; }
const cards = document.querySelectorAll (".card" );
for (const card of cards) {
const price = Number (card.dataset.price);
// классҳои лозимиро илова кунед
console.log (card.className);
}
// чанд корт бо класси expensive
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 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 навишта шудааст. Аммо дар сайти воқеӣ, масалан мағозаи интернетӣ, рӯйхати молҳо аз додаҳо меояд, ва ҳамбандӣ барои он пешакӣ навишта намешавад. Унсурҳоро бояд аз код эҷод кард . Ин се қадам аст:
Эҷод кардем — document.createElement("li"). Унсур «дар анбор» пайдо шуд: он вуҷуд дорад, аммо дар саҳифа ҳоло намоён нест.
Танзим кардем — матн, классҳо, атрибутҳоро додем: li.textContent = "Самбуса", li.classList.add("item").
Ҷойгир кардем — parent.append(li). Танҳо пас аз ин он дар саҳифа пайдо мешавад.
Монандӣ аз ҳаёт
Бозор. Фурӯшанда мол аз халта мебарорад (createElement), нархнома мечаспонад (танзим) ва танҳо баъд ба пештахта мегузорад (append). То даме ки мол дар халта аст, харидорон онро намебинанд. Хатои аз ҳама маъмули навомӯз — ду қадами аввалро иҷро кардан ва дар бораи пештахта фаромӯш кардан.
Эҷод кардем, танзим кардем, ҷойгир кардем · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
index.html style.css script.js
< h2 > Сегодня в меню</ h2 >
< ul id ="menu" > </ ul >
.item { padding : 6px 10px ; margin : 4px 0 ; border-radius : 8px ; background : #eef1f6 ; list-style : none; }
const menu = document.querySelector ("#menu" );
const li = document.createElement ("li" ); // 1. эҷод кардем
li.textContent = "Оши палав" ; // 2. танзим кардем
li.classList.add ("item" );
menu.append (li); // 3. ҷойгир кардем — акнун он дар саҳифа аст
console.log (menu.children.length); // 1
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Ба куҷо ҷойгир кардан
Метод Унсур ба куҷо меафтад 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< ol id ="queue" >
< li > Рустам</ li >
< li class ="gone" > Мадина</ li >
< li > Фарход</ li >
</ ol >
const queue = document.querySelector ("#queue" );
function person (name) {
const li = document.createElement ("li" );
li.textContent = name;
return li;
}
queue.querySelector (".gone" ).remove (); // Мадина рафт
queue.prepend (person ("Нилуфар" )); // VIP — ба оғоз
queue.append (person ("Далер" )); // оддӣ — ба охир
queue.children[1 ].after (person ("Сабрина" )); // пас аз Рустам (вай акнун дуюм аст)
console.log (Array.from (queue.children, li => li.textContent).join (", " ));
// Нилуфар, Рустам, Сабрина, Фарход, Далер
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Унсур нусха намешавад, балки кӯч мебандад
Як унсур наметавонад дар ду ҷойи дарахт бошад. Агар унсури аллакай мавҷударо ба ҷойи дигар ҷойгир кунед, он кӯч мебандад , ва дар ҷойи кӯҳна нопадид мешавад. Нусха лозим аст — 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 + append innerHTML бо сатр Навишта мешавад дарозтар кӯтоҳтар, ба HTML-и воқеӣ монанд Бехатарӣ матн ҳамеша тавассути textContent — бехатар хатарнок, агар дар сатр матни бегона бошад Истинодҳои кӯҳна ба унсурҳо нигоҳ дошта мешаванд ҳангоми += ва аз нав навиштан вайрон мешаванд Кай интихоб кардан додаҳои корбар ва API, вақте ки унсур дар тағйирёбанда лозим аст қолаби статикӣ, ки худатон навиштаед
Дар ин дарс мо бо роҳи бехатар меравем: createElement . Вай каме дарозтар аст, аммо меомӯзонад, ки сохтори саҳифаро чун дарахт бинем — ва маҳз ин баъдтар дар React ба кор меояд.
Хатои маъмул: ҷойгир карданро фаромӯш карданд
Унсурро эҷод кардан — маънои нишон додани онро надорад. Бе append (ё prepend, before, after) вай «дар халта» мемонад. Агар дар саҳифа чизе пайдо нашуд, ва хатоҳо нестанд, — аввал санҷед, ки ҷойгиркунӣ дар ҳақиқат даъват мешавад.
Муфассалтар хонед: learn.javascript.ru — Тағйири ҳуҷҷат · MDN — createElement · MDN — replaceChildren
Амалия: мустаҳкам мекунем
Эҷод мекунем, ҷойгир мекунем, ҷой иваз мекунем, нест мекунем.
ВАЗИФАИ 5.1 Унсури аввал осон
<li>-ро бо матни Самбуса эҷод кунед ва ба рӯйхати #menu ҷойгир кунед. Шумораи кӯдакони рӯйхат ва матни онро баровед.
Менюи холӣ · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
index.html script.js
const menu = document.querySelector ("#menu" );
// li эҷод кунед, матнро диҳед, ба menu ҷойгир кунед
console.log (menu.children.length);
console.log (menu.textContent);
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
const dishes = ["Нон" , "Сомса" , "Чой" ];
const menu = document.querySelector ("#menu" );
// давра аз болои dishes: li эҷод кунед, матн, класси item, ҷойгир кунед
console.log (menu.children.length);
console.log (menu.lastElementChild.textContent);
console.log (menu.firstElementChild.className);
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< ul id ="line" >
< li > Алия</ li >
< li class ="old" > Бахром</ li >
< li > Умар</ li >
</ ul >
const line = document.querySelector ("#line" );
const alia = line.firstElementChild;
function make (text) {
const li = document.createElement ("li" );
li.textContent = text;
return li;
}
// 1) .old-ро нест кунед
// 2) prepend: Зарина
// 3) after: Далер пас аз alia
// 4) append: Нилуфар
console.log (Array.from (line.children, li => li.textContent).join (", " ));
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Зарина, Алия, Далер, Умар, Нилуфар
Ишора 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< ul id ="left" >
< li > Самбуса</ li >
< li > Курутоб</ li >
< li > Шакароб</ li >
</ ul >
< ul id ="right" > </ ul >
const left = document.querySelector ("#left" );
const right = document.querySelector ("#right" );
right.append (left.firstElementChild); // кӯч бастан
console.log (left.children.length, right.children.length);
const clone = left.firstElementChild.cloneNode (true );
// ба матни клон " (копия)"-ро илова кунед
right.append (clone);
console.log (left.children.length, right.children.length);
// матни унсури охирини рӯйхати ростро баровед
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 2 1
2 2
Курутоб (копия)
Ишора 1 append-и аввал «Самбуса»-ро интиқол медиҳад — дар чап 2 мемонад, дар рост 1. Дуюм нусха -ро ҷойгир мекунад — дар чап боз 2, дар рост 2.
Ишора 2 clone.textContent += " (копия)"; пеш аз ҷойгиркунӣ, ва дар охир — console.log(right.lastElementChild.textContent);
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
06 Рендер: аз массив ба кортҳо
Акнун ҳар чизеро, ки медонед, ҳамроҳ мекунем. Дар дарсҳои 6 ва 7 шумо бо массивҳои объектҳо кор кардед — феҳристҳои молҳо, донишҷӯён, фармоишҳо. Акнун ин додаҳоро кашидан мумкин аст. Калимаи рендер (render) маҳз маънои «аз додаҳо он чиро, ки дар экран намоён аст, сохтан»-ро дорад. Тарҳ ҳамеша як аст:
Додаҳо — массиви объектҳо: const products = [{ title: "Нон", price: 4 }, …]. Ин сарчашмаи асосии ҳақиқат аст.
Функсияи-фабрика createCard(product) — як объектро мегирад ва унсури тайёрро бармегардонад .
Функсияи рендер render(items) — контейнерро тоза мекунад ва ба он кортҳоро барои тамоми массив ҷойгир мекунад.
Даъват render(products) — саҳифа кашида шуд. Массивро тағйир додед — боз render-ро даъват кардед.
Монандӣ аз ҳаёт
Оши палав дар тӯй. Дастур ва рӯйхати меҳмонон — ин додаҳо мебошанд. Ошпаз — функсияи-фабрика : дар вуруд биринҷ ва гӯшт, дар хуруҷ як пурсон. Ва пешхизмат — render : аз тамоми рӯйхати меҳмонон мегузарад, пеши ҳар кас пурсон мегузорад. Меҳмони нав омад — дастурро тағйир додан лозим нест, танҳо боз як пурсон аз рӯи ҳамон дастур.
Рендери феҳрист + тугмаи тоза кардан · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
index.html style.css script.js
< button id ="clear" > Очистить</ button >
< div id ="catalog" class ="catalog" > </ div >
.catalog { display : grid; grid-template-columns : repeat(auto-fill, minmax(130px , 1fr )); gap : 10px ; margin-top : 12px ; }
.card { border : 2px solid #ccd3df ; border-radius : 12px ; padding : 10px 12px ; }
.card h3 { margin : 0 0 4px ; font-size : 16px ; }
.price { margin : 0 ; color : #1a7f4e ; font-weight : 700 ; }
.empty { color : #6b7488 ; }
const products = [
{ title: "Самбуса" , price: 5 },
{ title: "Курутоб" , price: 35 },
{ title: "Шакароб" , price: 15 },
{ title: "Чапан" , price: 450 }
];
const catalog = document.querySelector ("#catalog" );
const clearBtn = document.querySelector ("#clear" );
// фабрика: як объект → як унсур
function createCard (product) {
const card = document.createElement ("article" );
card.className = "card" ;
const title = document.createElement ("h3" );
title.textContent = product.title;
const price = document.createElement ("p" );
price.className = "price" ;
price.textContent = `${product.price} сомони` ;
card.append (title, price);
return card;
}
// рендер: тамоми массив → контейнер
function render (items) {
const cards = items.map (createCard); // массиви унсурҳо
catalog.replaceChildren (... cards); // кӯҳнаро бардоштем, навро ҷойгир кардем
}
render (products);
console.log ("карточек:" , catalog.children.length);
// тугмаи «Очистить»: onclick — «вақте пахш кунанд, инро иҷро кун» (муфассал — дар дарси оянда)
clearBtn.onclick = () => catalog.replaceChildren ();
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Иҷро кунед, баъд тугмаи «Очистить»-ро дар 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
const products = [
{ title: "Нон" , price: 4 },
{ title: "Молоко" , price: 12 },
{ title: "Зардолу" , price: 25 },
{ title: "Мёд" , price: 80 }
];
const list = document.querySelector ("#list" );
function createItem (product) {
// li эҷод кунед, матнро диҳед, li-ро баргардонед
}
list.replaceChildren (... products.map (createItem));
console.log (list.children.length);
console.log (list.firstElementChild.textContent);
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
const products = [
{ title: "Нон" , price: 4 },
{ title: "Чапан" , price: 450 },
{ title: "Пиала" , price: 30 }
];
const catalog = document.querySelector ("#catalog" );
function render (items) {
// коди шумо
}
render (products);
console.log (catalog.children.length);
render (products.filter (p => p.price < 50 ));
console.log (catalog.children.length);
render (products.filter (p => p.price > 1000 ));
console.log (catalog.children.length);
console.log (catalog.textContent);
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 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 ↺ Аз нав ▶ Иҷро кардан
index.html style.css script.js
.card { display : inline-block; border : 2px solid #ccd3df ; border-radius : 12px ; padding : 8px 12px ; margin : 4px ; }
.card h3 { margin : 0 ; font-size : 16px ; }
.out { opacity : .45 ; border-style : dashed; }
const products = [
{ title: "Шапка" , price: 60 , inStock: true },
{ title: "Шарф" , price: 45 , inStock: true },
{ title: "Перчатки" , price: 35 , inStock: false },
{ title: "Носки" , price: 15 , inStock: true }
];
const catalog = document.querySelector ("#catalog" );
function createCard ({ title, price, inStock }) {
// коди шумо — card-ро баргардонед
}
catalog.replaceChildren (... products.map (createCard));
console.log (catalog.querySelectorAll (".card" ).length);
console.log (catalog.querySelectorAll (".out" ).length);
console.log (catalog.querySelector (".price" ).textContent);
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
const products = [
{ title: "Нон" , category: "Продукты" },
{ title: "Зардолу" , category: "Продукты" },
{ title: "Пиала" , category: "Кухня" },
{ title: "Чапан" , category: "Сувениры" },
{ title: "Тюбетейка" , category: "Сувениры" }
];
const catalog = document.querySelector ("#catalog" );
// 1) groups = { Продукты: ["Нон", "Зардолу"], Кухня: ["Пиала"], ... } тавассути reduce
// 2) барои ҳар ҷуфти [category, titles] section > h3 + ul > li эҷод кунед
// 3) ҳамаи section-ҳоро ба catalog ҷойгир кунед
const sections = catalog.querySelectorAll ("section" );
console.log (sections.length);
for (const section of sections) {
console.log (section.querySelector ("h3" ).textContent + ": " + section.querySelectorAll ("li" ).length);
}
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 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 = "В корзину"дарунравӣ: ҳама дар дохили article card.append(title, price, btn)
Қолаб аз ЗС + createCard-и шумо · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
index.html style.css script.js
< div id ="catalog" class ="catalog" > </ div >
/* ин CSS — «ҷавоби ЗС»: мо онро намениварем, балки танҳо пайваст мекунем */
.catalog { display : grid; grid-template-columns : repeat(auto-fill, minmax(150px , 1fr )); gap : 12px ; }
.product-card { border : 2px solid #ccd3df ; border-radius : 14px ; padding : 12px ; background : #fff ; }
.product-card__title { margin : 0 0 6px ; font-size : 17px ; }
.product-card__price { margin : 0 0 10px ; color : #1a7f4e ; font-weight : 700 ; }
.product-card__btn { border : 0 ; border-radius : 8px ; padding : 6px 12px ; background : #1c2230 ; color : #fff ; cursor : pointer; }
.product-card--out { opacity : .5 ; border-style : dashed; }
// ва ин JS — қисми шумо
const products = [
{ title: "Самбуса" , price: 5 , inStock: true },
{ title: "Курутоб" , price: 35 , inStock: true },
{ title: "Чайник" , price: 85 , inStock: false }
];
const catalog = document.querySelector ("#catalog" );
function createCard (product) {
const card = document.createElement ("article" );
card.className = "product-card" ;
if (!product.inStock) card.classList.add ("product-card--out" );
const title = document.createElement ("h3" );
title.className = "product-card__title" ;
title.textContent = product.title;
const price = document.createElement ("p" );
price.className = "product-card__price" ;
price.textContent = `${product.price} сомони` ;
const btn = document.createElement ("button" );
btn.className = "product-card__btn" ;
btn.textContent = "В корзину" ;
card.append (title, price, btn);
return card;
}
catalog.replaceChildren (... products.map (createCard));
console.log (catalog.children.length);
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Ҷавоби ЗС-ро месанҷем: феҳристи санҷиш
Оё дар ҷавоб <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 ↺ Аз нав ▶ Иҷро кардан
index.html script.js
< div id ="catalog" class ="catalog" > </ div >
const products = [
{ title: "Чапан" , price: 450 },
{ title: "Тюбетейка" , price: 120 }
];
const catalog = document.querySelector (".catalogue" );
const card = document.createElement ("article" );
card.className = "card" ;
products.forEach (p => {
card.innerHTML = `<h3>${p.title}</h3><p class="price">${p.price}</p>` ;
catalog.append (card);
});
console.log (catalog.children.length);
console.log (catalog.firstElementChild.querySelector ("h3" ).textContent);
console.log (catalog.firstElementChild.querySelector (".price" ).textContent);
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 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 корт аз массив кашида мешавад , ва тугмаи «Очистить» ҳамаи онҳоро мебарорад. Ҳамбандӣ ва услубҳоро мо аз ЗС гирифтем (онҳо аллакай дар қуттиҳои реги зер ҳастанд), мантиқро шумо менависед — қадам ба қадам.
Додаҳо. Массиви 10 объектро эҷод кунед: title, price, category, inStock, rating. Дар ҳаёти воқеӣ чунин додаҳоро аз ЗС хоҳиш кардан мумкин аст (дарси 7) — аммо 2–3 объектро бо чашм санҷидан ба ҳар ҳол лозим аст.
JavaScript
const products = [
{ title: "Самбуса" , price: 5 , category: "Еда" , inStock: true , rating: 4.9 },
// ... боз 9 мол
];
Ёфтани контейнер ва тугма — як бор, дар оғози скрипт.
JavaScript
const catalog = document.querySelector ("#catalog" );
const clearBtn = document.querySelector ("#clear" );
Фабрикаи корт. Функсияи createCard(product): article, h3, p-ро эҷод мекунад, классҳоро аз рӯи BEM ва матнро тавассути textContent танзим мекунад, тавассути append ҷамъ мекунад ва кортро бармегардонад. Барои моли дар мавҷуднабуда — модификатори product-card--out.
Рендер. Функсияи render(items): catalog.replaceChildren(...items.map(createCard)).
Даъват. render(products) — ва ба саҳифа нигоҳ кунед.
Тугмаи тоза кардан. clearBtn.onclick = () => catalog.replaceChildren();
Санҷиш: баровардани шумораи кортҳо ба консол — пеш аз тоза кардан, пас аз он ва пас аз рендери такрорӣ.
Чӣ тавр қадам ба қадам рафтан
Пас аз ҳар қадам ▶ Иҷро -ро пахш кунед ва ба preview нигоҳ кунед. Ҳамаро якбора нанависед: агар дар қадами 3 корт пайдо нашуд, шумо дақиқ медонед, ки дар куҷо ҷустан. Ин ҳамон усул аст, ки дар «Тақсими меҳнат»-и бахши 7: қадамҳои хурд, санҷиш пас аз ҳар кадом.
Амалия: мағозаи «Бозор»
Ду вазифа: аввал саҳифаи пурра, баъд беҳсозиҳо. Дар қуттии реги ҳамбандӣ ва CSS аз ЗС аллакай ҳаст; додаҳо низ тайёранд.
ВАЗИФАИ 8.1 Феҳристи 10 корт ва тугмаи тоза кардан миёна
createCard, render ва тугмаи тоза карданро аз рӯи қадамҳои боло пурра кунед. Коди санҷишӣ дар поён худаш тугмаро бо методи click() «пахш мекунад». Он мебарорад: чанд корт шуд, чандто аз онҳо «нет в наличии» ҳастанд, пас аз тоза кардан чанд ва пас аз рендери такрорӣ чанд.
Мағозаи «Бозор»: феҳрист · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
index.html style.css script.js
< header class ="shop__head" >
< h2 class ="shop__title" > Магазин «Бозор»</ h2 >
< button id ="clear" class ="shop__btn" > Очистить</ button >
</ header >
< div id ="catalog" class ="catalog" > </ div >
/* CSS аз ЗС — тайёр */
.shop__head { display : flex; align-items : center; justify-content : space-between; margin-bottom : 12px ; }
.shop__title { margin : 0 ; font-size : 20px ; }
.shop__btn { border : 2px solid #1c2230 ; background : #fff ; border-radius : 8px ; padding : 6px 12px ; cursor : pointer; font-weight : 700 ; }
.catalog { display : grid; grid-template-columns : repeat(auto-fill, minmax(130px , 1fr )); gap : 10px ; }
.product-card { position : relative; border : 2px solid #ccd3df ; border-radius : 14px ; padding : 10px 12px ; background : #fff ; }
.product-card__title { margin : 0 0 4px ; font-size : 16px ; }
.product-card__price { margin : 0 ; color : #1a7f4e ; font-weight : 700 ; }
.product-card__badge { position : absolute; top : -8px ; right : 8px ; background : #c98a00 ; color : #fff ; font-size : 11px ; padding : 2px 8px ; border-radius : 999px ; }
.product-card--out { opacity : .5 ; border-style : dashed; }
.product-card--hit { border-color : #c98a00 ; }
.shop__stats { color : #6b7488 ; margin : 0 0 12px ; }
const products = [
{ title: "Самбуса" , price: 5 , category: "Еда" , inStock: true , rating: 4.9 },
{ title: "Курутоб" , price: 35 , category: "Еда" , inStock: true , rating: 4.8 },
{ title: "Шакароб" , price: 15 , category: "Еда" , inStock: true , rating: 4.2 },
{ title: "Оши палав" , price: 30 , category: "Еда" , inStock: false , rating: 4.7 },
{ title: "Нон" , price: 4 , category: "Еда" , inStock: true , rating: 4.5 },
{ title: "Чапан" , price: 450 , category: "Одежда" , inStock: true , rating: 4.8 },
{ title: "Тюбетейка" , price: 120 , category: "Одежда" , inStock: true , rating: 4.6 },
{ title: "Пиала" , price: 30 , category: "Кухня" , inStock: true , rating: 4.4 },
{ title: "Чайник" , price: 85 , category: "Кухня" , inStock: false , rating: 4.1 },
{ title: "Шарф" , price: 45 , category: "Одежда" , inStock: true , rating: 4.3 }
];
const catalog = document.querySelector ("#catalog" );
const clearBtn = document.querySelector ("#clear" );
function createCard (product) {
// article.product-card > h3.product-card__title + p.product-card__price
// агар дар мавҷуд нест — класси product-card--out-ро илова кунед
}
function render (items) {
// catalog-ро тоза кунед ва кортҳоро ҷойгир кунед
}
// тугмаи тоза кардан тавассути onclick
// --- санҷиш (нест накунед) ---
render (products);
console.log (catalog.children.length);
console.log (catalog.querySelectorAll (".product-card--out" ).length);
clearBtn.click ();
console.log (catalog.children.length);
render (products);
console.log (catalog.children.length);
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 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 ↺ Аз нав ▶ Иҷро кардан
index.html style.css script.js
< 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 >
.shop__head { display : flex; align-items : center; justify-content : space-between; margin-bottom : 12px ; }
.shop__title { margin : 0 ; font-size : 20px ; }
.shop__btn { border : 2px solid #1c2230 ; background : #fff ; border-radius : 8px ; padding : 6px 12px ; cursor : pointer; font-weight : 700 ; }
.catalog { display : grid; grid-template-columns : repeat(auto-fill, minmax(130px , 1fr )); gap : 12px 10px ; }
.product-card { position : relative; border : 2px solid #ccd3df ; border-radius : 14px ; padding : 10px 12px ; background : #fff ; }
.product-card__title { margin : 0 0 4px ; font-size : 16px ; }
.product-card__price { margin : 0 ; color : #1a7f4e ; font-weight : 700 ; }
.product-card__badge { position : absolute; top : -8px ; right : 8px ; background : #c98a00 ; color : #fff ; font-size : 11px ; padding : 2px 8px ; border-radius : 999px ; }
.product-card--out { opacity : .5 ; border-style : dashed; }
.product-card--hit { border-color : #c98a00 ; }
.shop__stats { color : #6b7488 ; margin : 0 0 12px ; }
const products = [
{ title: "Самбуса" , price: 5 , category: "Еда" , inStock: true , rating: 4.9 },
{ title: "Курутоб" , price: 35 , category: "Еда" , inStock: true , rating: 4.8 },
{ title: "Шакароб" , price: 15 , category: "Еда" , inStock: true , rating: 4.2 },
{ title: "Оши палав" , price: 30 , category: "Еда" , inStock: false , rating: 4.7 },
{ title: "Нон" , price: 4 , category: "Еда" , inStock: true , rating: 4.5 },
{ title: "Чапан" , price: 450 , category: "Одежда" , inStock: true , rating: 4.8 },
{ title: "Тюбетейка" , price: 120 , category: "Одежда" , inStock: true , rating: 4.6 },
{ title: "Пиала" , price: 30 , category: "Кухня" , inStock: true , rating: 4.4 },
{ title: "Чайник" , price: 85 , category: "Кухня" , inStock: false , rating: 4.1 },
{ title: "Шарф" , price: 45 , category: "Одежда" , inStock: true , rating: 4.3 }
];
const catalog = document.querySelector ("#catalog" );
const clearBtn = document.querySelector ("#clear" );
const stats = document.querySelector ("#stats" );
function createCard (product) {
const card = document.createElement ("article" );
card.className = "product-card" ;
if (!product.inStock) card.classList.add ("product-card--out" );
const title = document.createElement ("h3" );
title.className = "product-card__title" ;
title.textContent = product.title;
const price = document.createElement ("p" );
price.className = "product-card__price" ;
price.textContent = `${product.price} сомони` ;
card.append (title, price);
// 1) барои rating >= 4.8: класси product-card--hit ва span.product-card__badge «Хит»
return card;
}
function render (items) {
catalog.replaceChildren (... items.map (createCard));
// 2) stats.textContent = "Хитов: N из M"
}
clearBtn.onclick = () => catalog.replaceChildren ();
render (products);
console.log (catalog.querySelectorAll (".product-card--hit" ).length);
console.log (stats.textContent);
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 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, на innerHTML 1 Коди тоза: номҳои бомаъно, нусхабардории бесарусомон нест, унсурҳои ёфтшуда дар тағйирёбандаҳо 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), шумо — мантиқро. Номҳои классҳо, бехатарии ҷойгиркунӣ ва методҳои ихтироъшударо санҷед. Кодеро, ки шарҳ дода наметавонед, ҷойгир накунед.