2010-02-18 13 views
40

बाहर प्रारंभ जब मैं इस तरह कोड का उपयोग करें, यह ठीक काम करता है:चर नहीं सुलभ जब समारोह

function removeWarning() { 
    var systemStatus = document.getElementById("system-status"); 
    systemStatus.innerHTML = ""; 
} 

function indicateInvalidUsername() { 
    var systemStatus = document.getElementById("system-status"); 
    systemStatus.innerHTML = "Invalid username"; 
} 

हालांकि, जब मैं तो systemStatus स्थानांतरित करने के लिए एक वैश्विक चर होना चाहते हैं, यह काम नहीं करता:

var systemStatus = document.getElementById("system-status"); 

function removeWarning() { 
    systemStatus.innerHTML = ""; 
} 

function indicateInvalidUsername() { 
    systemStatus.innerHTML = "Invalid username"; 
} 

क्या मैं यहाँ क्या कर रही किया जाना चाहिए?

+22

मेरा अनुमान है कि आपका 'स्क्रिप्ट' टैग पृष्ठ के शीर्ष पर है, इसलिए जब इसे निष्पादित किया जाता है, तो 'document.getElementById ("system-status") '' null' देता है क्योंकि यह अभी तक मौजूद नहीं है, क्योंकि डीओएम को पार्स किया जा रहा है ... – CMS

उत्तर

27

सुनिश्चित करें कि आप किसी भी कोड ब्लॉक के बाहर "रूट" स्तर पर चर घोषित करें।

आप var को पूरी तरह से हटा सकते हैं, हालांकि यह not recommended है और "सख्त" चेतावनी फेंक देगा।

documentation at MDC के अनुसार, आप window.variablename का उपयोग करके वैश्विक चर सेट कर सकते हैं।

+5

+1 'window.variablename' –

6

मेरा अनुमान है कि system-status तत्व घोषित घोषणा के बाद घोषित किया गया है। इस प्रकार, उस समय परिवर्तनीय घोषित किया जाता है, यह वास्तव में शून्य पर सेट किया जा रहा है?

आप यह घोषणा केवल, तो, बजाय एक onLoad हैंडलर से अपने मूल्य आवंटित क्योंकि तब आप यकीन है कि यह ठीक से प्रारंभ किया गया है (लोड) हो जाएगा चाहिए सवाल में तत्व।

आप पृष्ठ के निचले हिस्से में स्क्रिप्ट डालने का प्रयास भी कर सकते हैं (या कम से कम system-status तत्व घोषित किए जाने के बाद कहीं भी) लेकिन यह हमेशा काम करने की गारंटी नहीं है।

6

सिस्टम को एक बाहरी दायरे में स्टेटस घोषित करें और इसे एक ऑनलोड हैंडलर में असाइन करें।

systemStatus = null; 

function onloadHandler(evt) { 
    systemStatus = document.getElementById("...."); 
} 

या यदि आप अधिभार हैंडलर नहीं चाहते हैं, तो अपने स्क्रिप्ट टैग को अपने HTML के नीचे रखें।

38

यह वास्तव में इस पर निर्भर करता है कि आपका जावास्क्रिप्ट कोड कहां स्थित है।

समस्या शायद डोम की वजह से जब लाइन

var systemStatus = document.getElementById("system-status"); 

निष्पादित किया जाता है लोड नहीं किया जा रहा है। आप इसे एक ऑनलोड ईवेंट में कॉल करने का प्रयास कर सकते हैं, या आदर्श रूप से एक जावास्क्रिप्ट ढांचे से एक डोम तैयार प्रकार की घटना का उपयोग कर सकते हैं।

+1

+1 सुझाव देने के लिए +1 यह आपकी समस्या है। आपका वाक्यविन्यास (अलगाव में, वैसे भी) ठीक काम करना चाहिए। –

+0

अपने एचटीएमएल के अंत में स्क्रिप्ट रखना भी काम कर सकता है, लेकिन यह निश्चित रूप से सबसे कामुक समाधान नहीं है :) – MLefrancois

+4

कभी-कभी मैं एसओ समुदाय को नहीं समझता: मैंने कहा कि समस्या मेरे प्रस्तावित उत्तर में दौड़ की स्थिति थी और इसे मिला नीचे मतदान किया गया ... और अब मुझे लगता है कि स्वीकृत प्रतिक्रिया प्रभावी ढंग से "दौड़ की स्थिति" है ... – jldupont

2

एक वैश्विक चर सबसे अच्छा एक बाहरी जावास्क्रिप्ट फ़ाइल में व्यक्त किया जाएगा:

var system_status; 

यकीन है कि यह कहीं और उपयोग नहीं किया गया बनाओ। फिर अपने पृष्ठ पर चर का उपयोग करने के लिए, बस इसे इस तरह संदर्भित करें। कहते हैं, उदाहरण के लिए, आप एक पाठ बॉक्स पर परिणामों में भरने के लिए,

document.getElementById("textbox1").value = system_status; 

यह सुनिश्चित करें कि वस्तु मौजूद है, jQuery के दस्तावेज़ तैयार सुविधा का उपयोग करना चाहता था।

उदाहरण:

$(function() { 
    $("#textbox1")[0].value = system_status; 
}); 
+2

हाइफ़न परिवर्तनीय नामों में कानूनी वर्ण नहीं हैं। जावास्क्रिप्ट इंजन दो चर, 'सिस्टम' और' स्टेटस 'की तलाश करेगा, और अंतर को वापस करने का प्रयास करेगा, क्योंकि बाइटरी ऑपरेटरों से निपटने के दौरान व्हाइटस्पेस कोई फर्क नहीं पड़ता (यानी: '5 - 3'' 5- 3')। –

+0

ठीक है इसे संशोधित करने के लिए संशोधित किया गया है, अच्छा पकड़ –

2

एक वैश्विक चर जो बंद DOM तत्व के कुछ चीजें जाँच की जानी चाहिए आधारित है परिभाषित करने के लिए।सबसे पहले, यदि कोड <head> अनुभाग में है, तो DOM निष्पादन पर लोड नहीं होगा। इस मामले में, एक ईवेंट हैंडलर चर सेट करने के लिए रखा जाना चाहिए के बाद डोम लोड किया गया है, इस तरह:

var systemStatus; 
window.onload = function(){ systemStatus = document.getElementById("system_status"); }; 

हालांकि, अगर इस स्क्रिप्ट डोम लोड होने पर पेज में इनलाइन है, तो यह तब तक किया जा सकता है जब तक प्रश्न में डीओएम तत्व ऊपर लोड हो गया हो जहां स्क्रिप्ट स्थित है। ऐसा इसलिए है क्योंकि जावास्क्रिप्ट सिंक्रनाइज़ रूप से निष्पादित करता है। यह वैध होगा:

<div id="system_status"></div> 
<script type="text/javascript"> 
var systemStatus = document.getElementById("system_status"); 
</script> 

बाद उदाहरण के परिणामस्वरूप, अधिकांश पृष्ठों जो शरीर में स्क्रिप्ट चलाने के लिए उन्हें दस्तावेज़ के बहुत अंत तक बचाने के। यह पृष्ठ को लोड करने की अनुमति देगा, और फिर जावास्क्रिप्ट को निष्पादित करने के लिए जो अधिकांश मामलों में डीओएम की दृष्टि से तेजी से प्रतिपादन का कारण बनता है।

4

This article ऐसी समस्याओं का उत्तर है! ;) इसे ध्यान से पढ़ें!

संबंधित मुद्दे