- यह लेख Vanilla JavaScript का उपयोग करके Document Object Model (DOM) manipulation में महारत हासिल करने पर चर्चा करता है.
- Angular, VueJS, React, Solid, Svelte जैसे आधुनिक tools के उपयोग के बावजूद, यह web development के लिए browser DOM API को समझने के महत्व पर ज़ोर देता है.
- लेखक basic browser API, आसानी से समझ आने वाले examples, real-time demos, tips और best practices, real-world use cases, तथा modern browsers और Internet Explorer के साथ compatibility सहित संसाधनों का एक संग्रह प्रदान करते हैं.
- इन संसाधनों को तीन स्तरों में बाँटा गया है: basic, intermediate, और advanced.
- basic स्तर में user's color scheme preference के अनुसार favicon को dynamically बदलना, webpage का reading time निकालना, और CSS root variables को dynamically update करना जैसे कार्य शामिल हैं.
- intermediate स्तर में Shift+Tab key combination का उपयोग करके text area में indentation हटाना, full-screen mode में जाना, और spin input बनाना जैसे कार्य शामिल हैं.
- advanced स्तर में custom cursor बनाना, HTML strings को sanitize करना, और custom scrollbar बनाना जैसे कार्य शामिल हैं.
- लेखक modal खोलते समय layout shift से बचने और text node का bounding rectangle प्राप्त करने जैसे tips भी देते हैं.
- लेख का समापन frontend technical content पर लेखक के newsletter की subscription invitation के साथ होता है.
1 टिप्पणियां
Hacker News की राय
उदाहरणों की सूची शानदार है, और सिर्फ कुछ उदाहरण सरसरी तौर पर देखने पर भी इसकी सावधानी और डिटेल हैरान करने वाली लगती है
React जैसे प्लेटफॉर्म से छोटे और अधिक minimal implementation की ओर जाते समय मैं अक्सर अटक जाता हूं कि standard JS में जटिल patterns को कैसे संभालूं, लेकिन कोड देखने पर कई बार लगता है, “यह तो किसी विशाल library में ढेर सारी properties पास करने से कहीं आसान है”
minimal JS framework भी जब मासूम दिखने वाले feature requests जमा होने लगते हैं, तो आखिरकार hooks, events और side effects की patching का राक्षस बन जाना आसान है
आजकल मैं jQuery भी नहीं इस्तेमाल करता, और ES modules जैसी चीजें code organization के लिए इस्तेमाल करता हूं, लेकिन इसके लिए खास तौर पर npm command चलाने की जरूरत नहीं होती। यह कोई ऐसी चीज नहीं है जिसे vendor के रूप में खींचकर लाना पड़े, बल्कि global browser standard है
आजकल मैं MDN को बाइबल की तरह देखता हूं। भरोसा करके चलते रहें तो यह लगभग अंत तक ले जाता है, और frameworks किसी बिंदु के बाद उल्टा अड़चन बनने लगते हैं। 5 साल पहले तक बात इतनी आगे नहीं थी, लेकिन browser APIs तेजी से modules, flexbox, grid जैसे शक्तिशाली और consistent primitives की ओर converge हुए हैं
उदाहरण के लिए, मूल लेख के ज्यादातर उदाहरण ऐसे code के करीब हैं जिन्हें React इस्तेमाल करने पर भी खुद लिखना पड़ेगा
side project के रूप में अभी बिना नाम वाली “web designers के लिए vim” जैसी चीज बना रहा हूं। Webflow की तरह browser में websites या components बनाता है, लेकिन सब कुछ command language से driven है
शुरुआत में मैंने तय किया था कि framework के बिना करूंगा। 2009 से यह काम कर रहा हूं और frameworks छूने से पहले भी लंबे समय तक JS इस्तेमाल कर चुका था, इसलिए लगा कि native DOM API काफी होगा
लेकिन data को DOM के अंदर-बाहर ले जाना इतना उबाऊ और error-prone था कि मानसिक स्वास्थ्य के लिए आखिरकार मैंने खुद एक mini framework लिखना शुरू कर दिया। तभी याद आया कि शुरुआत में frameworks इस्तेमाल करने की वजह क्या थी। आखिर किसी न किसी रूप में framework इस्तेमाल करना ही पड़ता है; फर्क सिर्फ इतना है कि वह खुद बनाया हुआ custom है या community द्वारा बनाया गया industry standard
जिन sites में interaction कम हो, उनके लिए native DOM अच्छा है, और React इस्तेमाल करने वाली ज्यादातर sites को शायद उसकी जरूरत भी नहीं होती। लेकिन product में जरा भी nuance या complexity हो तो मैं framework इस्तेमाल करके झंझट से बचूंगा। आखिरकार Svelte पर चला गया और काफी ज्यादा संतुष्ट हूं
अगर interaction वाली website है, तो DOM manipulation ज्यादा fundamental और universal technology इस्तेमाल करने, build process हल्का या न होने, execution तेज होने और explicit होने के कारण बेहतर विकल्प हो सकता है
बेशक grey areas बहुत हैं, लेकिन यह case ठीक उसी category में आता है जहां framework फायदेमंद है
सिर्फ
value.startsWith('javascript:')से vulnerability पैदा हो सकती है। URL के पहले मनचाहा whitespace आ सकता है, इसलिए कम से कमvalue.trim().startsWith('javascript:')जरूरी हैफिर भी मुझे लगता है कि blocklist से बेहतर allowlist है। सिर्फ
http:,https:और जरूरत हो तोmailto:,ftp:,sftp:जैसे protocols allow करें, और/से शुरू होने वाले relative URLs को शायद allow किया जा सकता हैहालांकि असल में URL बन सकने वाली सभी attributes को सही ढंग से handle करना होगा, इसलिए आखिरकार कुछ tags और उनकी attributes को ही allow करने का तरीका बेहतर होगा
['http:', 'https:', 'mailto:', 'tel:'].includes(new URL(value, location.origin).protocol)की तरह handle कर सकते हैं[1] https://caniuse.com/url
इस लेख से यह impression नहीं मिलना चाहिए कि HTML sanitization इतनी आसान है। अंत में https://github.com/cure53/DOMPurify का जिक्र तो है, लेकिन मेरी राय में इसे खुद लिखने की कोशिश न करने को कहीं ज्यादा strongly कहना चाहिए और सिर्फ DOMPurify recommend करना चाहिए
इस issue पर मैंने एक issue खोला है: https://github.com/phuocng/html-dom/issues/281
जानने लायक उपयोगी सूची लगती है, और मैंने सब नहीं देखा है, लेकिन अब तक ठीक लग रही है
पहला उदाहरण खोलकर देखा तो
window.matchMedia('(prefers-color-scheme: dark)')को बेवजह दो बार चला रहा हैअगर
setFaviconको event listener callback के रूप में इस्तेमाल करना है, तो callback में पास होने वालेeventparameter केevent.matchesका इस्तेमाल किया जा सकता हैव्यक्तिगत रूप से मुझे इसे HTML में handle करना बेहतर लगता है, क्योंकि इससे JS बंद रखने वाले users भी support हो जाते हैं
https://phuoc.ng/collection/html-dom/change-the-favicon-dyna...
theme-colormeta पर भी apply किया जा सकता है, जो details पर ध्यान देने वाले PWA developers के लिए कम इस्तेमाल होने वाला लेकिन शानदार feature है“textarea auto-expand” तकनीक नए CSS property form-sizing की वजह से पुरानी पड़ती जा रही है
https://chriscoyier.net/2023/09/29/css-solves-auto-expanding...
इस नए CSS property का इस्तेमाल न भी करें, तो भी element की
heightको adjust करने वाला तरीका ideal नहीं है और अटक सकता हैबेहतर तरीका hidden mirror element का इस्तेमाल करना है
https://css-tricks.com/the-cleanest-trick-for-autogrowing-te...
यहां दी गई चीज़ों में से काफ़ी कई, बेहतर native API मौजूद होने के बावजूद पुराने और awkward API इस्तेमाल कर रही हैं
मसलन “element replace” में
ele.parentNode.replaceChild(newEle, ele);दिया है, लेकिन अगर आप Chrome 54 से नीचे, Firefox 49 से नीचे, Safari 10 से नीचे को target नहीं कर रहे हैं, तो बसele.replaceWith(newEle)इस्तेमाल करेंreplaceWith किसी एक node को कई nodes या text से बदलना भी संभव बनाता है
इसी तरह “NodeList iteration” में array spread के बाद
forEachइस्तेमाल करने को कहा गया है, लेकिन बसfor (let ele of nodelist) ...काफी हैअच्छा है। bookmark कर लिया। इसी तरह का एक अच्छा resource https://youmightnotneedjquery.com/ भी है
मैं web work अक्सर नहीं करता, लेकिन जब भी करता हूं, वहां का framework overload पूरी तरह demotivate कर देता है। नया React project सैकड़ों dependencies के साथ शुरू होता है—यह control से बाहर है, और उस complexity का बोझ हैरान करने वाला है
दूसरी तरफ built-in cross-platform browser technologies पहले से कहीं ज्यादा powerful हैं, और common tasks करने के लिए code की मात्रा भी इतनी ज्यादा नहीं होती
frontend developers, सब ठीक है?
उदाहरण के लिए application state management और routing ऐसी बड़ी चीज़ें हैं जिन्हें pure DOM API से खुद implement करना पड़ेगा
app की complexity के हिसाब से यह बड़ी बात न भी हो, लेकिन basic app से आगे जाते ही इन extra features की value तेजी से बढ़ती है। हालांकि अगर आप ऐसा कुछ इस्तेमाल कर रहे हैं जिसके लिए NPM चाहिए, तो सिरदर्द शुरू हो जाता है
basic platform और उसकी capabilities को पसंद करने वाले frontend developer के तौर पर, nested CSS, container queries, और ES6 के बाद overall बेहतर हुए JS experience जैसी अच्छी चीज़ें आते देखना अच्छा लगता है
साथ ही यह देखकर हैरानी भी होती है कि button या bold text जैसी छोटी-छोटी चीज़ों के लिए भी बहुत लोग component इस्तेमाल करते हैं
frameworks खुद मुझे पसंद हैं, लेकिन कई frameworks और libraries की marketing इस भरोसे पर टिकी है कि CSS और pure DOM manipulation पागलपन की हद तक मुश्किल हैं, और NPM से कोई भी package खींच लाना न सिर्फ तेज़ और आसान है बल्कि professional काम भी है
सिर्फ Kubernetes, Helm, Terraform, CircleCI जैसी चीज़ों को ही देखें, तो परत-दर-परत जमा terminology की मात्रा बेतुकी है
जब पता चला कि कई DOM functions अपने-आप update होने वाली live HTMLCollection लौटाते हैं, तो मैं सचमुच हैरान रह गया
framework craze से पहले, या फिर framework के बिना development की ओर थोड़ा रुझान दोबारा popular होने के आसपास, यह feature actual production code में कितना actively इस्तेमाल हुआ होगा—यह जानने की उत्सुकता है
पुरानी चीज़ फिर नई बन जाती है। मेरी पहली frontend role 1999 में web application बनाने की थी
treeview drag-and-drop, click-to-edit, और practically single-page app जैसी cool features तक सब कुछ “Vanilla” JS में बनाया था
सबसे मुश्किल हिस्सा Netscape और Internet Explorer के differences को reconcile करना था
क्यों अब ऐसा लगता है कि हमें वह करना आता ही नहीं ;]
इन दिनों मेरी पसंदीदा pure JavaScript feature Element.insertAdjacentHTML है, जो Chrome 1.0 और IE के दौर से मौजूद है
खासकर backticks वाली multi-line strings के साथ यह कितना उपयोगी है, कहना भी कम पड़ेगा। यकीन नहीं होता कि यह इतने पहले से मौजूद था और मुझे करीब 1 साल पहले ही पता चला
insertAdjacentHTML(position, text)दिए गए text को HTML या XML के रूप में parse करता है, और बने हुए nodes को DOM tree में दी गई position पर insert करता हैमूल DOM से यह करने के लिए
lielement बनाना,aelement बनाना, उसे child के रूप में जोड़ना,hrefattribute set करना, text value डालना और फिरulमें insert करना पड़ता था। या फिर बड़ी string बनाकरinnerHTMLमें डालना पड़ता था, और existing list को modify करना और भी painful और verbose था