JQuery में एक वैश्विक मूल्य (जरूरी नहीं कि एक वैश्विक चर) कैसे स्टोर करें?


80

वर्तमान में मैं एक विरासत वेब पेज पर काम कर रहा हूं जिसमें जावास्क्रिप्ट, jQuery, Microsoft क्लाइंट जावास्क्रिप्ट और अन्य पुस्तकालयों का एक टन उपयोग होता है। लब्बोलुआब यह है कि मैं स्क्रैच से पूरे पृष्ठ को फिर से नहीं लिख सकता क्योंकि व्यवसाय इसे सही नहीं ठहरा सकता। इसलिए, यह है जो यह है। वैसे भी, मुझे एक चर के साथ वैश्विक नाम स्थान को प्रदूषित करने की आवश्यकता है (मैंने वास्तव में बहुत कोशिश नहीं की है)। तीन विकल्प हैं जिनके बारे में मैं सोच रहा था -

  1. सामान्य जावास्क्रिप्ट घोषणा का उपयोग करके इसे स्टोर / पुनः प्राप्त करें - var x = 0;

  2. DOM टैग में मान को संग्रहीत / पुनः प्राप्त करने के लिए jQuery का उपयोग करें - $("body").data("x", 0);

  3. एक छिपे हुए फ़ॉर्म फ़ील्ड का उपयोग करें, और jQuery के साथ मान सेट / पुनः प्राप्त करें - $("whatever").data("x", 0);

क्या कोई बेहतर तरीका है? मैंने कोड के मौजूदा ढेर को देखा, और मुझे नहीं लगता कि किसी फ़ंक्शन में वेरिएबल को स्कोप किया जा सकता है।

जवाबों:


100

आप jQuery ऑब्जेक्ट के अंदर एक नाम स्थान बना सकते हैं, जैसे:

$.mynamespace = { 
    myVar : "something", 
    myVar2 : "somethingElse" 
}; 

या:

$.mynamespace = {};
$.mynamespace.myVar = "something";
$.mynamespace.myVar2 = "somethingElse";

ध्यान रखें, 'mynamespace' नाम की कोई भी प्लगइन विधि अधिलेखित हो जाएगी, इसलिए एक समझदार नाम का उपयोग करना सुनिश्चित करें।


1
क्यों नामस्थान चर jQuery की एक विशेषता के रूप में घोषित किया जाना चाहिए ?!
पेड्रो रोलो

5
@Pedro - यह होने की आवश्यकता नहीं है। मैं इसे केवल एक संभावना के रूप में इंगित कर रहा था।
करीम

यदि मैं इसका उपयोग करना चाहता हूं, तो मुझे कहां घोषित करना है? मेरा सभी जावास्क्रिप्ट कोड एक जेएस फाइल में है। मैं HTML कोड के साथ जावास्क्रिप्ट कोड नहीं मिलाना चाहता।
वंसफैनलाइन

यह एक मूर्खतापूर्ण समाधान है कि यह घोषित नामस्थान और jQuery ऑब्जेक्ट के चर और तरीकों के बीच संघर्ष का नाम है। मैं इस समाधान का मूल्य नहीं समझता। मेरे लिए, यह अच्छा नहीं है।
पेड्रो रोलो सेप

मैं सभी iframe फ़ॉर्म पैरेंट में इस वैश्विक चर का उपयोग कर सकता हूं?
थुलसीराम

39

मेरे लिए इस स्थिति को संभालने का सबसे अच्छा तरीका विंडो ऑब्जेक्ट में एक वस्तु को परिभाषित करना है:

window.my_config =
{
    my_var1 : 1,
    my_var1 : 2,
    my_var1 : 3
};

इससे आपका दायरा साफ और स्वच्छ रहेगा। और जब भी आप window.my_configकोड का उपयोग करते हुए किसी का उपयोग करके वैश्विक एक्सेस करेंगे, तो पता चलेगा कि वैश्विक एक्सेस किया जा रहा है।


4
यह मेरे लिए jquery नाम स्थान का उपयोग करने से अधिक समझ में आता है। क्या ऐसा कोई कारण है जो इस तरह से काम नहीं करेगा या बेहतर होगा?
डेमोन

6

आप वैश्विक दायरे में एक हैश बना सकते हैं और इसे एक नामस्थान के रूप में उपयोग कर सकते हैं:

MyNamepace={}
MyNamespace.newvar = 'value'
// MyNamespace.newvar => 'value'

यह एक मूर्खतापूर्ण समाधान है कि यह घोषित नाम स्थान और अन्य वैश्विक चर और विधियों के बीच संघर्ष का नाम है। मैं इस समाधान का मूल्य नहीं समझता। मेरे लिए, यह बेकार है।
tad

1
वैश्विक दायरे में कौन से नाम मौजूद हैं, इसका नियंत्रण आपके पास है, जबकि आपके पास उन तरीकों और चर नामों पर नियंत्रण नहीं है जिन्हें अपडेट के लिए jQuery में जोड़ा जा सकता है। यह उन मजबूत कारणों में से एक है जिनके कारण कई भाषाओं में नाम स्थान स्पष्ट रूप से मौजूद हैं। जब वे नहीं करते हैं, तो नाम अजीब होने लगते हैं (यानी: स्मॉलटाक-सिस्टम वर्ग-नाम)
पेड्रो रोलो सेप

4
हर बार नहीं। आपके हैश को ओवरराइड करने से कुछ दुष्ट लाइब्रेरी को रोकना कुछ भी नहीं है। संक्षेप में, आप स्पष्ट नाम स्थान के बिना समस्या से बच नहीं सकते । यही कारण है कि jQuery मॉड्यूल संलेखन दस्तावेज़ीकरण नामस्थान प्रयोजनों के लिए jQuery वस्तु में एक एकल हैश की सिफारिश करता है, क्योंकि jQuery नामस्थान डी वास्तविक लोकप्रिय प्लगइन्स के लिए प्रतिबंधित है।
tad

2

बस अपने अभ्यास को आपके साथ साझा करते हुए, मैं एक समझदार उपसर्ग के साथ आवश्यक जावास्क्रिप्ट फ़ाइल में एक वैश्विक वस्तु / संस्करण बनाऊंगा, जैसे कि अगर मैं उस पृष्ठ पर काम कर रहा हूं जहां यह वस्तु एक टेक्स्ट बॉक्स होगी तो मैं इसे नाम दूंगा:

g_TxtMyValue = 'value';    // g_ specifies it to be a global variable, it is one
                           // of the many conventions used

यदि आपके पास एक से अधिक वैश्विक चर हैं, तो आप एक नामस्थान भी रख सकते हैं जैसे:

my_txt = {};  // For a real site I would use a prefix relative to the project
              // name instead of "my".

my_txt.testValueOne = 'Value one';
my_txt.testValueOne = 'Value two';

ये वैरिएबल आपको आरंभिक रूप से उपलब्ध होने के बाद पूरी वेबसाइट पर उपलब्ध होंगे।

आशा है कि ये आपकी मदद करेगा।



0

बस एक छोटा नोटिस:

क्या फैंसीबॉक्स AJAX कर रहा है (जिसका अर्थ है: यदि यह iFrame के भीतर लोड होता है, तो आपको "माता-पिता" को बंद विधि में जोड़ना चाहिए), इस तरह:

parent.$.fancybox.close();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.