DOM

आपकी HTML फाइल एक बार लोड होती है, और फिर पेज वहीं बैठ जाता है। लेकिन एक सर्च बॉक्स जो आप टाइप करते हुए परिणामों का सुझाव देता है, एक मेनू जो क्लिक पर खुलता है, एक काउंटर जो बढ़ता है, इनमें से कोई भी HTML फाइल में नहीं है। कुछ लोड होने के बाद पेज पर जो कुछ दिखता है उसे बदलता है, और वह कुछ JavaScript है जो DOM के माध्यम से पेज में पहुंचता है। यह अध्याय उस पहुंच के बारे में है: JavaScript कैसे पेज के हिस्सों को ढूंढता है और उन्हें बदलता है ताकि पेज पाठक के सामने अपडेट हो।
DOM क्या है
जब ब्राउज़र आपके पेज को लोड करता है, तो यह आपके HTML को पढ़ता है और इसमें से एक ऑब्जेक्ट्स का ट्री बनाता है: पेज के लिए एक ऑब्जेक्ट, <body> के लिए एक, और अंदर के हर हेडिंग, पैराग्राफ और बटन के लिए एक। यह ट्री DOM है, Document Object Model का संक्षिप्त रूप। आपका JavaScript इस ट्री को पढ़ सकता है और इसे बदल सकता है, और जब यह करता है, तो आप जो पेज देखते हैं वह तुरंत अपडेट हो जाता है।
जो बात याद रखने लायक है: DOM आपकी HTML फाइल नहीं है। यह पेज का लाइव संस्करण है, ब्राउज़र की मेमोरी में बैठा हुआ है। आपकी .html फाइल शुरुआती रेसिपी है; DOM वह तैयार डिश है जो ब्राउज़र परोस रहा है, और JavaScript सभी के खाने के दौरान प्लेट को फिर से व्यवस्थित कर सकता है।
DOM में हर एलिमेंट एक ऑब्जेक्ट है, उसी तरह का जो आपने objects में देखा था, उन प्रॉपर्टीज़ के साथ जिन्हें आप पढ़ सकते हैं और बदल सकते हैं। यह पूरा ट्रिक है: क्योंकि पेज ऑब्जेक्ट्स हैं, और आप पहले से ही जानते हैं कि ऑब्जेक्ट्स के साथ कैसे काम करना है, पेज को बदलना ऑब्जेक्ट प्रॉपर्टीज़ को बदलना है।
एलिमेंट्स को चुनना
इससे पहले कि आप किसी एलिमेंट को बदल सकें, आपको इसे ट्री में खोजना होगा। आप इसे उसी तरह इंगित करते हैं जैसे CSS करता है, एक सिलेक्टर के साथ, और ब्राउज़र आपको मिलान करने वाली ऑब्जेक्ट वापस देता है।
कर्मठ है document.querySelector। आप इसे एक CSS सिलेक्टर देते हैं, उसी तरह का पैटर्न जिसका उपयोग आप CSS में करते हैं, और यह पहला एलिमेंट जो मेल खाता है:
const card = document.querySelector(".card"); // class="card" वाला पहला एलिमेंट
const total = document.querySelector("#total"); // id="total" वाला एलिमेंट.card क्लास द्वारा मेल खाता है, #total आईडी द्वारा मेल खाता है, और एक सादा शब्द जैसे "button" टैग नाम द्वारा मेल खाता है। querySelector आपको पहला मेल देता है और वहीं रुक जाता है। जब आप हर मेल चाहते हैं, तो querySelectorAll का उपयोग करें, जो एक सूची लूप करने के लिए लौटाता है:
const cards = document.querySelectorAll(".card"); // class="card" वाले सभी एलिमेंट्स
console.log(cards.length); // इसे कितने मिलेअगर कुछ भी मेल नहीं खाता, querySelector null लौटाता है, जो JavaScript का तरीका है कहने का "यहां कुछ नहीं है"।
document.querySelector को .card या #total जैसे CSS सिलेक्टर दें, और यह आपको पहला मेल देता है। querySelectorAll का उपयोग करें जब आप सभी को एक सूची के रूप में चाहते हैं। अगर कुछ भी मेल नहीं खाता तो आपको null मिलता है, जिसका अर्थ है "यहां कुछ नहीं है"। एलिमेंट्स को पढ़ना और बदलना
एक बार जब आप एक एलिमेंट रखते हैं, तो आप इसे इसकी प्रॉपर्टीज़ के माध्यम से पढ़ते और बदलते हैं, उसी तरह जैसे आप किसी भी ऑब्जेक्ट को पढ़ते और बदलते हैं। यह वह जगह है जहां पेज वास्तव में चलने लगता है।
प्रॉपर्टी जिसका आप सबसे अधिक उपयोग करेंगे वह textContent है, एक एलिमेंट के अंदर का टेक्स्ट। आप इसे पढ़ सकते हैं या सेट कर सकते हैं:
const total = document.querySelector("#total");
total.textContent = "42 items"; // पेज अब "42 items" दिखाता हैकुछ कैसे दिखता है यह बदलने के लिए, आप आमतौर पर एक क्लास जोड़ते हैं या हटाते हैं और CSS को स्टाइलिंग करने देते हैं। classList के पास इसके लिए तीन तरीके हैं:
const card = document.querySelector(".card");
card.classList.add("selected"); // एक क्लास जोड़ें
card.classList.remove("selected"); // इसे दूर ले जाएं
card.classList.toggle("selected"); // जोड़ें अगर गायब है, हटाएं अगर हैआप .style के माध्यम से एक एकल स्टाइल को सीधे सेट कर सकते हैं, और setAttribute के साथ src या href जैसे एट्रिब्यूट सेट कर सकते हैं:
card.style.color = "crimson"; // एक इनलाइन स्टाइल
const avatar = document.querySelector(".avatar");
avatar.setAttribute("src", "delhi.jpg"); // इमेज सोर्स सेट करेंपहले classList तक पहुंचें और .style केवल एकबारगी ट्वीक्स के लिए, क्योंकि आपकी स्टाइलिंग को CSS में रखना इसे एक जगह पर रखता है।
textContent के साथ सेट करें, और classList.add, remove, और toggle के साथ एक क्लास जोड़कर या हटाकर इसका लुक बदलें। एक एकबारगी ट्वीक के लिए .style का उपयोग करें और इमेज सोर्स जैसी चीज़ों के लिए setAttribute करें। क्लासेस पर झुकें ताकि आपकी स्टाइलिंग आपके CSS में रहे। एलिमेंट्स बनाना और हटाना
जो एलिमेंट्स पहले से मौजूद हैं उन्हें बदलना आपको बहुत दूर ले जाता है, लेकिन कभी-कभी वहां कुछ नहीं होता: एक to-do जिसे आप जोड़ रहे हैं, एक सर्च परिणाम आ रहा है। इसके लिए आप नए एलिमेंट्स बनाते हैं और उन्हें ट्री में डालते हैं, और पुराने को निकालते हैं।
आप document.createElement के साथ एक नया एलिमेंट बनाते हैं, इसे कुछ सामग्री देते हैं, फिर append के साथ इसे पेज पर जोड़ते हैं:
const list = document.querySelector(".todo-list");
const item = document.createElement("li"); // एक नया <li>, पेज पर अभी नहीं
item.textContent = "दूध खरीदें"; // इसे कुछ टेक्स्ट दें
list.append(item); // अब यह सूची के अंत में दिखाई देता हैcreateElement से एक नया एलिमेंट केवल मेमोरी में मौजूद रहता है जब तक आप इसे कहीं append नहीं करते; वह कदम है जो इसे पेज पर डालता है। एक एलिमेंट को पेज से निकालने के लिए, इसे remove को कॉल करें:
item.remove(); // पेज से चला गयाdocument.createElement के साथ एक नया एलिमेंट बनाएं, textContent के साथ इसे टेक्स्ट दें, और append के साथ इसे पेज पर डालें। एक ताजा एलिमेंट केवल मेमोरी में रहता है जब तक आप इसे append नहीं करते, इसलिए वह कदम है जो इसे दिखाता है। इसे पेज से निकालने के लिए, इसे remove को कॉल करें। DOM आगे कहां जाता है
चुनना, पढ़ना, बदलना, बनाना, और हटाना अधिकांश कवर करता है कि JavaScript एक पेज के लिए क्या करता है, और यह सब अंदर एक ही कदम है: ट्री में एक ऑब्जेक्ट खोजें और इसकी प्रॉपर्टीज़ को बदलें। क्योंकि DOM ऑब्जेक्ट्स हैं, आप जो कुछ सीखते हैं objects में सीधे यहां लागू होता है, और इस अध्याय में तरीकों का छोटा सेट (querySelector, textContent, classList, createElement, append) अधिकांश टूलकिट है।
अब तक जो गायब है वह समय है। हर उदाहरण यहां एक बार चलता है, शीर्ष से नीचे तक, लेकिन एक वास्तविक पेज यूजर क्या करता है इसके जवाब में बदलता है: एक क्लिक, एक keystroke, एक सबमिट किया गया फॉर्म। आपके DOM बदलावों को उन पलों तक तार करना events है, अगला अध्याय, जहां addEventListener "यूजर ने यह किया" को "इसलिए पेज वह करता है" से जोड़ता है। एक बार चुनना और बदलना events के जवाब में बैठ जाता है, आप इंटरैक्टिव पेज बना सकते हैं जो इस हैंडबुक का लक्ष्य है।

