2009-06-01 8 views
8

मैं एक ऐसे वेब एप्लिकेशन पर काम कर रहा हूं जो सर्वर से संवाद करने के लिए AJAX का उपयोग करता है। मेरी विशिष्ट स्थिति निम्न है:एचटीएमएल और जावास्क्रिप्ट: एचटीएमएल तत्वों का संदर्भ देने वाले डेटा को कैसे स्टोर करें

मेरे पास HTML पृष्ठ में उपयोगकर्ताओं की एक सूची है। इन उपयोगकर्ताओं में से प्रत्येक पर मैं निम्नलिखित कार्य कर सकता हूं: खाते से उन्हें 'स्थिति' या 'हटाएं' बदलें।

क्या निम्नलिखित के बारे में पेज में जानकारी संग्रहीत करने के लिए एक अच्छा अभ्यास है:

  • प्रयोक्ता आईडी
  • उपयोगकर्ता

पी.एस की वर्तमान स्थिति .: मैं jQuery का उपयोग कर रहा हूँ।

उत्तर

5

शायद कस्टम विशेषताओं का उपयोग कर, तो एक उपयोगकर्ता के सूची तत्व के लिए, चर के लिए विशेषताओं को जोड़ने:

$("li").attr("uid") 

और

:

<li uid="theuserid" ustatus="thestatus"></li> 

मूल्यों तो attr समारोह के साथ मिल किया जा सकता है

$("li").attr("ustatus") 

नोट: चयनकर्ताओं Wil मुझे बदलने की जरूरत है, जाहिर है

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

+1

कस्टम कार्य को प्रारंभिक मानते है, लेकिन XHTML संगत –

+1

हाँ, पर नहीं कर रहे हैं जब यह करने के लिए नीचे आता है, जो अधिक वांछनीय है - जो है कुछ है कि काम करता है, और काफी तेज है, या कुछ और शिकायत? – Kazar

+0

@activa और @Kazar मेटाडेटा प्लगइन के साथ अनुपालन और वांछनीय क्यों नहीं है? –

1

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

आप किसी विशेष तत्व की कक्षा में डेटा स्टोर कर सकते हैं। अपने सीएसएस को चलाने के लिए अतिरिक्त कक्षा प्रदान करने में सक्षम होने के लिए इसमें अतिरिक्त रैपर तत्वों की आवश्यकता हो सकती है। यह स्टेरियल सामग्री प्रारूप को भी प्रतिबंधित करता है। उपयोगकर्ता आईडी कक्षा गुण में अच्छी तरह फिट हो सकती है।

आप जावास्क्रिप्ट सक्रिय लिंक के एक अप्रयुक्त href में डेटा स्टोर कर सकते हैं। रोलओवर पर यूआरएल के हिस्से के रूप में स्टेटस बार में डेटा दिखाने की अतिरिक्त सुविधा है। उदाहरण के लिए आप href में '#userid' या यहां तक ​​कि 'userid' स्टोर कर सकते हैं।

आप अतिरिक्त तत्वों में डेटा स्टोर कर सकते हैं। उदाहरण के लिए आपके पास एक कक्षा के साथ घोंसला वाला div हो सकता है जो भंडारण को इंगित करता है जो प्रदर्शन को तत्व से बाहर ले जाने के लिए सीएसएस को ट्रिगर करता है। यह सबसे सामान्य और व्यापक समर्थन है जिसे आप शायद पृष्ठ में व्यवस्थित कर सकते हैं।

एक नेस्टेड div की बजाय आप नेस्टेड इनपुट टैग का उपयोग टाइप = "छुपा" के साथ भी कर सकते हैं। यह अधिक अपेक्षित/पारंपरिक है और उन्हें प्रदर्शन से बाहर ले जाने के लिए सीएसएस की आवश्यकता नहीं है। आप इन इनपुट की पहचान करने के लिए आईडी विशेषता का उपयोग कर सकते हैं, या आप पृष्ठ पर स्थान का उपयोग कर सकते हैं। उदाहरण के लिए, उन्हें उस लिंक के अंदर रखें जो उपयोगकर्ता क्लिक करता है और उसके बाद केवल ऑनक्लिक हैंडलर में वर्तमान लिंक के अंदर खोजें।

5

jQuery डाटा

आप एक jQuery वस्तु के खिलाफ कस्टम डेटा स्टोर करने के लिए चाहते हैं, data function का उपयोग करें।

$('#myField').data('name', 'Jack'); 
var name = $('#myField').data('name'); 

एचटीएमएल 5 डेटा- * विशेषताएं

तुम भी एचटीएमएल 5 data-* विशेषताओं का उपयोग कर सकते हैं, हालांकि इन तक पहुँचने के एपीआई केवल आंशिक रूप से विभिन्न ब्राउज़रों द्वारा समर्थित हैं। Here's some more information about that

<div data-userid="123" class="user-row"> 
प्रोग्राम के रूप में

:

$('#myElement').attr('data-fruit', 'apple'); 
// or 
document.getElementById('myElement').dataset.fruit = 'apple'; 

छिपे हुए फील्ड्स

आप चीजों को पुराने ब्राउज़र-संगत तरीके से करना चाहते हैं और मेटाडाटा अपने html में सीधे सामान हैं, तो आप छिपा क्षेत्रों का उपयोग कर सकते हैं । यह थोड़ा क्रूडर है लेकिन करने में काफी आसान है।

<input type="hidden" name="UserID" value="[userid]" /> 

आप आसानी से अपने सूची क्वेरी और html ब्लॉक कि उपयोगकर्ता आइटम नहीं हैं कि प्रासंगिक छुपी फ़ील्ड कि मेटाडाटा आप के लिए जानना चाहते हैं से मेल खाने वाली खोजने के लिए jQuery selectors उपयोग कर सकते हैं।

+0

मैं सहमत हूं ... यदि जावास्क्रिप्ट भूमि में, jQuery डेटा फ़ंक्शन का उपयोग करें। यदि शुद्ध HTML भूमि में, यह विधि 'डेटा-' प्रीफ़िक्स्ड या कस्टम HTML विशेषताओं से बेहतर है, क्योंकि वे ब्राउज़र में पूरी तरह से समर्थित नहीं हैं। इसके अलावा, वे बदबू आ रही है। छुपा इनपुट टैग एक क्रोधित समाधान है, लेकिन यह शायद सबसे अच्छा समाधान है - और अभी भी एक्सएचटीएमएल अनुपालन। – BMiner

17

jQuery के डेटा समारोह

$('li').data('userid',uid); // sets the value of userid 
uid = $('li').data('userid'); // retrieves the value of userid 

आधिकारिक दस्तावेज नहीं है: http://docs.jquery.com/Data

+7

जबकि मैं मानता हूं कि डेटा फ़ंक्शन उन डोम तत्वों में डेटा संग्रहीत करने का एक अच्छा तरीका है, फिर भी उस डेटा को सर्वर से पहले स्थान पर jquery में लाने की समस्या है। – Kazar

+1

यह मेरी चिंता भी है ... मुझे अभी भी डोम तत्व की पहचान करने का एक तरीका चाहिए ताकि मैं डेटा संलग्न कर सकूं। साथ ही, मेरा मानना ​​है कि मुझे सभी शुरुआती मूल्यों को स्टोर करने के लिए एक अलग जावास्क्रिप्ट संरचना रखने की आवश्यकता है। – Dan

+1

ठीक है, मुझे आपकी समस्या का दायरा नहीं पता था। टीएम के जवाब पर एक नज़र डालें। – Rob

2

इस मामले में, मुझे लगता है कि कस्टम विशेषताओं overkill हो सकता है। आप उपयोगकर्ता-आईडी को आईडी-सामग्री में संग्रहीत कर सकते हैं, क्योंकि सूची में उपयोगकर्ता का केवल एक उदाहरण होगा, है ना? साथ ही, उपयोगकर्ता की स्थिति कक्षा-संग्रह में संग्रहीत की जा सकती है। इस तरह, प्रत्येक उपयोगकर्ता को सीएसएस में अलग स्टाइल दिया जा सकता है, जैसे सक्रिय के लिए हरा, एक गैर-सक्रिय खाते के लिए पीला, और एक निलंबित खाते के लिए लाल।

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

<ul id="users"> 
    <li id="someUserId" class="someStatus">Some Username</li> 
    <li id="someOtherUserId" class="someOtherStatus">Some Username</li> 
</ul> 

यह आप आसानी से की एक बहुत कुछ का चयन करने के लिए अनुमति देता है:

<ul id="userList"> 
    <li id="uid123" class="active">UserName X</li> 
    <li id="uid456" class="suspended">Mr. Troll</li> 
</ul> 

/** 
* Simple function for searching (strict) for a value in an array 
* @param array arr The array to look in 
* @param mixed val The value to look for in arr. Note that the value is looked for using strict comparison 
* @return boolean true if val is found in arr, else false 
*/ 
function searchArray(arr, val) { 
    for(var i = 0, len = arr.length; i < len; i++) { 
     if(arr[i] === val) { 
      return true; 
     } 
    } 
    return false; 
} 

/** 
* Gets a known status from a string of class names. Each class name should be separated 
* by a space. 
* @param string classNames The string to check for a known status 
* @return string|false The status if found in classNames, else false 
*/ 
function getStatus(classNames) { 
    // The different statuses a user can have. Change this into your own! 
    var statuses = ['active', 'suspended', 'inactive'], 
     nameArr = classNames.split(" "); 
    for(var i = 0, nameLen = nameArr.length; i < nameLen; i++) { 
     // If we find a valid status among the class names, return it 
     if(searchArray(statuses, nameArr[i])) { 
      return nameArr[i]; 
     } 
    } 
    return false; // We didn't find any known status in classNames 
} 

var id = $("li").attr("id"); // Fetches the id for the first user 
var status = getStatus($("li").attr("class")); // Fetches the status of the first user 
+0

मुझे वोट क्यों दिया गया था? कोड काम करता है, और मैंने क्लास-एट्रिब्यूट से स्थिति निकालने के लिए एक फ़ंक्शन की आपूर्ति की है, भले ही अन्य कक्षाएं मौजूद हों ... अगर वह वांछित नहीं है, तो बस getStatus-function को हटा दें। – PatrikAkerstrand

+0

आप क्लाइंट-साइड पर किसी स्थिति की वैधता की जांच नहीं कर सकते हैं। आप उचित स्थिति के बारे में दृश्य संकेत देने के लिए सीएसएस का उपयोग कर सकते हैं, क्योंकि आप पहले से ही क्लास विशेषताओं का उपयोग करते हैं। लेकिन आपकी जावास्क्रिप्ट मूल रूप से बेकार है। – Rob

+1

यहां दिए गए किसी भी समाधान के बारे में भी यही कहा जा सकता है। इससे कोई फर्क नहीं पड़ता कि स्थिति क्लास-एट्रिब्यूट या कस्टम एट्रिब्यूट में संग्रहीत है या नहीं। इसे अभी भी सर्वर की ओर से मान्य किया जाना है। मेरा मतलब था कि यह कक्षा के नामों की एक स्ट्रिंग से "ज्ञात" स्थिति निकाल देगा। मैं मूल अंग्रेजी स्पीकर नहीं हूं, इसलिए मुझे लगता है कि यह मेरी पोस्ट में एक दुर्भाग्यपूर्ण शब्द था। – PatrikAkerstrand

1

की "कैसे पहली जगह में दस्तावेज़ में इसे पाने के लिए" सवाल का जवाब करने के लिए, मैं एक लेआउट इस के समान का सुझाव अपने उपयोगकर्ताओं के बारे में जानकारी:

:

$('#users > li') // all user elements 
$('.someStatus') // all users of a particular status 

फिर अपने ईवेंट हैंडलर्स में यह भी आसान वर्तमान स्थिति प्राप्त करने के लिए है 0

$(this).attr('class') //get current status once you have a user element selected. 

एक और विकल्प पृष्ठ पर जावास्क्रिप्ट को डंप करना है और इसे पृष्ठ लोड होने के तुरंत बाद डेटा स्टोर करने के लिए jquery data कार्यक्षमता का उपयोग करना है। यद्यपि सही खोजने के लिए आपको अभी भी तत्व पर एक आईडी की आवश्यकता होगी। jQuery के

2

metadata प्लगइन आपके जवाब है।

<html > 
<head> 
<script src="/js/jquery-1.3.2.js"></script> 
<script src="/js/jquery.metadata.js"></script> 
</head> 
<body> 
<ul> 
<li type="text" class="{UID:'1',status:'alive'}">Adam</li> 
<li type="text" class="{UID:'2',status:'alive'}">Bob</li> 
<li type="text" class="{UID:'3',status:'alive'}">Carol</li> 
</ul> 
<script> 
$('li').each(function(){window.console.log($(this).metadata().UID)}); 
</script> 
</body> 
</html> 
8

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

नहीं है, तथापि, एक विकल्प है कि कस्टम सामंजस्य मानकों के साथ जिम्मेदार बताते हैं। जॉन रेसिग (jQuery के लेखक) writes about in his blog के रूप में, यह एक नई विशेषता है जो HTML5 में पेश की जा रही है जो आपको data- उपसर्ग के साथ custom data attributes निर्दिष्ट करने की अनुमति देती है। तो एक पूरी तरह से वैध तत्व इस प्रकार दिखाई देंगे:

<ul> 
    <li data-userid='5' data-status='active'>Paolo Bergantino</li> 
</ul> 

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

कुछ आगे पढ़ने Attributes > Classes: Custom DOM Attributes for Fun and Profit.

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