Free tutorials & notes in Hindi & English · Clean code examples 🧰 मुफ़्त PDF और फ़ोटो टूल्स →
🖱️ Days 8–14 – Data, DOM और Events  ·  दिन 12

दिन 12: Elements बनाना और Data से Lists Render

⏱ 95 min📶 Intermediate🎯 100% self-study
दिन 12 / 30

✅ आज आप सीखेंगे

  • createElement, append, prepend, before, after, remove
  • Objects के array से product grid render करना
  • Template literals बनाम createElement बनाम <template>
  • तेज़ batch inserts के लिए DocumentFragment
  • State → render() → UI: वह pattern जिस पर React बना है

🏢 असली दुनिया में

Menu रोज़ बदलता है: नई मिठाइयाँ, sold-out items, price बदलाव। हर सुबह हाथ से HTML बदलना असंभव है। असली websites products को data (database या API से) के रूप में रखती हैं और JavaScript से HTML बनाती हैं। आज आप array से Sharma Sweets का product grid बनाएँगे – कल का API data भी यही तकनीक इस्तेमाल करेगा।

Elements बनाना और डालना

HTML + JavaScript
<ul id="list"><li>Kaju Katli</li></ul>
<button id="add">append</button> <button id="first">prepend</button> <button id="del">remove last</button>

<script>
const list = document.querySelector('#list');

document.querySelector('#add').addEventListener('click', () => {
  const li = document.createElement('li');          // 1. create
  li.textContent = 'Ghewar ' + (list.children.length + 1);   // 2. fill (safe text)
  li.className = 'new';
  list.append(li);                                   // 3. insert at the end
});
document.querySelector('#first').addEventListener('click', () => {
  const li = document.createElement('li');
  li.textContent = '⭐ Today’s special';
  list.prepend(li);                                  // insert at the start
});
document.querySelector('#del').addEventListener('click', () => {
  list.lastElementChild?.remove();                  // remove (?. = only if it exists)
});
</script>
▶  createElement → set content → append/prepend → remove
MethodNode कहाँ जाता है…
parent.append(node, "text")Parent के अंदर अंत में (एक साथ कई)
parent.prepend(node)Parent के अंदर शुरू में
el.before(node) / el.after(node)el के ठीक बाहर, पहले या बाद
el.replaceWith(node)el की जगह
el.remove()el हटाता है
parent.replaceChildren(...nodes)Parent साफ़ करके नए nodes डालता है – re-render के लिए perfect

Data से product grid render करना

HTML + JavaScript
<style>
.grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 12px; }
.card { border: 1px solid #e5e7eb; border-radius: 12px; overflow: hidden; background: #fff; }
.card img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; display: block; }
.card div { padding: 8px 10px; }
.card button { width: 100%; margin-top: 6px; }
.card.out { opacity: .55; }
</style>

<div class="grid" id="grid"></div>

<script>
const products = [
  { id: 1, name: 'Kaju Katli',   price: 900, image: 'images/kaju-katli-400.webp', stock: 25 },
  { id: 2, name: 'Malai Ghewar', price: 650, image: 'images/ghewar-400.webp',     stock: 8 },
  { id: 3, name: 'Rasmalai',     price: 700, image: 'images/rasmalai-400.webp',   stock: 0 },
  { id: 4, name: 'Besan Ladoo',  price: 500, image: 'images/ladoo-400.webp',      stock: 40 },
];

function createCard(p) {
  const card = document.createElement('article');
  card.className = 'card' + (p.stock === 0 ? ' out' : '');
  const img = document.createElement('img');
  img.src = p.image;
  img.alt = p.name;
  img.loading = 'lazy';
  const body = document.createElement('div');
  const title = document.createElement('b');
  title.textContent = p.name;                        // text is always safe
  const price = document.createElement('div');
  price.textContent = `₹${p.price}/kg`;
  const btn = document.createElement('button');
  btn.textContent = p.stock === 0 ? 'Sold out' : 'Add to cart';
  btn.disabled = p.stock === 0;
  btn.dataset.id = p.id;
  body.append(title, price, btn);
  card.append(img, body);
  return card;
}

document.querySelector('#grid').replaceChildren(...products.map(createCard));
</script>
▶  Every card is created from one object – change the data, the page follows

Data से HTML बनाने के तीन तरीक़े

तकनीकफ़ायदेनुक़सान
Template literal + innerHTMLछोटा और पठनीयUser data के साथ XSS ख़तरा; अंदर के listeners मिटते हैं
createElement ⭐सुरक्षित (textContent), सटीकज़्यादा lines
<template> + cloneNodeHTML, HTML में रहता है, सुरक्षित भरनाPage में template चाहिए
Frameworks (React, Vue)अपने-आप कुशल updatesVanilla JS के बाद सीखें
HTML + JavaScript
<template id="row">
  <tr><td class="name"></td><td class="qty"></td><td class="amount"></td></tr>
</template>
<table border="1" cellpadding="6" style="border-collapse:collapse">
  <thead><tr><th>Item</th><th>Qty</th><th>Amount</th></tr></thead>
  <tbody id="body"></tbody>
</table>

<script>
const lines = [
  { name: 'Kaju Katli', qty: 2, price: 900 },
  { name: 'Rasmalai', qty: 1, price: 700 },
];
const tpl = document.querySelector('#row');
const fragment = document.createDocumentFragment();     // build off-screen
for (const line of lines) {
  const row = tpl.content.cloneNode(true);
  row.querySelector('.name').textContent = line.name;
  row.querySelector('.qty').textContent = line.qty + ' kg';
  row.querySelector('.amount').textContent = '₹' + line.qty * line.price;
  fragment.append(row);
}
document.querySelector('#body').append(fragment);        // ONE insert into the page
</script>
▶  &lt;template&gt; + DocumentFragment: HTML in HTML, one DOM update

State → render() → UI

State: data (products का array, cart)Event: user “Add” पर clickState update करें (DOM सीधे नहीं)render(state) बुलाएँState से UI दोबारा – हमेशा एक-सा
एक दिशा, कोई उलझन नहीं
HTML + JavaScript
<style>
.grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 12px; }
.card { border: 1px solid #e5e7eb; border-radius: 12px; overflow: hidden; background: #fff; }
.card img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; display: block; }
.card div { padding: 8px 10px; }
.card button { width: 100%; margin-top: 6px; }
.card.out { opacity: .55; }
</style>

<div class="grid" id="grid"></div>
<p id="cart"><b>Cart:</b> empty</p>

<script>
const products = [
  { id: 1, name: 'Kaju Katli',   price: 900, image: 'images/kaju-katli-400.webp', stock: 25 },
  { id: 2, name: 'Malai Ghewar', price: 650, image: 'images/ghewar-400.webp',     stock: 8 },
  { id: 3, name: 'Rasmalai',     price: 700, image: 'images/rasmalai-400.webp',   stock: 0 },
  { id: 4, name: 'Besan Ladoo',  price: 500, image: 'images/ladoo-400.webp',      stock: 40 },
];
const state = { cart: {} };                                // id → qty

function render() {
  const grid = document.querySelector('#grid');
  grid.innerHTML = '';
  for (const p of products) {
    const qty = state.cart[p.id] || 0;
    const card = document.createElement('article');
    card.className = 'card' + (p.stock === 0 ? ' out' : '');
    card.innerHTML = `<img src="${p.image}" alt=""><div><b></b><div>₹${p.price}/kg</div>
      <button data-id="${p.id}" ${p.stock === 0 ? 'disabled' : ''}>${qty ? 'Add more (' + qty + ')' : 'Add to cart'}</button></div>`;
    card.querySelector('b').textContent = p.name;
    grid.append(card);
  }
  const lines = products.filter(p => state.cart[p.id]).map(p => `${p.name} × ${state.cart[p.id]}`);
  const total = products.reduce((s, p) => s + (state.cart[p.id] || 0) * p.price, 0);
  document.querySelector('#cart').innerHTML = '<b>Cart:</b> ' + (lines.length ? lines.join(', ') + ` = ₹${total}` : 'empty');
}

document.querySelector('#grid').addEventListener('click', e => {      // delegation (Day 11)
  const btn = e.target.closest('button[data-id]');
  if (!btn) return;
  const id = Number(btn.dataset.id);
  state.cart[id] = (state.cart[id] || 0) + 1;                       // 1. update state
  render();                                                          // 2. re-render
});
render();
</script>
▶  A tiny cart: state object + render() + delegation
💡 React ऐसे ही सोचता है

React में आप setCart(...) लिखते हैं और React आपका component (render) ख़ुद बुलाकर सिर्फ़ बदला हुआ हिस्सा update करता है। यह vanilla version समझने से React स्वाभाविक लगता है।

🏅 आज के Job Skills

✔ Elements बनाना, डालना और हटाना✔ Objects के arrays से lists और grids render✔ <template> और DocumentFragment इस्तेमाल करना✔ UI code को state → render() के रूप में

Practice tasks

🏋️ Practice – ख़ुद करें

Task 1: Notices {title, date, important} के array से notice board render करें; important पर लाल “Important” badge, नए पहले।
Solution देखें
▶  Result
Task 2: ऊपर के mini cart की हर cart line में “Remove” button जोड़ें (state update, फिर render)।
Task 3: <template> से array की student result table render करें और <tfoot> में class average दिखाएँ।

Quick quiz

🧠 Quick Quiz – ख़ुद को जाँचें

1. document.createElement("li") …
दिखाने को append करें।
2. एक call में container साफ़ करके नए nodes डालें:
आधुनिक और सुरक्षित।
3. DocumentFragment क्यों?
कम reflows।
4. <template> का content…
content.cloneNode(true) लें।
5. state → render pattern में click को…
एक सत्य स्रोत।

Interview corner

💼 Interview Corner

DOM में 1,000 items कुशलता से कैसे जोड़ें?

DocumentFragment में बनाएँ (या escaped data वाली एक HTML string) और एक बार डालें, loop में layout properties न पढ़ें, और बहुत लंबी lists के लिए virtualisation (सिर्फ़ दिखती rows render) सोचें।

Frameworks manual DOM edits की जगह render function क्यों लेते हैं?

State से UI एक जगह बनाना उसे एक-सा और अनुमानित रखता है; framework नतीजे का diff करके न्यूनतम DOM बदलाव करता है, जिससे page के कुछ हिस्सों के update भूलने वाले bugs नहीं होते।

सारांश

  • createElement → textContent से भरें → append/prepend; हटाने को remove()।
  • map/forEach और replaceChildren से arrays की lists render।
  • साफ़, तेज़ batches के लिए <template> + DocumentFragment।
  • State → render() → UI; events state बदलते हैं, DOM सीधे नहीं।
➡️ आगे

Day 13: forms – FormData से values पढ़ें, professional की तरह validate करें और उपयोगी error messages दिखाएँ।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

क्या पूरी list दोबारा render करना धीमा है?
दसियों या सैकड़ों items के लिए तुरंत। हज़ारों के लिए सिर्फ़ बदली rows update करें या framework लें।
Cart demo में innerHTML के बाद name textContent से क्यों?
ढाँचा हमारा भरोसेमंद HTML है; product name database से आ सकता है, इसलिए सुरक्षित रहने को text के रूप में डाला।
← JavaScript (30 Days)
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

अगला topicदिन 13: Forms, FormData और Validation आपकी प्रगति: 12 / 30 (40%) · Lesson 13 / 30 आगे बढ़ें →

यह lesson कैसा लगा?

आपकी राय से हम content और बेहतर बनाते हैं।

अपना review और सुझाव लिखें (वैकल्पिक)

Review approve होने के बाद आपका नाम और शहर इसके साथ public दिख सकते हैं। Email या phone न लिखें।

▶ CodingEasily on YouTube

Video से सीखें – आसान Hindi में

चुनी हुई video: RDBMS भाग 3 – Class XI Commerce IT

▶ Channel subscribe करें