2013-12-11 13 views
7

पिछले कुछ वर्षों में मैं हमेशा एक क्लाइंट-साइड छिपा <input> क्षेत्र का इस्तेमाल किया है एक सर्वर साइड मूल्य की दुकान और जावास्क्रिप्ट देश में इसका इस्तेमाल करने के लिए महत्व देता है।जावास्क्रिप्ट सर्वोत्तम प्रथाओं - सर्वर साइड का उपयोग

उदाहरण के लिए, मान लें कि मुझे अपने ऐप कॉन्फ़िगरेशन से अजाक्स टाइमआउट मान की आवश्यकता है।

मैं शायद अपने JSP में इस तरह की दुकान चाहते हैं:

<input type="hidden" id="ajaxTimeout" value="${serverValue}" />

और फिर इस जहाँ मेरे AJAX कॉल एक बाहरी फ़ाइल में रहते थे की तरह उपयोग:

$("#ajaxTimeout").val() 

मैं था आज इस बारे में चर्चा कर रही है और यह सुझाव दिया गया था कि एचटीएमएल <meta> टैग के भीतर जावास्क्रिप्ट द्वारा उपयोग किए जा रहे मूल्यों को स्टोर करना सबसे अच्छा अभ्यास है।
क्या इससे कोई फर्क पड़ता है? सर्वर-साइड जानकारी प्राप्त करने का कोई पसंदीदा तरीका है जो पूरी तरह से जावास्क्रिप्ट में उपयोग किया जा रहा है?
मेरी समझ यह है कि यदि छुपा इनपुट फ़ील्ड किसी फॉर्म का हिस्सा नहीं है तो यह स्टोर को स्टोर करने के लिए उपयोग करने के लिए पर्याप्त सुरक्षित है क्योंकि यह किसी भी अनुरोध से जुड़ा नहीं होगा। ऐसा कहकर, मैंने हमेशा सोचा है कि यह वास्तव में एक हैक का थोड़ा सा था।

विचार?

:: संपादित ::
दो शानदार जवाब:

  • उपयोग की वस्तुओं के लिए सामान्य रूप में पन्ने की डेटा है कि किसी विशेष DOM एलीमेंट से बंधी नहीं है शाब्दिक। http://www.w3.org/TR/2010/WD-html5-20101019/elements.html#attr-data

उत्तर

3

हम व्यक्तिगत रूप से कुछ इस तरह करते हैं:

  • डेटा उपयोग डोम तत्वों से बंधा कस्टम डेटा स्टोर करने के लिए जिम्मेदार बताते हैं

    var options = { 
        selector: '#divId', 
        serverSideVariableHere: <%=AspNetProperty %>, 
        anotherServerSideVariableHere: <%=AspNetPropertyTwo %> 
    } 
    var viewModel = new KnockoutViewModel(options); 
    ko.applyBindings(viewModel, $(options.selector)[0]); 
    

    यह केवल पीटा जे एस का उपयोग कर एक उदाहरण है, लेकिन इस विचार हो सकता है (या नहीं;))

    हम तो इस तरह के नॉकआउट ViewModels, या जो कुछ भी इन विकल्पों को जो कुछ भी उन्हें इस्तेमाल, पारित आप का उपयोग करने के लिए चुन किसी भी JavaScript लाइब्रेरी का विस्तार किया। इस तरह हमारी जावास्क्रिप्ट टेस्टेबल बनी हुई है और हम अपने परीक्षणों के लिए जो भी मूल्य चाहते हैं उसे पारित कर सकते हैं।

  • +0

    मैं बैकबोन + रेल बैक-एंड में भी ऐसा ही। उदाहरण के लिए, CurrentUser के बारे में कुछ प्रासंगिक जानकारी के लिए, हम इसे लेआउट में करते हैं: var window.AppName.currentUser = new AppName.Model.CurrentUser ($। ParseJSON (<% = jps% में वर्तमान विशेषताओं को डंप करें])) ; – Enders

    +2

    बस जागरूक रहें कि एएसपी क्लासिक या Asp.Net वेबसाइट में, एएसपी पार्सर के माध्यम से .js फ़ाइलों को चलाने के लिए अतिरिक्त कार्रवाई की आवश्यकता है - इसलिए कुछ अतिरिक्त सेटअप की आवश्यकता है। इसमें एक संभावित (हालांकि संभवतः छोटा) प्रदर्शन निहितार्थ है। – ErikE

    +0

    दूसरी ओर, आपको '

    1

    ब्राउज़र मेटा "निर्देश" के अलावा कुछ के लिए meta टैग का उपयोग करना एक हैक के कम नहीं IMO है।

    मैं जावास्क्रिप्ट ऑब्जेक्ट्स का उपयोग करते हुए जावास्क्रिप्ट में जावास्क्रिप्ट डेटा संग्रहीत करने पर विचार करता हूं।

    4

    अन्य उत्तरों में दिए गए सादे पुराने ऑब्जेक्ट शाब्दिक विधि के अतिरिक्त, यदि आप क्लाइंट को जो वैल्यू पास करना चाहते हैं, वह एक विशिष्ट डीओएम तत्व है (या एक डोम तत्व है जो तार्किक ऑब्जेक्ट का प्रतिनिधित्व करता है जो मान है के बारे में), तो आपको एक डेटा विशेषता में मान डाल सकते हैं:

    <div id="videoplayer" data-startplayingat="1:02">HTML Content</div> 
    

    यह एक पूरी विशेषता के रूप में पहुँचा जा सकता है, data-startplayingat, या आधुनिक ब्राउज़रों में है dataset विशेषता। jQuery वाक्यविन्यास $('#videoplayer').data('startplayingat') है।

    official W3C spec on data attributes यह सब बताता है।

    • नाम अपर केस अक्षरों का उपयोग नहीं करना चाहिए, और XML संगत होना चाहिए:

      यहाँ कुछ दिलचस्प मुख्य आकर्षण हैं।

    • dataset विशेषता डैश को परिवर्तित करती है, जैसे start-playing जैसे नाम startPlaying बन जाएंगे।

    एक वस्तु शाब्दिक विधि (जो मुझे पसंद है और अपने आप का इस्तेमाल किया है) के लिए संभावित दोष यह है कि अगर आप एक .js फ़ाइल में वस्तु चाहते हैं, तो सामान्य रूप से स्थिर जावास्क्रिप्ट फ़ाइलें आपके गतिशील parser- के माध्यम से चलाने के लिए है - जो एक संभावित छोटे (लेकिन अभी भी मौजूद) प्रदर्शन नुकसान का कारण बन जाएगा। किसी HTML फ़ाइल में ऑब्जेक्ट घोषणा को <script> टैग में डालकर इस पर काम करता है, लेकिन फिर आपके पास स्क्रिप्ट लोड ऑर्डर समस्याएं हो सकती हैं।

    +0

    उत्कृष्ट। मैं इस विधि को पसंद करूंगा। दिखाता है कि यह कितना समय है जब से मैंने कोई जेएसपी/एएसपी/PHP सामान लिखा था .... – ZenMaster

    +0

    AJAX टाइमआउट मान (या किसी भी मूल्य जो किसी विशिष्ट डीओएम से बंधे नहीं है) का उदाहरण उपयोग करना, क्या यह अभी भी लायक होगा किसी वस्तु को अक्षर के बजाय इस मान को स्टोर करने के लिए एक div बनाकर और डेटा विशेषता का उपयोग करना? –

    +0

    @wild_nothing मुझे नहीं लगता कि डेटा विशेषताओं का उपयोग उन चीज़ों के लिए होना चाहिए जो कम से कम तार्किक रूप से एक DOM तत्व से जुड़े हुए हैं। मैं सामान्य इन-पेज डेटा के लिए उनका उपयोग नहीं करना चाहता हूं। एजेक्स टाइमआउट जैसे कुछ के लिए ऑब्जेक्ट शाब्दिक मेरी प्राथमिकता होगी। मैं सिर्फ आपको जवाबों का एक पूरा सेट प्रदान करना चाहता था ... – ErikE

    1

    I दृढ़ता सेdata- विशेषताओं में JSON स्निपेट पसंद करते हैं। इससे आप उन्हें संबंधित HTML तत्व में स्थानांतरित कर सकते हैं, और आप अपने जावास्क्रिप्ट वैश्विक नामस्थान को प्रदूषित नहीं करते हैं, या अन्यथा नेमस्पेसिंग को संभालने के लिए अतिरिक्त कोड उत्पन्न करना होगा। सर्वर पक्ष पर एक JSON serialiser के साथ युग्मित यह आपके मूल्यों में मैन्युअल रूप से कुछ भी बचने के लिए कम से कम है।

    (इसके अलावा, मैं सामान्य। देखें और तर्क जुदाई और जो कुछ में सामग्री के साथ <script> टैग के खिलाफ एक बात ™ है।)

    +0

    यकीन नहीं है कि मेरे पास स्निपेट होंगे, क्योंकि आपको उन्हें 'eval' करना होगा, लेकिन 'डेटा-' विशेषता निश्चित रूप से एक अच्छा तरीका है। – ZenMaster

    +0

    @ZenMaster - गैर-evalling JSON पार्सिंग जावास्क्रिप्ट 1.7 का एक मानक हिस्सा है और आप जितना चाहें उतना ब्राउज़र पर उपलब्ध: http://caniuse.com/#feat=json। (पुराने लोगों के लिए आपके पास क्रॉकफ़ोर्ड का 'json2.js' है।) – millimoose

    +0

    एक और छोटा सा फायदा यह है कि यह jQuery के स्वचालित प्रकार रूपांतरण को मजबूर करेगा जो यह किसी अन्य, संभावित रूप से गलत अनुमान बनाने के बजाय JSON पार्सिंग का उपयोग करने के लिए '.data()' में करता है। । – millimoose

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