← Back to HTML Course | Chapter 8: Modern HTML & Components | Lesson 4 of 10

HTML Web Components

सोचिए आप एक बड़ा Lego कैसल बना रहे हैं। अगर हर बार खिड़की जोड़ने के लिए आपको हर एक ईंट अलग से जोड़नी पड़े, तो इसमें घंटों लग जाएंगे। इसके बजाय, आप पहले से बने खिड़की के टुकड़े इस्तेमाल करते हैं, जिन्हें आप एक क्लिक में जगह पर फिट कर सकते हैं। HTML Web Components बिल्कुल यही करते हैं। ये आपको कस्टम, दोबारा इस्तेमाल किए जा सकने वाले HTML एलिमेंट्स (जैसे आपके अपने कस्टम टैग्स) बनाने देते हैं, जिनका अपना स्ट्रक्चर, डिज़ाइन, और बिहेवियर होता है। आप एक कॉम्प्लेक्स, इंटरैक्टिव विजेट को एक ही कस्टम टैग में पैकेज कर सकते हैं, और उस टैग को अपनी पूरी वेबसाइट पर एक स्टैंडर्ड पैराग्राफ या लिंक जितनी आसानी से इस्तेमाल कर सकते हैं।
Syntax
markup
class ElementName extends HTMLElement {
  connectedCallback() {
    this.innerHTML = "content";
  }
}
customElements.define("element-name", ElementName);

Web Components क्या हैं?

Web Components मॉडर्न वेब APIs का एक सेट हैं जो डेवलपर्स को ऐसे कस्टम, फिर से इस्तेमाल किए जा सकने वाले, और एनकैप्सुलेटेड HTML एलिमेंट्स बनाने देते हैं जो सभी वेब एप्लिकेशन्स में नेटिव रूप से काम करते हैं।

Note: भविष्य के HTML एलिमेंट्स के साथ टकराव रोकने के लिए कस्टम एलिमेंट नामों में हमेशा एक हाइफन होना चाहिए।
Warning: Web Components को अपना स्ट्रक्चर और बिहेवियर तय करने के लिए JavaScript चाहिए होती है, इसलिए अगर स्क्रिप्ट्स बंद हैं तो ये काम नहीं करेंगे।

उदाहरण: What are Web Components?

markup
<my-widget></my-widget>

Shadow DOM

Shadow DOM आपके कस्टम कंपोनेंट को अपना एक अलग, आइसोलेटेड DOM ट्री रखने देता है जो मुख्य पेज से पूरी तरह अलग होता है।

यह सुनिश्चित करता है कि आपके कंपोनेंट के अंदर की स्टाइल्स बाहर लीक न हों, और मुख्य पेज की स्टाइल्स गलती से आपके कंपोनेंट को न तोड़ें।

Note: अपने कंपोनेंट की स्टाइलिंग को ग्लोबल पेज स्टाइल नियमों से पूरी तरह आइसोलेटेड और सुरक्षित रखने के लिए Shadow DOM का उपयोग करें।
Warning: closed Shadow DOM के अंदर के एलिमेंट्स को स्टैंडर्ड ग्लोबल पेज स्क्रिप्ट्स से एक्सेस या स्टाइल नहीं किया जा सकता।

उदाहरण: The Shadow DOM

markup
<script>
  class MyWidget extends HTMLElement {
    constructor() {
      super();
      this.attachShadow({ mode: 'open' });
    }
  }
</script>

Custom Elements API

Custom Elements API का उपयोग आपके कस्टम HTML टैग्स को ब्राउज़र के साथ रजिस्टर करने के लिए किया जाता है। आप एक JavaScript क्लास लिखते हैं जो स्टैंडर्ड HTMLElement क्लास को एक्सटेंड करती है, और यह परिभाषित करती है कि जब आपका कस्टम टैग कॉल किया जाए तो कौन-सा HTML और स्टाइल्स रेंडर होने चाहिए।

Note: अपने कोडबेस को मॉड्यूलर रखने के लिए अपनी कस्टम एलिमेंट क्लासेस को अलग, साफ-सुथरी स्क्रिप्ट फाइल्स में परिभाषित करें।
Warning: अपने HTML में टैग को कॉल करने की कोशिश करने से पहले सुनिश्चित करें कि आपने window.customElements.define का इस्तेमाल करके अपना कस्टम एलिमेंट रजिस्टर किया है।

उदाहरण: The Custom Elements API

markup
<script>
  class MyWidget extends HTMLElement {}
  window.customElements.define('my-widget', MyWidget);
</script>
<my-widget></my-widget>

कंपोनेंट Attributes

आप स्टैंडर्ड HTML एट्रिब्यूट्स का उपयोग करके अपने Web Components को कस्टम डेटा वैल्यूज़ पास कर सकते हैं। इन एट्रिब्यूट्स में बदलावों को ऑब्ज़र्व और सुनकर, आप अपने कंपोनेंट को डायनामिक रूप से अपडेट कर सकते हैं।

Note: अपने कंपोनेंट्स को एट्रिब्यूट बदलावों के प्रति रिस्पॉन्सिव बनाने के लिए observedAttributes और attributeChangedCallback मेथड्स का उपयोग करें।
Warning: सभी एट्रिब्यूट वैल्यूज़ आपके कंपोनेंट को plain strings के रूप में पास की जाती हैं, इसलिए ज़रूरत पड़ने पर आपको इन्हें मैन्युअली दूसरे फॉर्मेट में बदलना होगा।

उदाहरण: Component Attributes

markup
<my-widget color="blue"></my-widget>
<script>
  class MyWidget extends HTMLElement {
    static get observedAttributes() { return ['color']; }
    attributeChangedCallback(name, oldVal, newVal) {
      console.log(name, newVal);
    }
  }
</script>

कंपोनेंट Templates

अपने कंपोनेंट के HTML मार्कअप को सीधे JavaScript स्ट्रिंग्स के अंदर लिखना अस्त-व्यस्त और मेंटेन करना मुश्किल हो सकता है।

template एलिमेंट का उपयोग करने से आप अपने कंपोनेंट के मार्कअप को अपनी HTML फाइल में साफ-सुथरे तरीके से परिभाषित कर सकते हैं, और जब आपकी कंपोनेंट क्लास चले तब उसे क्लोन कर सकते हैं।

Note: अपने कंपोनेंट के HTML स्ट्रक्चर को अपने JavaScript कोड से अलग रखने के लिए templates का उपयोग करें।
Warning: पेज लोड होने पर template का कंटेंट inert और छिपा रहता है, इसलिए इसे instantiate करने के लिए आपको अपनी स्क्रिप्ट के अंदर इसके node स्ट्रक्चर को clone करना होगा।

उदाहरण: Component Templates

markup
<template id="widget-template">
  <p>Reusable markup</p>
</template>
<script>
  const clone = document.getElementById('widget-template').content.cloneNode(true);
</script>

Custom Element Lifecycle Callbacks

कस्टम एलिमेंट्स खास lifecycle मेथड्स सपोर्ट करते हैं जो अहम पलों पर अपने-आप चलते हैं: connectedCallback तब चलता है जब एलिमेंट पेज में जोड़ा जाता है, disconnectedCallback तब चलता है जब उसे हटाया जाता है, और attributeChangedCallback तब चलता है जब भी उसके निगरानी में रखे किसी एट्रिब्यूट की वैल्यू बदलती है।

Note: इवेंट लिसनर सेट करने के लिए connectedCallback का, और एलिमेंट के हटाए जाने पर मेमोरी लीक्स रोकने के लिए उन्हें साफ करने में disconnectedCallback का उपयोग करें।
Warning: disconnectedCallback के अंदर event listeners हटाना भूल जाने से लंबे समय तक चलने वाले single page applications में memory leaks हो सकती हैं।

उदाहरण: Custom Element Lifecycle Callbacks

markup
<script>
  class MyWidget extends HTMLElement {
    connectedCallback() { console.log('added to page'); }
    disconnectedCallback() { console.log('removed from page'); }
  }
</script>

ब्राउज़र सपोर्ट और Polyfills

Custom elements और Shadow DOM, Chrome, Firefox, Safari, और Edge समेत सभी मॉडर्न ब्राउज़र्स में सपोर्टेड हैं, लेकिन Internet Explorer 11 जैसे बेहद पुराने ब्राउज़र्स इन्हें बिल्कुल भी सपोर्ट नहीं करते।

ऐसे पुराने ब्राउज़र्स को सपोर्ट करना ज़रूरी होने वाले प्रोजेक्ट्स के लिए, polyfill लाइब्रेरीज़ कुछ सीमाओं के साथ लगभग वैसा ही सपोर्ट जोड़ सकती हैं।

Note: Polyfills पर समय लगाने से पहले अपने असली विज़िटर एनालिटिक्स ज़रूर चेक करें — ज़्यादातर मॉडर्न ऑडियंस को अब इनकी बिल्कुल ज़रूरत नहीं होती।
Warning: web components के लिए polyfills आपके पेज में काफी अतिरिक्त स्क्रिप्ट वज़न जोड़ सकते हैं और हर edge case में नेटिव ब्राउज़र बिहेवियर को कभी पूरी तरह से रिप्लिकेट नहीं करते।

उदाहरण: Browser Support and Polyfills

markup
<script src="webcomponents-loader.js"></script>
<my-widget></my-widget>
Live Example
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.