इस उत्तर के लिए, मैं का उल्लेख querySelectorऔर querySelectorAllquerySelector के रूप में * और करने के लिए getElementById, getElementsByClassName, getElementsByTagName, और getElementsByNamegetElement के रूप में *।
मुख्य अंतर
- querySelector * अधिक लचीला है, क्योंकि आप इसे किसी भी CSS3 चयनकर्ता को पारित कर सकते हैं, न कि केवल आईडी, टैग या कक्षा के लिए सरल।
- DOM के आकार के साथ querySelector का प्रदर्शन बदल जाता है जिस पर इसे लागू किया जाता है। * सटीक होने के लिए, querySelector * O (n) समय में चलने वाली कॉल और getElement * कॉल O (1) समय में चलती है, जहाँ n उस तत्व या दस्तावेज़ के सभी बच्चों की कुल संख्या है जिस पर इसे लागू किया जाता है। यह तथ्य कम से कम अच्छी तरह से जाना जाता है, इसलिए मैं इसे काट रहा हूं।
- getElement * कॉल DOM के लिए सीधे संदर्भ लौटाता है, जबकि querySelector * आंतरिक रूप से चयनित संदर्भों की प्रतियां उनके संदर्भ में लौटने से पहले बनाता है। इन्हें "लाइव" और "स्टैटिक" तत्वों के रूप में जाना जाता है। यह कड़ाई से संबंधित नहीं है कि वे किस प्रकार से लौटते हैं। यह बताने का कोई तरीका नहीं है कि मैं किसी तत्व को लाइव या स्टेटिक रूप से प्रोग्राम करता हूं, क्योंकि यह इस बात पर निर्भर करता है कि तत्व को किसी बिंदु पर कॉपी किया गया था या नहीं और यह डेटा की आंतरिक संपत्ति नहीं है। लाइव तत्वों में परिवर्तन तुरंत लागू होते हैं - एक जीवित तत्व को बदलने से यह सीधे DOM में बदल जाता है, और इसलिए JS की अगली पंक्ति उस परिवर्तन को देख सकती है, और यह उस तत्व को संदर्भित करने वाले किसी अन्य लाइव तत्व को तुरंत प्रसारित करता है। वर्तमान स्क्रिप्ट को निष्पादित करने के बाद स्थैतिक तत्वों में परिवर्तन केवल DOM पर वापस लिखा जाता है।
- इन कॉलों का रिटर्न प्रकार भिन्न होता है।
querySelectorऔर getElementByIdदोनों एक ही तत्व को लौटाते हैं। querySelectorAllऔर getElementsByNameHTMLCollection के फैशन से बाहर हो जाने के बाद, नए फ़ंक्शन होने के नाते, दोनों NodeLists को लौटाते हैं। पुराने getElementsByClassNameऔर getElementsByTagNameदोनों HTMLCollections लौटाते हैं। फिर, यह अनिवार्य रूप से अप्रासंगिक है कि क्या तत्व जीवित हैं या स्थिर हैं।
इन अवधारणाओं को निम्नलिखित तालिका में संक्षेपित किया गया है।
Function | Live? | Type | Time Complexity
querySelector | N | Element | O(n)
querySelectorAll | N | NodeList | O(n)
getElementById | Y | Element | O(1)
getElementsByClassName | Y | HTMLCollection | O(1)
getElementsByTagName | Y | HTMLCollection | O(1)
getElementsByName | Y | NodeList | O(1)
विवरण, टिप्स, और उदाहरण
HTMLCollections, NodeLists की तरह सरणी के समान नहीं हैं और .forEach () का समर्थन नहीं करते हैं। मुझे लगता है कि इस के आसपास काम करने के लिए उपयोगी प्रसार ऑपरेटर:
[...document.getElementsByClassName("someClass")].forEach()
प्रत्येक तत्व और वैश्विक document, को छोड़कर इन सभी कार्यों के लिए उपयोग किया जाता है getElementByIdऔर getElementsByName, जिन्हें केवल लागू किया जाता है document।
चेनिंग गेटईमेंट * क्वेरीस्लेक्टर * का उपयोग करने के बजाय कॉल * प्रदर्शन में सुधार करेगा, खासकर बहुत बड़े डोम पर। यहां तक कि छोटे डोम और / या बहुत लंबी श्रृंखलाओं के साथ, यह आमतौर पर तेज होता है। हालाँकि, जब तक आप जानते हैं कि आपको प्रदर्शन की आवश्यकता है, क्वेरीसलेक्टर * की पठनीयता को प्राथमिकता दी जानी चाहिए। querySelectorAllको फिर से लिखना कठिन है, क्योंकि आपको हर चरण में NodeList या HTMLCollection से तत्वों का चयन करना होगा। उदाहरण के लिए, निम्न कोड काम नहीं करता है:
document.getElementsByClassName("someClass").getElementsByTagName("div")
because you can only use getElements* on single elements, not collections. For example:
`document.querySelector("#someId .someClass div")`
could be written as:
document.getElementById("someId").getElementsByClassName("someClass")[0].getElementsByTagName("div")[0]
Note the use of `[0]` to get just the first element of the collection at each step that returns a collection, resulting in one element at the end just like with `querySelector`.
चूँकि सभी तत्वों में दोनों क्वेरीसेलर * और गेटइलमेंट * कॉल्स की पहुँच है, आप दोनों कॉल्स का उपयोग करके चेन बना सकते हैं, जो यदि आप कुछ परफॉरमेंस गेन चाहते हैं तो उपयोगी हो सकते हैं, लेकिन किसी ऐसे क्वेरीसेप्टर से नहीं बच सकते, जो गेटेमेंट * कॉल के संदर्भ में नहीं लिखा जा सकता है। ।
हालांकि यह आमतौर पर यह बताना आसान है कि क्या चयनकर्ता केवल getElement * कॉल का उपयोग करके लिखा जा सकता है, एक मामला है जो हो सकता है:
document.querySelectorAll(".class1.class2")
के रूप में फिर से लिखा जा सकता है
document.getElementsByClassName("class1 class2")
GetElement का उपयोग करके * querySelector * के साथ लाए गए एक स्थिर तत्व पर परिणामस्वरूप एक तत्व होगा, जो DOMS के स्थैतिक उपसमूह के संबंध में लाइव है, जिसे querySelector द्वारा कॉपी किया गया है, लेकिन पूर्ण दस्तावेज़ DOM के संबंध में नहीं है ... यह वह जगह है जहाँ सरल तत्वों की सजीव / स्थैतिक व्याख्या अलग होने लगती है। आपको शायद उन स्थितियों से बचना चाहिए जहां आपको इस बारे में चिंता करनी है, लेकिन यदि आप ऐसा करते हैं, तो याद रखें कि क्वेरीसेलेक्टर * उन प्रतिलिपि तत्वों को कॉल करता है जो उन्हें उनके संदर्भ में लौटने से पहले मिलते हैं, लेकिन getElement * कॉल नकल के बिना सीधे संदर्भ प्राप्त करते हैं।
न तो एपीआई निर्दिष्ट करता है कि कौन सा तत्व पहले चुना जाना चाहिए अगर कई मैच हों।
क्योंकि querySelector * DOM के माध्यम से iterates करता है जब तक कि उसे एक मैच नहीं मिलता है (मुख्य अंतर # 2 देखें), इसका मतलब यह भी है कि आप DOM में जिस तत्व की तलाश कर रहे हैं, उस पर भरोसा नहीं कर सकते हैं यह गारंटी देने के लिए कि यह जल्दी मिल गया है - ब्राउज़र DOM के माध्यम से पीछे की ओर, आगे, गहराई पहले, चौड़ाई पहले, या अन्यथा हो सकता है। getElement * अभी भी उनके प्लेसमेंट की परवाह किए बिना समय की एक ही राशि में तत्व पाएंगे।