Lesson ১০৭ মিনিট পড়া

ডম ম্যানিপুলেশন (DOM Manipulation)

ওয়েবপেইজের ভেতরে ঢুকে যে কোনো কিছু পরিবর্তন করুন — লেখা, স্টাইল, কাঠামো (structure), ইত্যাদি

ডম (DOM) কী? (What Is the DOM?)

যখন কোনো ব্রাউজার একটি এইচটিএমএল (HTML) পেইজ লোড করে, তখন এটি প্রতিটি এলিমেন্ট বা উপাদানের জন্য একটি গাছের মতো (tree-like) কাঠামো বা মডেল তৈরি করে — আর এই মডেলটিকেই ডকুমেন্ট অবজেক্ট মডেল (Document Object Model বা DOM) বলা হয়। এটিকে একটি ফ্যামিলি ট্রি (family tree) বা বংশলতিকার মতো ভাবতে পারেন: <html> এলিমেন্টটি হলো দাদা-দাদি, <body> হলো বাবা-মা, আর ভেতরের <div>, <p>, এবং <button> গুলো হলো তাদের সন্তান এবং নাতি-নাতনি।

জাভাস্ক্রিপ্ট এই গাছের যেকোনো অংশ পড়তে, পরিবর্তন করতে, যোগ করতে বা মুছে ফেলতে পারে। এভাবেই ইন্টারেক্টিভ ওয়েবসাইটগুলো কাজ করে — এইচটিএমএল একই থাকে, তবে জাভাস্ক্রিপ্ট ডম-কে তাৎক্ষণিকভাবে নতুন রূপ দেয়।

এলিমেন্ট নির্বাচন করা বা সিলেক্ট করা (Selecting Elements)

// querySelector — select the FIRST match (CSS selector syntax)
const title = document.querySelector("h1");
const btn = document.querySelector(".submit-btn");
const form = document.querySelector("#signup-form");
// querySelectorAll — select ALL matches (returns a NodeList)
const allCards = document.querySelectorAll(".card");
console.log(allCards.length); // number of .card elements
// Loop through all matches
allCards.forEach(card => {
console.log(card.textContent);
});
// Other selectors (less common now, but still valid)
const byId = document.getElementById("main");
const byClass = document.getElementsByClassName("item");
const byTag = document.getElementsByTagName("p");
Output
// (depends on the HTML page)

কনটেন্ট, স্টাইল এবং অ্যাট্রিবিউট পরিবর্তন করা (Changing Content, Styles & Attributes)

একবার কোনো এলিমেন্ট বেছে নেওয়ার পর, আপনি চাইলে সেটির প্রায় যেকোনো কিছুই পরিবর্তন করতে পারেন:

  • .textContent — ভেতরের সাধারণ লেখা (নিরাপদ, কোনো এইচটিএমএল পার্সিং নেই)
  • .innerHTML — এইচটিএমএল কনটেন্ট (সাবধান — ব্যবহারকারীর ইনপুটের সাথে ব্যবহৃত হলে এটি নিরাপত্তার ঝুঁকি বা সিকিউরিটি ইস্যু তৈরি করতে পারে)
  • .style.property — ইনলাইন (inline) সিএসএস বা CSS স্টাইল পরিবর্তন করা
  • .classList — সিএসএস ক্লাস যোগ, মুছে ফেলা বা টগল (toggle) করা
  • .setAttribute() / .getAttribute()src, href, disabled এর মতো এইচটিএমএল অ্যাট্রিবিউট বা বৈশিষ্ট্যগুলো পরিবর্তন করা

এলিমেন্টে পরিবর্তন আনা (Modifying Elements)

// Changing text and HTML
const heading = document.querySelector("h1");
heading.textContent = "Welcome!";
heading.innerHTML = "Welcome <em>back</em>!"; // parses HTML
// Changing styles
heading.style.color = "tomato";
heading.style.fontSize = "2rem"; // camelCase, not kebab-case!
heading.style.backgroundColor = "#f0f0f0";
// classList — the better way to style
const card = document.querySelector(".card");
card.classList.add("active"); // add a class
card.classList.remove("hidden"); // remove a class
card.classList.toggle("dark-mode"); // add if missing, remove if present
console.log(card.classList.contains("active")); // true
// Attributes
const img = document.querySelector("img");
img.setAttribute("src", "new-photo.jpg");
img.setAttribute("alt", "A cute puppy");
console.log(img.getAttribute("alt")); // "A cute puppy"
Output
// Elements on page are updated visually
true
A cute puppy

এলিমেন্ট তৈরি করা এবং ইভেন্ট সামলানো (Creating Elements & Handling Events)

আপনি চাইলে জাভাস্ক্রিপ্ট ব্যবহার করে সম্পূর্ণ নতুন এইচটিএমএল এলিমেন্ট তৈরি করতে পারেন এবং সেগুলোকে পেইজে যুক্ত করতে পারেন। এভাবেই ডায়নামিক কনটেন্ট কাজ করে — যেমন নতুন কোনো কমেন্ট (comment), টাস্ক লিস্ট বা টু-ডু (todo) আইটেম, অথবা কোনো নোটিফিকেশন যুক্ত করা।

ইভেন্ট লিসেনার (Event listeners) আপনার কোডকে ব্যবহারকারীর বিভিন্ন কাজের প্রতিক্রিয়া জানাতে সাহায্য করে — যেমন ক্লিক করা, কীবোর্ড চাপা, ফর্ম সাবমিট করা, মাউস নাড়ানো ইত্যাদি। আপনি যদি কোনো এলিমেন্টে একটি লিসেনার যুক্ত করেন, তবে সেই ইভেন্টটি ঘটার সাথে সাথেই জাভাস্ক্রিপ্ট আপনার ফাংশনটিকে কল করবে।

ইভেন্ট ডেলিগেশন (Event delegation) একটি চমৎকার কৌশল: প্রতিটি চাইল্ড এলিমেন্টে আলাদা আলাদা লিসেনার যুক্ত না করে, আপনি মূল প্যারেন্ট (parent) এলিমেন্টটিতে মাত্র একটি লিসেনার যুক্ত করতে পারেন এবং চেক করতে পারেন যে কোন চাইল্ডটিতে ক্লিক করা হয়েছে। এটি অনেক বেশি দ্রুতগতির এবং পরবর্তীতে যোগ করা নতুন এলিমেন্টগুলোর জন্যও এটি দারুণ কাজ করে।

এলিমেন্ট এবং ইভেন্ট লিসেনার তৈরি করা

// Creating and adding elements
const list = document.querySelector("#todo-list");
function addTodo(text) {
const li = document.createElement("li");
li.textContent = text;
li.classList.add("todo-item");
list.appendChild(li);
}
addTodo("Learn JavaScript");
addTodo("Build a project");
addTodo("Celebrate!");
// Event listener — react to clicks
const button = document.querySelector("#add-btn");
button.addEventListener("click", () => {
const input = document.querySelector("#todo-input");
if (input.value.trim()) {
addTodo(input.value);
input.value = ""; // clear the input
}
});
// Event delegation — one listener handles all children
list.addEventListener("click", (event) => {
if (event.target.tagName === "LI") {
event.target.classList.toggle("completed");
console.log(`Toggled: ${event.target.textContent}`);
}
});
// Keyboard events
document.addEventListener("keydown", (e) => {
console.log(`Key pressed: ${e.key}`);
if (e.key === "Escape") console.log("Escape pressed!");
});
Output
// (interactive — runs in a browser)
Toggled: Learn JavaScript
Key pressed: Escape
Escape pressed!
Note: ইভেন্ট ডেলিগেশনকে (Event delegation) অনেকটা প্রতিটি অফিসের দরজায় আলাদা রিসেপশনিস্ট বা অভ্যর্থনাকারী না রেখে, পুরো ভবনের জন্য একজন রিসেপশনিস্ট রাখার মতো ভাবতে পারেন। যখন কেউ ভেতরে আসে, রিসেপশনিস্ট চেক করেন যে তার কোন অফিসে যাওয়া দরকার এবং সে অনুযায়ী তাকে পথ বাতলে দেন। প্যারেন্টে একটি মাত্র লিসেনার যোগ করুন, এরপর কোন চাইল্ডে ক্লিক করা হয়েছে তা দেখতে event.target চেক করুন — এটি অনেক দ্রুত কাজ করে, কম মেমরি খরচ করে এবং পরবর্তীতে নতুন যোগ করা এলিমেন্টগুলোর জন্যও নিজে থেকেই কাজ করতে শুরু করে।
চ্যালেঞ্জ

ছোট কুইজ

textContent এবং innerHTML এর মধ্যে পার্থক্য কী?
Array Higher-Order MethodsError Handling