लघु और सरल: क्योंकि आप जिन तत्वों की तलाश कर रहे हैं, वे दस्तावेज़ (अभी तक) में मौजूद नहीं हैं।
इस उत्तर के शेष के लिए मैं getElementById
उदाहरण के रूप में उपयोग करूंगा , लेकिन यह उसी पर लागू होता है getElementsByTagName
, querySelector
और कोई अन्य DOM विधि जो तत्वों का चयन करती है।
संभावित कारण
एक तत्व मौजूद नहीं होने के दो कारण हो सकते हैं:
दस्तावेज़ में वास्तव में पारित आईडी वाला एक तत्व मौजूद नहीं है। आपको इस बात की दोहरी जांच करनी चाहिए कि आप जिस आईडी को पास करते हैं getElementById
, वह (उत्पन्न) HTML में किसी मौजूदा तत्व की आईडी से मेल खाती है और आपने आईडी को मिस नहीं किया है (आईडी केस-सेंसिटिव हैं !)।
संयोग से, समकालीन ब्राउज़रों के बहुमत में , जो लागू करते हैं querySelector()
और querySelectorAll()
विधियां, सीएसएस-शैली संकेतन का उपयोग इसके द्वारा एक तत्व को पुनः प्राप्त करने के लिए किया जाता है id
, उदाहरण के लिए: document.querySelector('#elementID')
जिस विधि से कोई तत्व इसके id
तहत प्राप्त होता है, उसके विपरीत document.getElementById('elementID')
; पहले #
चरित्र में आवश्यक है, दूसरे में यह तत्व को पुनः प्राप्त नहीं किया जाएगा।
आपके द्वारा कॉल किए जाने के समय तत्व मौजूद नहीं है getElementById
।
बाद का मामला काफी सामान्य है। ब्राउज़र पार्स करते हैं और HTML को ऊपर से नीचे तक प्रोसेस करते हैं। इसका अर्थ है कि DOM तत्व जो HTML में दिखाई देता है उससे पहले होने वाले DOM तत्व के लिए कोई भी कॉल विफल हो जाएगी।
निम्नलिखित उदाहरण पर विचार करें:
<script>
var element = document.getElementById('my_element');
</script>
<div id="my_element"></div>
के बादdiv
दिखाई देता है । फिलहाल स्क्रिप्ट निष्पादित हो गई है, तत्व अभी तक मौजूद नहीं है और वापस आ जाएगा ।script
getElementById
null
jQuery
यही बात jQuery के साथ सभी चयनकर्ताओं पर लागू होती है। jQuery के तत्व नहीं मिलेंगे यदि आपने अपने चयनकर्ता को गलत बताया या आप वास्तव में मौजूद होने से पहले उन्हें चुनने की कोशिश कर रहे हैं ।
एक जोड़ा मोड़ तब है जब jQuery नहीं मिला है क्योंकि आपने स्क्रिप्ट को प्रोटोकॉल के बिना लोड किया है और फ़ाइल सिस्टम से चल रहा है:
<script src="//somecdn.somewhere.com/jquery.min.js"></script>
इस सिंटैक्स का उपयोग प्रोटोकॉल https: // वाले पृष्ठ पर HTTPS के माध्यम से स्क्रिप्ट को लोड करने और प्रोटोकॉल http: // वाले पृष्ठ पर HTTP संस्करण को लोड करने की अनुमति देने के लिए किया जाता है।
यह लोड करने का प्रयास और असफल होने का दुर्भाग्यपूर्ण दुष्प्रभाव है file://somecdn.somewhere.com...
समाधान
इससे पहले कि आप getElementById
(या उस मामले के लिए कोई DOM विधि) को कॉल करें , सुनिश्चित करें कि जिन तत्वों को आप एक्सेस करना चाहते हैं, वे मौजूद हैं, यानी DOM लोड है।
यह आपके DOM को तत्सम DOM तत्व के बाद डालकर सुनिश्चित किया जा सकता है
<div id="my_element"></div>
<script>
var element = document.getElementById('my_element');
</script>
जिस स्थिति में आप कोडिंग बॉडी टैग ( </body>
) से ठीक पहले कोड डाल सकते हैं (सभी DOM तत्व स्क्रिप्ट निष्पादित होने के समय उपलब्ध होंगे)।
अन्य समाधानों में load
[एमडीएन] या DOMContentLoaded
[एमडीएन] घटनाओं को सुनना शामिल है । इन मामलों में यह कोई फर्क नहीं पड़ता कि आप जावास्क्रिप्ट कोड को दस्तावेज़ में कहाँ रखते हैं, आपको बस इवेंट हैंडलर में सभी DOM प्रोसेसिंग कोड को याद रखना होगा।
उदाहरण:
window.onload = function() {
// process DOM elements here
};
// or
// does not work IE 8 and below
document.addEventListener('DOMContentLoaded', function() {
// process DOM elements here
});
कृपया इवेंट हैंडलिंग और ब्राउज़र अंतर के बारे में अधिक जानकारी के लिए quirksmode.org पर लेख देखें ।
jQuery
पहले सुनिश्चित करें कि jQuery ठीक से लोड किया गया है। ब्राउज़र की डेवलपर टूल का उपयोग पता लगाने के लिए कि क्या jQuery फ़ाइल मिला था और URL सही है, तो यह नहीं था (जैसे जोड़ने http:
या https:
शुरुआत में योजना, पथ आदि को समायोजित)
load
/ DOMContentLoaded
घटनाओं को सुनना ठीक वही है जो jQuery .ready()
[डॉक्स] के साथ कर रहा है । आपका सभी jQuery कोड जो DOM एलिमेंट को प्रभावित करता है, उस ईवेंट हैंडलर के अंदर होना चाहिए।
वास्तव में, jQuery ट्यूटोरियल स्पष्ट रूप से बताता है:
जब हम jQuery का उपयोग करते हुए या डॉक्यूमेंट ऑब्जेक्ट मॉडल (DOM) का उपयोग करते हुए लगभग सब कुछ करते हैं, तो हमें यह सुनिश्चित करने की आवश्यकता है कि जैसे ही DOM तैयार हो, हम ईवेंट आदि जोड़ना शुरू करें।
ऐसा करने के लिए, हम दस्तावेज़ के लिए एक तैयार घटना दर्ज करते हैं।
$(document).ready(function() {
// do stuff when DOM is ready
});
वैकल्पिक रूप से आप शॉर्टहैंड सिंटैक्स का भी उपयोग कर सकते हैं:
$(function() {
// do stuff when DOM is ready
});
दोनों बराबर हैं।