Module ā§§ā§Ē ¡ DOM āĻāϰ event: JavaScript āĻĒāĻžāϤāĻžāĻāĻž āĻā§āĻāϝāĻŧā§ āĻĻā§āĻā§
DOM-āĻāϰ āĻāĻŦāĻŋ: āĻĒāĻžāϤāĻžāĻāĻž āĻāĻāĻāĻž tree, āϝā§āĻāĻž āϤā§āĻŽāĻžāϰ code āĻŦāĻĻāϞāĻžāϤ⧠āĻĒāĻžāϰā§
āĻāĻ lesson-āĻ āϝāĻž āĻļāĻŋāĻāĻŦā§
- DOM āĻā§, āĻŦā§āĻāĻŋāϝāĻŧā§ āĻŦāϞā§: HTML āĻĨā§āĻā§ browser āϝ⧠object-āĻāϰ tree āĻŦāĻžāύāĻžāϝāĻŧ, āĻāϰ āĻĒāϰā§āĻĻāĻžāϝāĻŧ āϝā§āĻāĻž āĻāĻāĻā§āĨ¤
querySelectorāĻĻāĻŋāϝāĻŧā§ āĻāĻāĻāĻž element āĻā§āĻāĻā§ āĻŦā§āϰ āĻāϰā§, āĻāϰtextContentāĻĻāĻŋāϝāĻŧā§ āĻāϰ āϞā§āĻāĻž āĻŦāĻĻāϞāĻžāĻāĨ¤addEventListenerāĻĻāĻŋāϝāĻŧā§ āĻĒāĻžāϤāĻžāĻā§ āĻāĻāĻāĻž click-āĻāϰ āĻāĻŦāĻžāĻŦ āĻĻā§āĻāϝāĻŧāĻžāĻ, āĻāϰ āĻŦāϞ⧠script āĻā§āύ markup-āĻāϰ āĻĒāϰ⧠āĻŦāϏā§āĨ¤
Mitu phone-āĻ āĻāĻāĻāĻž āϰāĻžāύā§āύāĻžāϰ recipe āĻĒāĻĄāĻŧāĻā§, āύāĻŋāĻā§āϰ heart-āĻāĻžāϝāĻŧ āĻāĻžāĻĒ āĻĻāĻŋāϞāĨ¤ Heart-āĻāϰ āĻĒāĻžāĻļā§āϰ āϏāĻāĻā§āϝāĻžāĻāĻž āϏāĻžāĻĨā§ āϏāĻžāĻĨā§ 12 āĻĨā§āĻā§ 13 āĻšāϝāĻŧā§ āĻā§āϞāĨ¤ āĻĒāĻžāϤāĻž reload āĻšāϝāĻŧāύāĻŋ, server āĻĨā§āĻā§ āύāϤā§āύ āĻā§āύ⧠āĻĒāĻžāϤāĻžāĻ āĻāϏā§āύāĻŋāĨ¤ āĻā§āϞāĻž āĻĒāĻžāϤāĻžāϰ āĻā§āϤāϰā§āĻ āĻāĻŋāĻā§ āĻāĻāĻāĻž āĻāĻāĻāĻž āϏāĻāĻā§āϝāĻž āĻŦāĻĻāϞ⧠āĻĻāĻŋāϝāĻŧā§āĻā§āĨ¤
āϏā§āĻ āĻāĻŋāĻā§ āĻāĻāĻāĻž āĻšāϞ⧠JavaScriptāĨ¤ āĻĒāĻžāϤāĻž load āĻšāĻāϝāĻŧāĻžāϰ āϏāĻŽāϝāĻŧ browser āĻāϰ HTML āĻāĻāĻŦāĻžāϰ āĻĒāĻĄāĻŧā§āĻā§āĨ¤ āϤāĻžāϰāĻĒāϰ āĻāĻ HTML āĻĨā§āĻā§ object-āĻāϰ āĻāĻāĻāĻž tree āĻŦāĻžāύāĻŋāϝāĻŧā§āĻā§, āĻāϰ āĻĒāϰā§āĻĻāĻž āĻāĻāĻā§ āϏā§āĻ tree āĻĻā§āĻā§āĨ¤ Script tree-āϰ āĻā§āϤāϰ⧠āĻšāĻžāϤ āĻĻāĻŋāϝāĻŧā§ āĻāĻāĻāĻž node āĻŦāĻĻāϞāĻžāϤ⧠āĻĒāĻžāϰā§āĨ¤ Browser āĻŦāĻĻāϞāĻāĻž āĻā§āϰ āĻĒāĻžāϝāĻŧ, āĻāϰ āĻĒāϰā§āĻĻāĻž āĻāĻŦāĻžāϰ āĻāĻāĻā§āĨ¤ āĻāĻ tree-āĻāĻžāĻ DOM, āĻŽāĻžāύ⧠Document Object ModelāĨ¤
āĻāϤāĻĻāĻŋāύ āĻāĻ track-āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻž program āĻāϞā§āĻā§ Node-āĻ, āĻā§āύ⧠āĻĒāĻžāϤāĻž āĻŦāĻž āĻĒāϰā§āĻĻāĻž āĻāĻžāĻĄāĻŧāĻžāĨ¤ āĻāĻ module āĻĸā§āĻāĻā§ browser-āĻāĨ¤ āĻāĻāĻžāύāĻāĻžāϰ āĻĒā§āϰāϤāĻŋāĻāĻž āĻĒāĻžāϤāĻžāϰ program āĻāϞ⧠lesson-āĻāϰ āĻĒāĻžāĻļā§āϰ preview-āϤā§: Run āĻāĻžāĻĒā§, āĻĒāĻžāϤāĻžāĻāĻž āĻā§āϞāĻŦā§ āĻāĻāĻāĻž āĻā§āĻ sandbox āĻāϰāĻž frame-āĻ, āĻāϰ āĻāϰ console āĻĻā§āĻāĻž āϝāĻžāĻŦā§ āĻ āĻŋāĻ āύāĻŋāĻā§āĨ¤ Judge āĻāϰāĻž problem-āĻā§āϞ⧠āĻāĻāύ⧠āĻāϞ⧠Node-āĻ, āϤāĻžāĻ āĻāϰāĻž āĻāĻāĻ āϰāĻāĻŽ tree āύāĻŋāϝāĻŧā§ āĻāĻžāĻ āĻāϰā§, āϏāĻžāϧāĻžāϰāĻŖ object āĻšāĻŋāϏā§āĻŦā§ āϞā§āĻāĻžāĨ¤
āĻĒāĻžāϤāĻžāĻāĻž āĻāĻāĻāĻž tree
HTML āĻšāϞ⧠textāĨ¤ āĻāĻ āϝ⧠āϤāĻžāϰ āĻāĻāĻāĻž āĻā§āĻ āĻā§āĻāϰā§, āĻāĻāĻāĻž āĻŦāĻžāĻāĻžāϰā§āϰ list:
<ul id="list">
<li>rice</li>
<li>dal</li>
</ul>
Browser āĻāĻ text āĻĒāĻĄāĻŧāĻžāϰ āĻĒāϰ⧠āĻāĻāĻžāĻā§ text āĻšāĻŋāϏā§āĻŦā§ āϰā§āĻā§ āĻĻā§āϝāĻŧ āύāĻžāĨ¤ āĻ object āĻŦāĻžāύāĻžāϝāĻŧāĨ¤ ul āĻšāϝāĻŧ āĻāĻāĻāĻž element objectāĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻž li-āĻ āĻāĻāĻāĻž element object, āĻāϰ āĻāϰāĻž ul-āĻāϰ childāĨ¤ āĻā§āϤāϰā§āϰ āĻļāĻŦā§āĻĻāĻā§āϞā§, rice āĻāϰ dal, āĻšāϝāĻŧ text node, āύāĻŋāĻā§āϰ āύāĻŋāĻā§āϰ li-āĻāϰ childāĨ¤ āϏāĻŦāĻžāϰ āĻāĻĒāϰā§āϰāĻāĻž āĻāĻžāĻĄāĻŧāĻž āĻĒā§āϰāϤāĻŋāĻāĻž node-āĻāϰ āĻ āĻŋāĻ āĻāĻāĻāύ parent āĻĨāĻžāĻā§āĨ¤
āĻĒā§āϰ⧠tree-āϰ āĻŽāĻžāĻĨāĻžāϝāĻŧ āĻĨāĻžāĻā§ documentāĨ¤ āĻāϰ āύāĻŋāĻā§ html element, āĻāϰ āϤāĻžāϰ āύāĻŋāĻā§ head āĻāϰ bodyāĨ¤ āĻĒāĻžāϤāĻžāϝāĻŧ āϝāĻž āĻāĻŋāĻā§ āĻĻā§āĻā§, āϏāĻŦ āĻĨāĻžāĻā§ body-āϰ āύāĻŋāĻā§ āĻā§āĻĨāĻžāĻ āύāĻž āĻā§āĻĨāĻžāĻāĨ¤
āĻāĻŽāύ āĻāĻāĻāĻž tree āϏāĻžāϧāĻžāϰāĻŖ JavaScript object āĻĻāĻŋāϝāĻŧā§ āϏāĻšāĻā§āĻ āϞā§āĻāĻž āϝāĻžāϝāĻŧāĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻž node āĻāĻāĻāĻž object, āϝāĻžāϰ āĻāĻāĻāĻž tag āĻāϰ child-āĻĻā§āϰ āĻāĻāĻāĻž list āĻāĻā§āĨ¤ āύāĻŋāĻā§āϰ program Node-āĻ āĻāϞā§, browser āĻāĻžāĻĄāĻŧāĻžāĻāĨ¤ āĻ tree-āĻāĻž print āĻāϰā§, āĻĒā§āϰāϤāĻŋāĻāĻž child āϤāĻžāϰ parent-āĻāϰ āύāĻŋāĻā§ āĻāĻāĻā§ āϏāϰ⧠āĻŦāϏā§, āĻ āĻŋāĻ āϝā§āĻāĻžāĻŦā§ DevTools-āĻāϰ Elements pane āĻāĻāĻāĻž āĻĒāĻžāϤāĻž āĻĻā§āĻāĻžāϝāĻŧāĨ¤
const page = {
tag: "body",
children: [
{ tag: "h1", children: [{ text: "Bazar list" }] },
{
tag: "ul",
children: [
{ tag: "li", children: [{ text: "rice" }] },
{ tag: "li", children: [{ text: "dal" }] },
],
},
],
};
function show(node, depth) {
const pad = " ".repeat(depth);
if (node.text !== undefined) {
console.log(pad + '"' + node.text + '"');
return;
}
console.log(pad + "<" + node.tag + ">");
for (const child of node.children) show(child, depth + 1);
}
show(page, 0);
<body>
<h1>
"Bazar list"
<ul>
<li>
"rice"
<li>
"dal"
āĻāϏāϞ DOM-āĻāϰ āĻāĻāĻžāϰāĻ āĻāĻāĻžāĻ, āĻļā§āϧ⧠āĻĒā§āϰāϤāĻŋāĻāĻž node-āĻ āĻāϰāĻ āĻ āύā§āĻ āĻāĻŋāĻā§ āĻĨāĻžāĻā§āĨ¤ Browser-āĻāϰ āĻāĻāĻāĻž element-āĻ āĻĨāĻžāĻā§ āĻāϰ tag, attribute, child, parent, style, āĻāϰ āĻļāϤ āĻļāϤ methodāĨ¤ āĻāĻŋāύā§āϤ⧠āĻŽā§āϞ āĻāĻĨāĻž āĻāĻ program-āĻāϰāĻāĻžāĻ: node, āϤāĻžāĻĻā§āϰ child, āĻāϰ āĻĒā§āϰāϤā§āϝā§āĻā§āϰ āĻāĻāĻāύ parentāĨ¤
Tree-āϤ⧠āύāϤā§āύ āĻāĻāĻāĻž node āĻā§āĻĄāĻŧāĻž
āĻĒāĻžāϤāĻž āĻŦāĻĻāϞāĻžāύ⧠āĻŽāĻžāύ⧠tree āĻŦāĻĻāϞāĻžāύā§āĨ¤ List-āĻ āϤā§āϤā§āϝāĻŧ āĻāĻāĻāĻž item āĻĻāĻŋāϤ⧠script āĻāĻāĻāĻž āύāϤā§āύ li object āĻŦāĻžāύāĻžāϝāĻŧ, āĻāϰ āĻāĻāĻžāĻā§ ul-āĻāϰ āύāĻŋāĻā§ āĻā§āĻĄāĻŧā§ āĻĻā§āϝāĻŧāĨ¤ Insert āĻŽāĻžāύ⧠āĻāĻā§āĻā§āĻ: parent āĻāĻāĻāĻž child āĻŦā§āĻļāĻŋ āĻĒāĻžāϝāĻŧ, āĻāϰ child āĻā§āύ⧠āύā§āϝāĻŧ āĻā§ āĻāϰ parentāĨ¤
āύāĻŋāĻā§ āϧāĻžāĻĒā§ āϧāĻžāĻĒā§ āĻĻā§āĻā§, list-āĻāϰ āϏāĻžāϧāĻžāϰāĻŖ object version-āĻāĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻž box āĻāĻāĻāĻž object, āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻž āϤā§āϰ āĻāĻ object āĻĨā§āĻā§ āĻāϰā§āĻ object-āĻāϰ āĻĻāĻŋāĻā§ āĻāĻāĻāĻž referenceāĨ¤ children array āύāĻŋāĻā§āĻ āĻāĻāĻāĻž āĻāϞāĻžāĻĻāĻž boxāĨ¤
āĻŽāύ⧠āϰāĻžāĻāĻžāϰ āϧāĻžāĻĒāĻāĻž āϧāĻžāĻĒ 3āĨ¤ āĻāĻāĻāĻž node tree-āϤ⧠āĻāĻā§ āĻā§āĻŦāϞ āϤāĻāύāĻ, āϝāĻāύ āĻāϰ parent āĻāĻā§ child āĻšāĻŋāϏā§āĻŦā§ list-āĻ āϰāĻžāĻā§āĨ¤ Object āĻŦāĻžāύāĻžāϞā§āĻ āĻšāϝāĻŧ āύāĻžāĨ¤ Browser-āĻ append āϤā§āĻŽāĻžāϰ āĻšāϝāĻŧā§ āĻĻā§āĻā§ āĻ
āĻāĻļāĻ āĻāϰ⧠āĻĻā§āϝāĻŧ, āĻāϰ remove āĻĻā§āĻā§āĻ āĻāϞā§āĻā§ āĻĻā§āϝāĻŧāĨ¤
Element āĻā§āĻāĻā§ āĻŦā§āϰ āĻāϰāĻž: querySelector
āĻāĻāĻāĻž node āĻŦāĻĻāϞāĻžāϤ⧠āĻšāϞ⧠script-āĻāϰ āĻāĻā§ āĻāϰ āĻāĻāĻāĻž reference āϞāĻžāĻā§āĨ¤ āϏāĻŦāĻā§āϝāĻŧā§ āĻāĻžāĻā§āϰ āĻā§āĻāĻāĻžāϰ āĻāĻĒāĻžāϝāĻŧ āĻšāϞ⧠document.querySelectorāĨ¤ āĻāĻā§ āĻāĻāĻāĻž CSS selector āĻĻāĻžāĻ, stylesheet āϝ⧠text āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻ āĻŋāĻ āϏā§āĻāĻž, āĻāϰ āĻ āĻĢā§āϰāϤ āĻĻā§āĻŦā§ āĻŽā§āϞ⧠āĻāĻŽāύ āĻĒā§āϰāĻĨāĻŽ element-āĻāĻž, āĻāĻŋāĻā§ āύāĻž āĻŽāĻŋāϞāϞ⧠nullāĨ¤
"h1"āĻā§āĻāĻā§ āĻĒā§āϰāĻĨāĻŽh1āĨ¤"#list"āĻā§āĻāĻā§ āϏā§āĻ element, āϝāĻžāϰidāĻšāϞā§listāĨ¤".price"āĻā§āĻāĻā§priceclass-āĻāϝāĻŧāĻžāϞāĻž āĻĒā§āϰāĻĨāĻŽ elementāĨ¤"#list li"āĻā§āĻāĻā§#list-āĻāϰ āĻā§āϤāϰā§āϰ āĻĒā§āϰāĻĨāĻŽliāĨ¤
Selector āĻšāϞ⧠tree-āĻā§ āĻāϰāĻž āĻāĻāĻāĻž āĻĒā§āϰāĻļā§āύ, āĻāϰ querySelector āĻāϤā§āϤāϰ āĻĻāĻŋāϤ⧠tree-āϰ āĻā§āϤāϰ āĻĻāĻŋāϝāĻŧā§ āĻšāĻžāĻāĻā§āĨ¤ āϝ⧠āϏāĻŦ āĻŽāĻŋāϞ āĻĢā§āϰāϤ āĻĻā§āϝāĻŧ, āϏā§āĻ querySelectorAll āĻāĻā§ Lesson 02-āĻāĨ¤
āϞā§āĻāĻžāĻāĻž āĻŦāĻĻāϞāĻžāύā§: textContent
āĻĒā§āϰāϤāĻŋāĻāĻž element-āĻāϰ āĻāĻāĻāĻž textContent property āĻāĻā§āĨ¤ āĻĒāĻĄāĻŧāϞ⧠āĻĒāĻžāĻāϝāĻŧāĻž āϝāĻžāϝāĻŧ element-āĻāϰ āĻā§āϤāϰā§āϰ āϏāĻŦ āϞā§āĻāĻžāĨ¤ āϞāĻŋāĻāϞ⧠āĻā§āϤāϰā§āϰ āϏāĻŦāĻāĻŋāĻā§ āϏāϰ⧠āĻāĻŋāϝāĻŧā§ āĻŦāϏ⧠āĻāĻāĻāĻž text node, āϤā§āĻŽāĻžāϰ string āύāĻŋāϝāĻŧā§āĨ¤ āύāĻŋāĻā§āϰ āĻĒāĻžāϤāĻž heading āĻāϰ āĻĒā§āϰāĻĨāĻŽ item āĻā§āĻāĻā§ āύā§āϝāĻŧ, āϤāĻžāϰāĻĒāϰ āĻĻā§āĻā§āĻ āĻŦāĻĻāϞāĻžāϝāĻŧāĨ¤ Run āĻāĻžāĻĒā§āĨ¤
<h1>Bazar list</h1>
<ul id="list">
<li>rice</li>
<li>dal</li>
</ul>
<p id="note"></p>
<script>
const title = document.querySelector("h1");
const first = document.querySelector("#list li");
console.log("before:", first.textContent);
title.textContent = "Bazar list for Friday";
first.textContent = "basmati rice";
document.querySelector("#note").textContent = "2 items, edited by the script";
</script>
Run in Compiler
āĻĒāĻžāϤāĻžāϝāĻŧ āĻĻā§āĻāĻž āϝāĻžāϝāĻŧ āύāϤā§āύ heading, āĻāϰ āĻĒā§āϰāĻĨāĻŽ item āĻšāĻŋāϏā§āĻŦā§ "basmati rice"āĨ¤ āĻĒāĻžāϤāĻžāϰ āύāĻŋāĻā§āϰ console āĻĻā§āĻāĻžāϝāĻŧ āĻĒā§āϰā§āύ⧠āϞā§āĻāĻž, rice, āĻāĻžāϰāĻŖ script āĻāĻāĻž āĻŦāĻĻāϞāĻžāύā§āϰ āĻāĻā§ āĻĒāĻĄāĻŧā§āĻāĻŋāϞāĨ¤ āĻāĻĒāϰā§āϰ box-āĻāϰ HTML āĻāĻŋāύā§āϤ⧠āĻāĻāĻā§āĻ āĻŦāĻĻāϞāĻžāϝāĻŧāύāĻŋāĨ¤ āĻŦāĻĻāϞā§āĻā§ āĻļā§āϧ⧠tree, āĻāϰ āĻĒāϰā§āĻĻāĻž āĻāϞ⧠tree-āϰ āĻĒā§āĻāύ āĻĒā§āĻāύāĨ¤
āĻļā§āύāĻž: addEventListener
āϝ⧠āĻĒāĻžāϤāĻž āύāĻŋāĻā§āĻā§ āĻāĻāĻŦāĻžāϰ āĻŦāĻĻāϞā§āĻ āĻĨā§āĻŽā§ āϝāĻžāϝāĻŧ, āϏā§āĻāĻž āĻā§āĻŦ āĻāĻāĻāĻž āĻāĻžāĻā§āϰ āύāĻžāĨ¤ āĻŽāĻāĻžāϰ āĻ
āĻāĻļ āĻšāϞ⧠āĻĒāĻžāĻ āĻā§āϰ āĻāĻŦāĻžāĻŦ āĻĻā§āĻāϝāĻŧāĻžāĨ¤ āĻĒāĻžāĻ āĻ click āĻāϰāϞā§, āϞāĻŋāĻāϞ⧠āĻŦāĻž āĻā§āύ⧠key āĻāĻžāĻĒāϞ⧠browser āĻāĻāĻāĻž event āϤā§āϰāĻŋ āĻāϰā§āĨ¤ Script addEventListener āĻĻāĻŋāϝāĻŧā§ āĻŦāϞ⧠āϰāĻžāĻāϤ⧠āĻĒāĻžāϰā§, āĻāĻāĻāĻž element-āĻāϰ event āĻšāϞ⧠āĻāĻā§ āϝā§āύ āĻāĻžāύāĻžāύ⧠āĻšāϝāĻŧāĨ¤
button.addEventListener("click", handler) āĻŽāĻžāύā§: āĻāĻ button-āĻ āϝāϤāĻŦāĻžāϰ click āĻĒāĻĄāĻŧāĻŦā§, handler-āĻā§ āĻĄāĻžāĻā§āĨ¤ Handler āĻāĻāĻāĻž āϏāĻžāϧāĻžāϰāĻŖ function, āĻāĻāĻāĻž callback, āĻšā§āĻŦāĻšā§ Module 12-āĻāϰ callback-āĻā§āϞā§āϰ āĻŽāϤā§āĨ¤ Browser āĻāĻā§ āĻĄāĻžāĻā§ āĻĒāϰā§, āĻĒā§āϰāϤāĻŋāĻāĻž click-āĻ āĻāĻāĻŦāĻžāϰ, event loop-āĻāϰ āĻā§āύ⧠āĻāĻ āĻĒāĻžāϞāĻžāϝāĻŧāĨ¤
<p>Likes: <span id="likes">12</span></p>
<button id="heart">Like</button>
<script>
const likes = document.querySelector("#likes");
const heart = document.querySelector("#heart");
let count = 12;
heart.addEventListener("click", () => {
count = count + 1;
likes.textContent = String(count);
console.log("clicked, likes are now", count);
});
console.log("listener added");
</script>
Run in Compiler
āĻāĻžāϞāĻžāĻ, āĻāϰ button-āĻāĻžāϝāĻŧ āĻāϝāĻŧā§āĻāĻŦāĻžāϰ click āĻāϰā§āĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻž click-āĻ āϏāĻāĻā§āϝāĻž āĻāĻ āĻāϰ⧠āĻŦāĻžāĻĄāĻŧā§, āĻāϰ console āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻāĻāĻāĻž āϞāĻžāĻāύ print āĻāϰā§āĨ¤ āĻā§āϝāĻŧāĻžāϞ āĻāϰ⧠"listener added" print āĻšāϝāĻŧā§āĻā§ āϏāĻŦāĻžāϰ āĻāĻā§, āĻā§āύ⧠click-āĻāϰ āĻāĻā§āĻāĨ¤ Listener āϝā§āĻ āĻāϰāϞ⧠āĻāĻāĻž āĻāϞ⧠āύāĻžāĨ¤ āĻļā§āϧ⧠function-āĻāĻž button-āĻāϰ āĻāĻžāĻā§ āϰā§āĻā§ āĻĻā§āĻāϝāĻŧāĻž āĻšāϝāĻŧ, click āĻāϏāĻž āĻĒāϰā§āϝāύā§āϤāĨ¤
āĻāϰāĻ āĻā§āϝāĻŧāĻžāϞ āĻāϰ⧠count āĻā§āĻĨāĻžāϝāĻŧ āĻĨāĻžāĻā§: āĻāĻāĻāĻž variable-āĻ, countāĨ¤ āĻĒāĻžāϤāĻž count āĻĻā§āĻāĻžāϝāĻŧ āĻ āĻŋāĻāĻ, āĻāĻŋāύā§āϤ⧠script āĻĒāĻžāϤāĻž āĻĨā§āĻā§ āĻāĻāĻž āĻāĻŦāĻžāϰ āĻĒāĻĄāĻŧā§ āύā§āϝāĻŧ āύāĻžāĨ¤ āĻāĻ āĻ
āĻā§āϝāĻžāϏ āĻā§āύ āĻāϰā§āϰāĻŋ, Lesson 04 āĻŦāϞāĻŦā§āĨ¤
Click-āĻāϰ āϝāĻžāϤā§āϰāĻž: bubbling
Button-āĻ āĻāĻāĻāĻž click āĻŽāĻžāύ⧠āĻāϰ āĻāĻžāϰāĻĒāĻžāĻļā§āϰ āϏāĻŦāĻāĻŋāĻā§āϤā§āĻ click: āϝ⧠p āĻŦāĻž div-āĻ āĻ āĻŦāϏ⧠āĻāĻā§, body, āĻĒā§āϰ⧠documentāĨ¤ Browser āĻāĻāĻž āϏāĻžāĻŽāϞāĻžāϝāĻŧ event-āĻā§ bubble āĻāϰāϤ⧠āĻĻāĻŋāϝāĻŧā§āĨ¤ āĻāĻā§ āĻāϞ⧠click āĻĒāĻĄāĻŧāĻž element-āĻāϰ listener, āϤāĻžāϰāĻĒāϰ āĻāϰ parent-āĻāϰ, āϤāĻžāϰāĻĒāϰ parent-āĻāϰ parent-āĻāϰ, āĻāĻāĻĻāĻŽ āĻāĻĒāϰ āĻĒāϰā§āϝāύā§āϤāĨ¤
āϝ⧠element-āĻ āϏāϤā§āϝāĻŋāĻ click āĻĒāĻĄāĻŧā§āĻā§, āϏā§āĻāĻž āĻšāϞ⧠event-āĻāϰ targetāĨ¤ āύāĻŋāĻā§ āĻāĻāĻāĻž click-āĻāϰ āĻĒāĻĨ āĻŦā§āϰ āĻāϰāĻž āĻšāϞ⧠Node-āĻ, āϏāĻžāϧāĻžāϰāĻŖ object-āĻāϰ āĻāĻāĻāĻž tree-āϤā§āĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻž node āĻāϰ parent-āĻā§ āĻā§āύā§, āϤāĻžāĻ āĻĒāĻĨ āĻŽāĻžāύ⧠parent-āĻāϰ āϏā§āϤā§āϰ āϧāϰ⧠āĻāĻĒāϰ⧠āĻšāĻžāĻāĻāĻžāĨ¤
const body = { tag: "body", parent: null };
const main = { tag: "main", parent: body };
const card = { tag: "div", parent: main };
const heart = { tag: "button", parent: card };
const route = [];
for (let node = heart; node !== null; node = node.parent) route.push(node.tag);
console.log("target:", heart.tag);
console.log("bubbles through:", route.join(" > "));
target: button
bubbles through: button > div > main > body
Bubbling āĻāĻā§ āĻŦāϞā§āĻ parent-āĻāϰ āĻāĻāĻāĻž listener āĻāϰ āϏāĻŦ child-āĻāϰ click āĻļā§āύāϤ⧠āĻĒāĻžāϝāĻŧāĨ¤ āĻāĻ āĻā§āĻļāϞā§āϰ āύāĻžāĻŽ delegation, Lesson 02 āĻāĻāĻž āĻŦāĻžāύāĻžāĻŦā§āĨ¤ āĻāĻĒāĻžāϤāϤ āĻāĻŦāĻŋāĻāĻž āĻŽāύ⧠āϰāĻžāĻā§: event āĻļā§āϰ⧠āĻšāϝāĻŧ target āĻĨā§āĻā§, āϤāĻžāϰāĻĒāϰ āĻāĻĒāϰ⧠āĻāĻ ā§āĨ¤
Script āĻā§āĻĨāĻžāϝāĻŧ āĻŦāϏāĻŦā§
Browser āĻĒāĻžāϤāĻž āĻĒāĻĄāĻŧāϤ⧠āĻĒāĻĄāĻŧāϤ⧠āϝāĻāύ āĻāĻāĻāĻž script-āĻ āĻĒā§āĻāĻāĻžāϝāĻŧ, āϤāĻāύāĻ āϏā§āĻāĻž āĻāϞā§āĨ¤ āĻāĻĒāϰā§āϰ āĻĒāĻžāϤāĻžāĻā§āϞ⧠<script> āϰā§āĻā§āĻā§ āĻļā§āώā§, markup-āĻāϰ āĻĒāϰā§āĨ¤ āĻāĻ āĻā§āϰāĻŽāĻāĻž āĻāϰā§āϰāĻŋāĨ¤ Script āϝāĻāύ āĻāϞā§, āĻāϰ āĻāĻĒāϰā§āϰ element-āĻā§āϞ⧠āϤāϤāĻā§āώāĻŖā§ tree-āϤ⧠āϤā§āϰāĻŋ, āϤāĻžāĻ querySelector āĻāĻĻā§āϰ āĻā§āĻāĻā§ āĻĒāĻžāϝāĻŧāĨ¤
āĻāĻāĻ script āĻāĻĒāϰ⧠āĻŦāϏāĻžāĻ, element-āĻā§āϞā§āϰ āĻāĻā§, āϤāĻžāĻšāϞ⧠querySelector āĻĢā§āϰāϤ āĻĻā§āĻŦā§ null, āĻāĻžāϰāĻŖ āĻāĻ node-āĻā§āϞ⧠āϤāĻāύ⧠āĻŦāĻžāύāĻžāύ⧠āĻšāϝāĻŧāύāĻŋāĨ¤ āĻā§āύāĻž āĻĻā§āĻā§ āϏāĻŽāĻžāϧāĻžāύ āĻāĻā§āĨ¤ āĻāĻāĻāĻž āĻšāϞ⧠script āĻļā§āώ⧠āϰāĻžāĻāĻžāĨ¤ āĻāϰā§āĻāĻāĻž āĻšāϞ⧠DOMContentLoaded event-āĻāϰ āĻāύā§āϝ āĻ
āĻĒā§āĻā§āώāĻž āĻāϰāĻž, āĻĒā§āϰ⧠tree āϤā§āϰāĻŋ āĻšāϞ⧠āϝā§āĻāĻž āĻāĻāĻŦāĻžāϰ āĻāĻā§āĨ¤ āύāĻŋāĻā§āϰ āĻĒā§āϰāĻĨāĻŽ āĻā§āϞāĻāĻž āĻāĻ bug āĻĻā§āĻāĻžāϝāĻŧāĨ¤
āĻāĻ āύāĻāϰ⧠DOM
const el = document.querySelector("#list li"); // the first match, or null
el.textContent = "new text"; // replace what it says, as plain text
const item = document.createElement("li"); // a new element, not in the page yet
list.append(item); // attach it as the last child
el.addEventListener("click", (event) => { // call this on every click
console.log(event.target); // the element really clicked
});
āĻĻā§āĻā§ button āĻāĻāĻāĻž āϏāĻāĻā§āϝāĻž āĻŦāĻĻāϞāĻžāϝāĻŧāĨ¤ āϏāĻāĻā§āϝāĻžāĻāĻž āĻĨāĻžāĻā§ āĻāĻāĻāĻž variable-āĻ, āĻāϰ āĻāĻāĻāĻž āĻā§āĻ function āĻāĻāĻž āĻāĻāĻā§āĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻž handler āĻāĻā§ variable āĻŦāĻĻāϞāĻžāϝāĻŧ, āϤāĻžāϰāĻĒāϰ āĻāĻāĻāĻžāϰ function āĻĄāĻžāĻā§āĨ¤ āĻāϤ⧠āĻĒāĻžāϤāĻž āĻāϰ variable āϏāĻŦāϏāĻŽāϝāĻŧ āĻŽāĻŋāϞ⧠āĻĨāĻžāĻā§āĨ¤
<style>
.count { font-size: 2rem; margin: 0.5rem 0; }
</style>
<p class="count" id="count">0</p>
<button id="minus">-1</button>
<button id="plus">+1</button>
<script>
let count = 0;
const shown = document.querySelector("#count");
function draw() {
shown.textContent = String(count);
}
document.querySelector("#plus").addEventListener("click", () => {
count++;
draw();
});
document.querySelector("#minus").addEventListener("click", () => {
if (count > 0) count--;
draw();
});
draw();
</script>
āĻāĻā§ -1 āĻāĻžāĻĒā§: āĻāĻŋāĻā§āĻ āĻŦāĻĻāϞāĻžāϝāĻŧ āύāĻž, āĻāĻžāϰāĻŖ handler āĻļā§āύā§āϝā§āϰ āύāĻŋāĻā§ āύāĻžāĻŽāϤ⧠āϰāĻžāĻāĻŋ āύāĻžāĨ¤ āϤāĻžāϰāĻĒāϰ +1 āϤāĻŋāύāĻŦāĻžāϰ āĻāϰ -1 āĻāĻāĻŦāĻžāϰ āĻāĻžāĻĒā§, āĻĒāĻžāϤāĻž āĻĻā§āĻāĻžāĻŦā§ 2āĨ¤ āύāĻŋāϝāĻŧāĻŽāĻāĻž āĻĨāĻžāĻā§ script-āĻ, āĻĒāĻžāϤāĻžāϝāĻŧ āύāĻžāĨ¤
āĻāĻ program āĻāϞ⧠Node-āĻāĨ¤ āĻ āĻāĻāĻāĻž āĻā§āĻ āĻĒāĻžāϤāĻž āĻŦāĻžāύāĻžāϝāĻŧ āϏāĻžāϧāĻžāϰāĻŖ object āĻĻāĻŋāϝāĻŧā§, āĻĒā§āϰāϤā§āϝā§āĻā§āϰ āĻāĻāĻāĻž parent āϏāĻš, āĻāϰ āĻāĻāĻāĻž link-āĻ click āĻĒāĻĄāĻŧāϞ⧠bubbling-āĻāϰ āĻĒāĻĨ āĻŦā§āϰ āĻāϰā§āĨ¤ āĻāĻŋāĻā§ node-āĻāϰ listener āĻĨāĻžāĻāϞ⧠click āĻāϝāĻŧāĻāĻž listener āĻĒāϰā§āϝāύā§āϤ āĻĒā§āĻāĻāĻžāϤ, āϏā§āĻāĻžāĻ āĻā§āύā§āĨ¤
function node(tag, parent, listens) {
return { tag, parent, listens };
}
const body = node("body", null, true);
const nav = node("nav", body, false);
const menu = node("ul", nav, true);
const item = node("li", menu, false);
const link = node("a", item, true);
const route = [];
let heard = 0;
for (let n = link; n !== null; n = n.parent) {
route.push(n.tag);
if (n.listens) heard++;
}
console.log(route.join(" > "));
console.log("listeners reached:", heard);
a > li > ul > nav > body
listeners reached: 3
āĻāĻā§ āĻāϞ⧠link-āĻāϰ āύāĻŋāĻā§āϰ listener, āϤāĻžāϰāĻĒāϰ menu-āϰ, āϤāĻžāϰāĻĒāϰ body-āϰāĨ¤ nav āĻāϰ li āĻĒāĻžāϰ āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧ, āĻāĻĻā§āϰ āĻā§āύ⧠listener āύā§āĻāĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻž click-āĻ browser āĻ āĻŋāĻ āĻāĻāĻžāĻŦā§āĻ āĻšāĻžāĻāĻā§āĨ¤
āĻāĻāĻž āĻā§āĻĨāĻžāϝāĻŧ āĻāĻžāĻā§ āϞāĻžāĻā§
- Chrome DevTools: Elements pane āĻāĻāĻā§ āĻāϞāĻŽāĻžāύ DOM, HTML file āύāĻž, āϤāĻžāĻ script āϝāĻž āĻŦāĻĻāϞāĻžāϝāĻŧ āϏā§āĻāĻž āĻāĻāĻžāύ⧠āϏāĻžāĻĨā§ āϏāĻžāĻĨā§ āĻĻā§āĻāĻž āϝāĻžāϝāĻŧāĨ¤
- GitHub: āĻāĻāĻāĻž repository-āϰ star button āĻāĻāĻāĻž listener āĻāϰ āĻāĻāĻāĻž request āĻĻāĻŋāϝāĻŧā§ āĻĒāĻžāϤāĻžāϰ āĻā§āϤāϰā§āĻ count āĻŦāĻĻāϞāĻžāϝāĻŧ, reload āĻāĻžāĻĄāĻŧāĻžāĨ¤
- Gmail:
jāĻāϰk-āĻāϰ āĻŽāϤ⧠keyboard shortcut āĻšāϞ⧠document-āĻāϰ āĻāĻĒāϰkeydownlistener, āϝā§āĻāĻž DOM-āĻāϰ āĻā§āϤāϰ āĻĻāĻŋāϝāĻŧā§ āĻāĻāĻāĻž highlight āϏāϰāĻžāϝāĻŧāĨ¤ - Wikipedia: āϏā§āĻāĻŋāĻĒāϤā§āϰā§āϰ āĻ āĻāĻļāĻā§āϞ⧠āĻā§āϞ⧠āĻāϰ āĻŦāύā§āϧ āĻšāϝāĻŧ click listener āĻĻāĻŋāϝāĻŧā§, āϝā§āĻāĻž tree āĻŦāĻĻāϞāĻžāϝāĻŧāĨ¤
āϝ⧠āĻā§āϞāĻā§āϞ⧠āϏāĻŦāĻžāĻ āĻāϰā§
ā§§. Element āϤā§āϰāĻŋ āĻšāĻāϝāĻŧāĻžāϰ āĻāĻā§āĻ āĻāϞāĻž script
<script>
const heart = document.querySelector("#heart");
console.log("found:", heart);
heart.addEventListener("click", () => console.log("liked"));
</script>
<button id="heart">Like</button>
āĻāĻžāϞāĻžāĻāĨ¤ Console āĻĻā§āĻāĻžāϝāĻŧ heart āĻšāϞ⧠null, āϤāĻžāϰāĻĒāϰ null-āĻāϰ addEventListener āĻĒāĻĄāĻŧāϤ⧠āĻāĻŋāϝāĻŧā§ āĻāĻāĻāĻž TypeErrorāĨ¤ Browser script-āĻ āĻĒā§āĻāĻāĻžāύā§āϰ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§āĻ āϏā§āĻāĻž āĻāϞā§āĻā§, āĻāϰ āύāĻŋāĻā§āϰ button āϤāĻāύ⧠tree-āϤ⧠āĻāĻŋāϞ āύāĻžāĨ¤ Button-āĻ click āĻāϰāϞ⧠āĻāĻŋāĻā§āĻ āĻšāϝāĻŧ āύāĻžāĨ¤ Script-āĻāĻž button-āĻāϰ āĻĒāϰ⧠āϏāϰāĻžāĻ, āĻ
āĻĨāĻŦāĻž code-āĻāĻž āĻāĻāĻāĻž DOMContentLoaded listener-āĻāϰ āĻā§āϤāϰ⧠āĻŽā§āĻĄāĻŧā§ āĻĻāĻžāĻāĨ¤
⧍. āĻāĻžāĻŦāĻž āϝ⧠querySelector āϏāĻŦāĻā§āϞ⧠āĻā§āĻāĻā§ āĻĻā§āĻŦā§
<ul>
<li>rice</li>
<li>dal</li>
<li>oil</li>
</ul>
<script>
const item = document.querySelector("li");
item.textContent = item.textContent.toUpperCase();
</script>
āĻŦāĻĻāϞāĻžāϝāĻŧ āĻļā§āϧ⧠"RICE"āĨ¤ querySelector āĻĒā§āϰāĻĨāĻŽ āĻŽāĻŋāϞāĻāĻž āĻĢā§āϰāϤ āĻĻāĻŋāϝāĻŧā§āĻ āĻĨā§āĻŽā§ āϝāĻžāϝāĻŧāĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻž item āĻŦāĻĻāϞāĻžāϤ⧠āĻāĻžāĻāϞ⧠querySelectorAll("li") āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāϰ āĻĢāϞāĻžāĻĢāϞā§āϰ āĻāĻĒāϰ loop āĻāĻžāϞāĻžāĻ, Lesson 02 āϏā§āĻāĻž āĻĻā§āĻāĻžāϝāĻŧāĨ¤
ā§Š. Handler āĻĒāĻžāĻ āĻžāύā§āϰ āĻŦāĻĻāϞ⧠āĻĄā§āĻā§ āĻĢā§āϞāĻž
<button id="go">Go</button>
<script>
function sayHi() {
console.log("hi");
}
document.querySelector("#go").addEventListener("click", sayHi());
</script>
Console āĻāĻāĻŦāĻžāϰ "hi" print āĻāϰā§, load-āĻāϰ āϏāĻŽāϝāĻŧā§āĻ, āĻāϰ click-āĻ āĻāĻŋāĻā§āĻ print āĻšāϝāĻŧ āύāĻžāĨ¤ āĻŦāύā§āϧāύ⧠āϏāĻš sayHi() function-āĻāĻžāĻā§ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§ āĻĄāĻžāĻā§, āĻāϰ āĻāϰ āĻĢāϞ, undefined, āĻĒāĻžāĻ āĻžāϝāĻŧ addEventListener-āĻā§āĨ¤ Function-āĻāĻžāĻ āĻĒāĻžāĻ āĻžāĻ, sayHi, āĻŦāύā§āϧāύ⧠āĻāĻžāĻĄāĻŧāĻžāĨ¤
Sumi Chrome DevTools-āĻāϰ Elements pane āĻĒāĻĄāĻŧāĻž āĻļāĻŋāĻāĻā§āĨ¤ āĻāĻāĻžāύ⧠āĻĒāĻžāϤāĻžāĻāĻž āĻĻā§āĻāĻžāϝāĻŧ āĻāĻāĻāĻžāϰ āĻā§āϤāϰ⧠āĻāϰā§āĻāĻāĻž tag āĻšāĻŋāϏā§āĻŦā§, āĻĒā§āϰāϤāĻŋāĻāĻž child āϤāĻžāϰ parent-āĻāϰ āύāĻŋāĻā§ āĻāĻāĻā§ āϏāϰ⧠āĻŦāϏā§āĨ¤ Sumi-āϰ āĻšāĻžāϤ⧠āĻāĻāĻāĻž āĻĒāĻžāϤāĻžāϰ tree āĻāĻā§, node-āĻāϰ āĻāĻāĻāĻž list āĻšāĻŋāϏā§āĻŦā§āĨ¤ āĻ āĻ āĻŋāĻ āĻāĻ āĻāĻŦāĻŋāĻāĻžāĻ āϏāĻžāϧāĻžāϰāĻŖ text-āĻ āĻāĻžāϝāĻŧāĨ¤
Input. āĻĒā§āϰāĻĨāĻŽ āϞāĻžāĻāύ⧠nāĨ¤ āϤāĻžāϰāĻĒāϰ n āĻāĻž āϞāĻžāĻāύ, āĻĒā§āϰāϤāĻŋāĻāĻž node-āĻāϰ āĻāύā§āϝ āĻāĻāĻāĻž, document-āĻāϰ āĻā§āϰāĻŽā§āĨ¤ i āύāĻŽā§āĻŦāϰ āϞāĻžāĻāύ⧠āĻĨāĻžāĻā§ node i-āĻāϰ parent āĻāϰ node-āĻāĻžāϰ tagāĨ¤ Node 1 āĻšāϞ⧠root, āĻāϰ parent 0āĨ¤ āĻŦāĻžāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻāĻž node-āĻāϰ parent-āĻāϰ āύāĻŽā§āĻŦāϰ āĻāϰ āύāĻŋāĻā§āϰ āĻā§āϝāĻŧā§ āĻā§āĻāĨ¤
Output. Markup-āĻāĻž, āĻĒā§āϰāϤāĻŋ āϞāĻžāĻāύ⧠āĻāĻāĻāĻž tagāĨ¤ āĻā§āύ⧠node-āĻ āĻĸā§āĻāĻžāϰ āϏāĻŽāϝāĻŧ print āĻāϰ⧠<tag>, āĻāϰ āĻāϰ āϏāĻŦ child āĻļā§āώ āĻāϰ⧠āĻŦā§āϰ āĻšāĻāϝāĻŧāĻžāϰ āϏāĻŽāϝāĻŧ </tag>āĨ¤ Child-āϰāĻž āĻāϏ⧠input-āĻāϰ āĻā§āϰāĻŽā§āĨ¤ Depth d-āĻāϰ node-āĻāϰ āĻāĻā§ āĻĨāĻžāĻā§ 2d āĻāĻž space, āĻāϰ root-āĻāϰ depth 0āĨ¤
Constraints. 1 <= n <= 1000; the tree is at most 50 levels deep; every tag is 1 to 10 lowercase letters.
Sample.
6
0 ul
1 li
2 a
1 li
1 li
5 span
<ul>
<li>
<a>
</a>
</li>
<li>
</li>
<li>
<span>
</span>
</li>
</ul>
const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];
// your code: read with next() and nextInt(), push every line of output to out
console.log(out.join("\n"));
Run in Compiler
tree-markup āύāĻžāĻŽā§ grade āĻšāϝāĻŧāĨ¤
Farhan āĻāĻāĻāĻž āĻĒāĻžāϤāĻžāϝāĻŧ āĻāĻāĻž āĻāĻāĻž click āĻāϰ⧠test āĻāϰāĻā§āĨ¤ āĻāĻāĻāĻž click āĻļā§āϰ⧠āĻšāϝāĻŧ pointer-āĻāϰ āύāĻŋāĻā§āϰ element āĻĨā§āĻā§, āϤāĻžāϰāĻĒāϰ bubble āĻāϰ⧠āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻž ancestor āĻĒāĻžāϰ āĻšāϝāĻŧā§ root āĻĒāϰā§āϝāύā§āϤ āĻāĻ ā§āĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻž click-āĻāϰ āĻāύā§āϝ Farhan bubbling-āĻāϰ āĻĒāĻĨāĻāĻž āĻāĻžāϝāĻŧ: event āĻāĻĒāϰ⧠āĻāĻ āĻžāϰ āĻĒāĻĨā§ āϝ⧠āϝ⧠tag āĻĒāĻžāϰ āĻšāϝāĻŧ, āϤāĻžāϰ listāĨ¤
Input. āĻĒā§āϰāĻĨāĻŽ āϞāĻžāĻāύ⧠nāĨ¤ āϤāĻžāϰāĻĒāϰ n āĻāĻž āϞāĻžāĻāύ, āĻĒā§āϰāϤāĻŋāĻāĻž node-āĻāϰ āĻāύā§āϝ āĻāĻāĻāĻž, document-āĻāϰ āĻā§āϰāĻŽā§: node i-āĻāϰ parent āĻāϰ āĻāϰ tagāĨ¤ Node 1 āĻšāϞ⧠root, āĻāϰ parent 0āĨ¤ āĻŦāĻžāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻāĻž node-āĻāϰ parent-āĻāϰ āύāĻŽā§āĻŦāϰ āĻāϰ āύāĻŋāĻā§āϰ āĻā§āϝāĻŧā§ āĻā§āĻāĨ¤ āϤāĻžāϰāĻĒāϰ āĻāĻ āϞāĻžāĻāύ⧠q, āϤāĻžāϰāĻĒāϰ q āĻāĻž āϞāĻžāĻāύ, āĻĒā§āϰāϤāĻŋāĻāĻžāϝāĻŧ āϏā§āĻ node, āϝāĻžāϰ āĻāĻĒāϰ click āĻĒāĻĄāĻŧā§āĨ¤
Output. āĻĒā§āϰāϤāĻŋāĻāĻž click-āĻāϰ āĻāύā§āϝ āĻāĻ āϞāĻžāĻāύ: click āĻĒāĻĄāĻŧāĻž node āĻĨā§āĻā§ root āĻĒāϰā§āϝāύā§āϤ tag-āĻā§āϞā§, āĻŽāĻžāĻā§ āĻāĻāĻāĻž āĻāϰ⧠spaceāĨ¤
Constraints. 1 <= n <= 200; 1 <= q <= 200; every tag is 1 to 10 lowercase letters.
Sample.
7
0 body
1 header
1 main
3 ul
4 li
5 button
4 li
3
6
2
7
button li ul main body
header body
li ul main body
const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];
// your code: read with next() and nextInt(), push every line of output to out
console.log(out.join("\n"));
Run in Compiler
bubble-route āύāĻžāĻŽā§ grade āĻšāϝāĻŧāĨ¤
Lima āĻāĻāĻāĻž āĻļā§āĻā§āĻā§āĻāĻž āĻāĻžāϰā§āĻĄ āĻŦāĻžāύāĻžāϤ⧠āĻāĻžāϝāĻŧāĨ¤ āĻĒāĻžāϤāĻžāϝāĻŧ āĻāĻāĻāĻž heading āĻāĻā§, āϝā§āĻāĻž āĻŦāϞ⧠"Hello", āĻāϰ āĻāĻāĻāĻž button, āϝā§āĻāĻžāϝāĻŧ āϞā§āĻāĻž "Bangla"āĨ¤ Button-āĻ click āĻāϰāϞ⧠heading āĻŦāĻĻāϞ⧠āĻšāĻāϝāĻŧāĻž āĻāĻāĻŋāϤ "Shubho shokal"āĨ¤ āύāĻŋāĻā§āϰ script-āĻāĻž āĻļā§āώ āĻāϰā§, āϤāĻžāϰāĻĒāϰ Run āĻā§āĻĒā§ button-āĻ click āĻāϰā§āĨ¤
<h1 id="greeting">Hello</h1>
<button id="bangla">Bangla</button>
<script>
// find the heading and the button with querySelector
// add a click listener that changes the heading's textContent
</script>
Run in Compiler
Example 1-āĻā§ āĻāĻāĻāĻž āĻĻā§āĻāĻžāύā§āϰ stock counter āĻŦāĻžāύāĻžāĻāĨ¤ āϤā§āϤā§āϝāĻŧ āĻāĻāĻāĻž button āϝā§āĻ āĻāϰā§, "Reset", āϝā§āĻāĻž count āĻāĻŦāĻžāϰ 0 āĻāϰ⧠āĻĻā§āϝāĻŧāĨ¤ āĻāĻāĻāĻž āϏā§āĻŽāĻžāĻ āĻĻāĻžāĻ: count āĻāĻāύ⧠10-āĻāϰ āĻāĻĒāϰ⧠āϝāĻžāĻŦā§ āύāĻž, āĻāϰ 10-āĻ āĻĒā§āĻāĻāĻžāϞ⧠āύāĻŋāĻā§āϰ āĻāĻāĻāĻž paragraph āĻŦāϞāĻŦā§ "Shelf is full"āĨ¤ āĻ āύā§āϝ āϝā§āĻā§āύ⧠count-āĻ paragraph-āĻāĻž āĻĢāĻžāĻāĻāĻž āĻĨāĻžāĻā§āĨ¤ Count āĻāĻāĻāĻž variable-āĻ āϰāĻžāĻā§, āĻāϰ āĻāĻāĻā§ āĻāĻāĻāĻž function āĻĻāĻŋāϝāĻŧā§āĨ¤
<p id="count">0</p>
<p id="status"></p>
<button id="minus">-1</button>
<button id="plus">+1</button>
<script>
let count = 0;
// add a Reset button above in the markup, then wire all three buttons here
</script>
Run in Compiler
āϏāĻāϰāĻžāĻāϰ āϝ⧠āĻĒā§āϰāĻļā§āύāĻā§āϞ⧠āĻāϏā§
DOM āĻāϰ HTML file āĻāĻŋ āĻāĻāĻ āĻāĻŋāύāĻŋāϏ?
āύāĻžāĨ¤ HTML file āĻšāϞ⧠text, browser āϝā§āĻāĻž āĻāĻāĻŦāĻžāϰ āĻĒāĻĄāĻŧā§āĨ¤ DOM āĻšāϞ⧠āĻāĻ text āĻĨā§āĻā§ āĻŦāĻžāύāĻžāύ⧠object-āĻāϰ tree, āĻāϰ āϤā§āĻŽāĻžāϰ script āĻŦāĻĻāϞāĻžāϝāĻŧ āϏā§āĻ tree-āĻāĻžāĻāĨ¤ Script āĻāϞāĻžāϰ āĻĒāϰ⧠āĻĻā§āĻā§ āĻāϰ āĻŽā§āϞ⧠āύāĻžāĨ¤ View Source āĻĻā§āĻāĻžāϝāĻŧ file, DevTools-āĻāϰ Elements pane āĻĻā§āĻāĻžāϝāĻŧ DOMāĨ¤
āĻŦāĻžāĻāĻŋ track Node-āĻ āĻāϞā§, āĻāĻ module āϤāĻžāĻšāϞ⧠preview-āϤ⧠āĻĒāĻžāϤāĻž āĻāĻžāϞāĻžāϝāĻŧ āĻā§āύ?
Node-āĻāϰ āĻā§āύ⧠āĻĒāĻžāϤāĻž āύā§āĻ, āĻĒāϰā§āĻĻāĻž āύā§āĻ,
document-āĻ āύā§āĻāĨ¤ āĻĒāĻžāϤāĻžāϰ program-āĻāϰ āϞāĻžāĻā§ āĻāĻāĻāĻž browser, āϤāĻžāĻ preview lesson-āĻāϰ āĻā§āϤāϰā§āĻ āĻāĻāĻāĻž sandbox āĻāϰāĻž frame-āĻ āϏā§āĻāĻž āĻā§āϞā§āĨ¤ āĻāĻāĻžāύ⧠network āύā§āĻ, storage āύā§āĻ, āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻž Run āĻĒāĻžāϤāĻžāĻā§ āύāϤā§āύ āĻāϰ⧠āĻļā§āϰ⧠āĻāϰā§āĨ¤ Judge āĻāϰāĻž problem-āĻā§āϞ⧠āĻāĻāύ⧠Node-āĻ āĻāϞā§, āϤāĻžāĻ āĻāϰāĻž āĻāĻžāĻ āĻāϰ⧠āϏāĻžāϧāĻžāϰāĻŖ object āĻšāĻŋāϏā§āĻŦā§ āϞā§āĻāĻž tree āύāĻŋāϝāĻŧā§āĨ¤āĻāĻāĻāĻž value āĻĻā§āĻāϤ⧠āĻāĻŋ
alertāĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝāĻžāϝāĻŧ?Preview-āϤā§
alert,confirmāĻāϰpromptāĻļā§āϧ⧠console-āĻ āĻāĻāĻāĻž āϞāĻžāĻāύ print āĻāϰ⧠āϏāĻžāĻĨā§ āϏāĻžāĻĨā§ āĻĢāĻŋāϰ⧠āĻāϏā§āĨ¤console.logāĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§, āĻ āĻĨāĻŦāĻžtextContentāĻĻāĻŋāϝāĻŧā§ value-āĻāĻž āĻĒāĻžāϤāĻžāϤā§āĻ āϞāĻŋāĻā§ āĻĻāĻžāĻāĨ¤ āĻāĻŽāύāĻŋāϤā§āĻ āĻĻā§āĻā§āĻ āĻāĻžāϞ⧠āĻ āĻā§āϝāĻžāϏ, āĻāĻžāϰāĻŖ āϏāϤā§āϝāĻŋāĻāĻžāϰā§āϰ dialog āĻĒā§āϰ⧠āĻĒāĻžāϤāĻž āĻāĻāĻā§ āĻĻā§āϝāĻŧāĨ¤Event handler āĻāĻŋ Module 12-āĻāϰ callback-āĻāϰ āĻŽāϤā§āĻ?
āĻšā§āϝāĻžāĻāĨ¤ Browser āϤā§āĻŽāĻžāϰ function āϰā§āĻā§ āĻĻā§āϝāĻŧ, āĻāϰ āĻĒāϰ⧠āĻĄāĻžāĻā§, event loop-āĻāϰ āĻā§āύ⧠āĻĒāĻžāϞāĻžāϝāĻŧ, āĻĒā§āϰāϤāĻŋāĻāĻž event-āĻ āĻāĻāĻŦāĻžāϰāĨ¤ āϤā§āĻŽāĻžāϰ handler āĻāϞāĻžāϰ āϏāĻŽāϝāĻŧ āĻĒāĻžāϤāĻžāϝāĻŧ āĻāϰ āĻāĻŋāĻā§āĻ āĻāϞ⧠āύāĻž, āϤāĻžāĻ āϧā§āϰ āĻāĻāĻāĻž handler āĻĒā§āϰ⧠āĻĒāĻžāϤāĻž āĻāĻŽāĻŋāϝāĻŧā§ āĻĻā§āϝāĻŧāĨ¤
āĻŽā§āϞ āĻāĻĨāĻž
- DOM āĻšāϞ⧠HTML āĻĨā§āĻā§ browser-āĻāϰ āĻŦāĻžāύāĻžāύ⧠object-āĻāϰ tree, āĻāϰ āĻĒāϰā§āĻĻāĻž āĻāĻāĻāĻž āĻšāϝāĻŧ āϏā§āĻāĻž āĻĻā§āĻā§āĨ¤
- āĻĒā§āϰāϤāĻŋāĻāĻž node-āĻāϰ āĻāĻāĻāύ parent āĻāϰ child-āĻĻā§āϰ āĻāĻāĻāĻž list; āĻĒāĻžāϤāĻžāϰ āĻā§āύ⧠parent āϧāϰāϞ⧠āϤāĻŦā§āĻ node āĻĻā§āĻāĻž āϝāĻžāϝāĻŧāĨ¤
querySelectorāĻāĻāĻāĻž CSS selector-āĻāϰ āĻĒā§āϰāĻĨāĻŽ āĻŽāĻŋāϞ āĻĢā§āϰāϤ āĻĻā§āϝāĻŧ, āĻ āĻĨāĻŦāĻžnullāĨ¤textContentāĻāĻāĻāĻž element-āĻāϰ āϞā§āĻāĻž āĻĒāĻĄāĻŧā§ āĻŦāĻž āĻŦāĻĻāϞāĻžāϝāĻŧ, āĻāϰaddEventListenerāĻĒā§āϰāϤāĻŋāĻāĻž event-āĻ āĻāĻāĻāĻž function āĻĄāĻžāĻā§āĨ¤- Click āĻļā§āϰ⧠āĻšāϝāĻŧ target āĻĨā§āĻā§, bubble āĻāϰ⧠āĻĒā§āϰāϤāĻŋāĻāĻž ancestor āĻĒāĻžāϰ āĻšāϝāĻŧā§ āĻāĻ ā§; script-āĻā§ āĻāϞāϤ⧠āĻšāĻŦā§ āĻĻāϰāĻāĻžāϰāĻŋ element-āĻā§āϞā§āϰ āĻĒāϰā§āĨ¤
- āĻāϰāĻ āĻāĻā§āϰ⧠āϝā§āϤ⧠āĻāĻžāĻāϞā§: āĻā§āϤāϰā§āϰ āĻāϞāĻāĻŦāĻāĻž, reflow, repaint, live list āĻāϰ batching (Pro)āĨ¤
āĻāϰāĻĒāϰ: DOM-āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻž āĻšāĻžāϤāĻŋāϝāĻŧāĻžāϰ, āĻāĻāĻāĻž āĻāĻāĻāĻž āĻāϰā§, querySelectorAll āĻĨā§āĻā§ listener āϏāϰāĻžāύ⧠āĻĒāϰā§āϝāύā§āϤāĨ¤
lesson ā§§ āĻļā§āώ
āĻļā§āώ āĻšāϞ⧠āĻāĻŋāĻšā§āύ āĻĻāĻŋāύ, āĻ āĻā§āϰāĻāϤāĻŋ āĻāĻĒāύāĻžāϰ āϏāĻžāĻĨā§ āĻĨāĻžāĻāĻŦā§āĨ¤
āĻĒāϰā§āϰāĻāĻž: DOM-āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻž āĻšāĻžāϤāĻŋāϝāĻŧāĻžāϰ, āĻāĻāĻāĻž āĻāĻāĻāĻž āĻāϰā§, āĻā§ āĻĢā§āϰāϤ āĻĻā§āϝāĻŧ āϤāĻž āϏāĻš