2011-12-17 7 views
96

मैं भंडारण कर रहा हूँ एक HTML टैग में data- दृष्टिकोण का उपयोग कर डेटा HTML jQuery में डेटा विशेषता में स्टोर JSON ऑब्जेक्टतो जैसे

$(this).data('imagename'); 

यह ठीक काम करता है। जो मैं फंस गया हूं, वह इसके गुणों में से केवल एक वस्तु को सहेजने की कोशिश कर रहा है। मैं यह कर की कोशिश की:

<td><button class='delete' data-image='"+results[i]+"'>Delete</button></td> 

तो मैं इस तरह नाम संपत्ति का उपयोग करने की कोशिश की:

var imageObj = $(this).data('image'); 
console.log('Image name: '+imageObj.name); 

लॉग मुझे undefined बताता है। तो ऐसा लगता है जैसे मैं data- विशेषताओं में सरल तार स्टोर कर सकते हैं, लेकिन मैं संग्रहीत नहीं कर सकता JSON वस्तुओं ...

मैं भी कोई भाग्य के साथ वाक्य रचना के इस बच्चे का उपयोग करने की कोशिश की है:

<div data-foobar='{"foo":"bar"}'></div> 

data- दृष्टिकोण का उपयोग कर HTML टैग में वास्तविक ऑब्जेक्ट को स्टोर करने के तरीके पर कोई विचार है?

उत्तर

99

बजाय पाठ में एम्बेड करके सिर्फ $('#myElement').data('key',jsonObject);

यह वास्तव में html में संग्रहीत नहीं किया जाएगा, लेकिन आप jquery.data उपयोग कर रहे हैं, वह सब वैसे भी निकाला जाता है का उपयोग की।

JSON वापस प्राप्त करने के लिए यह पार्स मत करो, बस फोन:

var getBackMyJSON = $('#myElement').data('key'); 

आप सीधे JSON के बजाय [Object Object] मिल रहे हैं, सिर्फ डेटा कुंजी के द्वारा आपके JSON का उपयोग:

var getBackMyJSON = $('#myElement').data('key').key; 
+1

तो डेटा- दृष्टिकोण का उपयोग कर मुझे मान संग्रहीत प्रत्येक बटन को हटाने के लिए अनुमति देता है (प्रत्येक बटन हो जाता है एक अलग जेसन ऑब्जेक्ट ...) मेरे पास ऊपर दिखाए गए एचएमटीएल टैग डालकर टेबल में है। क्या आप सुझाव दे रहे हैं कि मैं प्रत्येक ऑब्जेक्ट को संबंधित डिलीट बटन से जोड़ूं? मैं यह कैसे करूं , मैं $ ('# myElement') का उपयोग कैसे करूं? माफ करना, मुझे इस पर अनुभव नहीं हुआ। धन्यवाद – zumzum

+0

तो मैंने प्रत्येक एचटीएमएल बटन को एक इंडेक्स असाइन किया: <बटन क्लास = 'डिलीट' डेटा-इंडेक्स = '"+ i +"'>हटाएं, और $ ऑब्जेक्ट वैरिएबल में JSON ऑब्जेक्ट्स की एक सरणी संग्रहीत करना। फिर जब कोई बटन क्लिक किया जाता है तो मैं बटन इंडेक्स को देखकर देखता हूं: var buttonIndex = $ (this) .डेटा ('अनुक्रमणिका'); और फिर मुझे पहले से सहेजे गए से संबंधित ऑब्जेक्ट मिलता है: $ ऑब्जेक्ट्स [बटन इंडेक्स]। यह ठीक काम करता है, सुनिश्चित नहीं है कि यह करने का सही तरीका है या नहीं। आपकी प्रतिक्रिया के लिए धन्यवाद! – zumzum

108

वास्तव में, अपने पिछले उदाहरण:

<div data-foobar='{"foo":"bar"}'></div> 

अच्छी तरह से काम कर रहा प्रतीत होता है (देखें http://jsfiddle.net/GlauberRocha/Q6kKU/)।

अच्छी बात यह है कि डेटा-स्ट्रिंग में स्ट्रिंग स्वचालित रूप से जावास्क्रिप्ट ऑब्जेक्ट में परिवर्तित हो जाती है। मुझे इस दृष्टिकोण में कोई कमी नहीं दिख रही है, इसके विपरीत! ऑब्जेक्ट गुणों के माध्यम से जावास्क्रिप्ट में उपयोग करने के लिए तैयार डेटा के पूरे सेट को स्टोर करने के लिए एक विशेषता पर्याप्त है।

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

+15

यदि यह किसी की सहायता करता है, तो यहां उपरोक्त तक पहुंचने का तरीका बताया गया है: '$ ('div')। डेटा ('foobar')। Foo'। http://api.jquery.com/data/ – Gary

+0

@GlauberRocha क्या होगा यदि आपके पास डेटा-foobar ऑब्जेक्ट के अंदर दो तत्व थे और आप केवल एक तत्व को हटाना चाहते थे .. आप यह कैसे करेंगे? –

+0

एक बार आपके मार्कअप में डेटा को जावास्क्रिप्ट ऑब्जेक्ट ('var foobar = $ (' div ') के रूप में एक्सेस किया गया है। डेटा (' foobar ') '), आप एक संपत्ति को हटाने के लिए ** हटाएं ** ऑपरेटर का उपयोग कर सकते हैं: 'foobar.foo' हटाएं (या 'foobar [' foo '] हटाएं'), या जो कुछ भी आपको पसंद है उसे करें। –

9

मेरे लिए यह उस तरह काम करते हैं, के रूप में मैं टेम्पलेट में संग्रहीत करना होगा ...

// Generate HTML 
var gridHtml = '<div data-dataObj=\''+JSON.stringify(dataObj).replace(/'/g, "\\'");+'\'></div>'; 

// Later 
var dataObj = $('div').data('dataObj'); // jQuery automatically unescape it 
+1

साझा करने के लिए धन्यवाद .. वास्तव में जो मैं खोज रहा था ... स्वीकार किए गए उत्तर को पार्स करने का प्रयास करते समय [ऑब्जेक्ट ऑब्जेक्ट] प्राप्त करना जारी रखा। – greaterKing

+0

@greaterKing आप जेएसओएन को स्वीकृत उत्तर से पार्स नहीं करते हैं, तो आप इसे उस कुंजी के माध्यम से एक्सेस करते हैं जो डेटा नाम के समान है, इसलिए यदि आपके पास उदा। '$ ('बॉडी') डेटा ('myData', {h:" हैलो ", डब्ल्यू:" दुनिया "})' _____________________________________________________________________________________________ आपको अपना JSON ऑब्जेक्ट '$ ('body') प्राप्त होगा। डेटा()। myData ' –

+0

सरल बनाने के लिए, आप'

''कर सकते हैं। वे सभी एकल उद्धरण हैं, शुरुआत और अंत अभी से बच निकले हैं, इसलिए यह '' {"कुछ": "चीज़"} '' – IamFace

0

का उपयोग करना documented jquery .data(obj) syntax आप DOM तत्व की एक वस्तु स्टोर करने के लिए अनुमति देता है। तत्व का निरीक्षण data- विशेषता नहीं दिखाएगा क्योंकि ऑब्जेक्ट के मान के लिए कोई कुंजी निर्दिष्ट नहीं है।हालांकि, ऑब्जेक्ट के भीतर डेटा को .data("foo") के साथ कुंजी द्वारा संदर्भित किया जा सकता है या संपूर्ण ऑब्जेक्ट .data() के साथ वापस किया जा सकता है।

तो तुम एक पाश और result[i] = { name: "image_name" } की स्थापना की यह मानते हुए कि:

$('.delete')[i].data(results[i]); // => <button class="delete">Delete</delete> 
$('.delete')[i].data('name'); // => "image_name" 
$('.delete')[i].data(); // => { name: "image_name" } 
0

किसी कारण से, स्वीकार किए जाते हैं जवाब केवल तभी पेज पर एक बार इस्तेमाल किया जा रहा मेरे लिए काम किया, लेकिन मेरे मामले में मैं डेटा को बचाने के लिए कोशिश कर रहा था पृष्ठ पर कई तत्वों पर और पहले तत्व को छोड़कर डेटा किसी भी तरह खो गया था।

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

डेटा मैं इस्तेमाल किया सहेजने के लिए: करने से यह इस तरह से भी किया जाता डेटा दिखाई

var getBackMyJSON = $('#myElement').data('key'); 

:

$('#myElement').attr('data-key', JSON.stringify(jsonObject)); 

तो डेटा वापस पढ़ने के लिए स्वीकार किए जाते हैं जवाब, अर्थात् के रूप में ही है डोम में अगर मैं क्रोम के डीबगर के साथ तत्व का निरीक्षण करना चाहता था।

0

.data() ज्यादातर मामलों के लिए पूरी तरह से काम करता है। एक बार मुझे एक समस्या थी जब JSON स्ट्रिंग के पास एक ही उद्धरण था। मैं पिछले यह इतना इस दृष्टिकोण का सहारा पाने के लिए किसी भी आसान तरीका (सर्वर भाषा के रूप में Coldfusion उपयोग कर रहा हूँ) नहीं पा सके:

<!DOCTYPE html> 
     <html> 
      <head> 
       <title> 
        Special Chars in Data Attribute 
       </title> 
       <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
       <script src="https://code.jquery.com/jquery-1.12.2.min.js"></script> 
       <script> 
        $(function(){ 
         var o = $("##xxx"); 
         /** 
          1. get the data attribute as a string using attr() 
          2. unescape 
          3. convert unescaped string back to object 
          4. set the original data attribute to future calls get it as JSON. 
         */ 
         o.data("xxx",jQuery.parseJSON(unescape(o.attr("data-xxx")))); 
         console.log(o.data("xxx")); // this is JSON object. 
        }); 
       </script> 
       <title> 
        Title of the document 
       </title> 
      </head> 
      <body> 
       <cfset str = {name:"o'reilly's stuff",code:1}> 
<!-- urlencode is a CF function to UTF8 the string, serializeJSON converts object to strin --> 
       <div id="xxx" data-xxx='#urlencodedformat(serializejson(str))#'> 
       </div> 
      </body> 
     </html> 
3

धारावाहिक डेटा भंडारण के साथ समस्याओं का एक बहुत base64 करने के लिए धारावाहिक स्ट्रिंग में कनवर्ट करके हल किया जा सकता । बेस 64 स्ट्रिंग को बिना किसी झगड़े के कहीं भी स्वीकार किया जा सकता है। एक नज़र डालें:

atob() 
btoa() 

आवश्यकतानुसार/से कनवर्ट करें।

+0

अच्छा समाधान thnx जैसा ही होगा – Sajan

6

इस तरह यह मेरे लिए काम करता है।

HTML डेटा विशेषता में एक JSON को सहेजने के लिए, स्ट्रिंग JSON ऑब्जेक्ट और इसे "encodeURIComponent()" विधि से एन्कोड करें।

डेटा को वापस पढ़ने के दौरान, इसे "decodeURIComponent()" विधि से डीकोड करें और स्ट्रिंग को JSON ऑब्जेक्ट पर पार्स करें।

उदाहरण:

var my_object ={"Super Hero":["Iron Man", "Super Man"]}; 

बचत डेटा:

var data_str = encodeURIComponent(JSON.stringify(my_object)); 
$("div#mydiv").attr("data-hero",data-str); 

पढ़ना डाटा:

var data_str = $("div#mydiv").attr("data-hero"); 
var my_object = JSON.parse(decodeURIComponent(data_str)); 
0

रिकॉर्ड के लिए, मैंने पाया निम्नलिखित कोड काम करता है। यह आपको डेटा टैग से सरणी पुनर्प्राप्त करने, एक नया तत्व धक्का देने और सही JSON प्रारूप में डेटा टैग में वापस संग्रहीत करने में सक्षम बनाता है। इसलिए वांछित अगर सरणी में आगे तत्व जोड़ने के लिए एक ही कोड का उपयोग किया जा सकता है। मैंने पाया कि $('#my-data-div').attr('data-namesarray', names_string); सही ढंग से सरणी संग्रहीत करता है, लेकिन $('#my-data-div').data('namesarray', names_string); काम नहीं करता है।

<div id="my-data-div" data-namesarray='[]'></div> 

var names_array = $('#my-data-div').data('namesarray'); 
names_array.push("Baz Smith"); 
var names_string = JSON.stringify(names_array); 
$('#my-data-div').attr('data-namesarray', names_string); 
0

चाल मेरे लिए के लिए गया था कुंजियों को दोहरे उद्धरण चिह्नों को जोड़ने और महत्व देता है। यदि आप एक php फ़ंक्शन का उपयोग करते हैं जैसे json_encode आपको एक जेसन एन्कोडेड स्ट्रिंग और एक विचार को आपके एन्कोड करने का तरीका बताएगा।

jQuery ('# एल्म-आईडी')। डेटा ('datakey') यदि स्ट्रिंग ठीक से json के रूप में इनकोडिंग स्ट्रिंग की एक वस्तु वापस आ जाएगी।

jQuery प्रलेखन के अनुसार: (http://api.jquery.com/jquery.parsejson/)

एक जावास्क्रिप्ट अपवाद में एक विकृत JSON स्ट्रिंग परिणामों में पासिंग फेंक दिया जा रहा है। उदाहरण के लिए, निम्नलिखित सभी अमान्य JSON तार कर रहे हैं:

  1. "{परीक्षण: 1}" (परीक्षण यह दोहरे उद्धरण चिह्नों के नहीं है)।
  2. "{'test': 1}" ('test' डबल कोट्स के बजाय सिंगल कोट्स का उपयोग कर रहा है)।
  3. "'test'" ('test' डबल कोट्स के बजाय सिंगल कोट्स का उपयोग कर रहा है)।
  4. ".1" (एक अंक एक अंक से शुरू होना चाहिए; "0.1" मान्य होगा)।
  5. "अपरिभाषित" (अपरिभाषित किसी JSON स्ट्रिंग में प्रदर्शित नहीं किया जा सकता है; शून्य, हालांकि, हो सकता है)।
  6. "NaN" (NaN JSON स्ट्रिंग में प्रदर्शित नहीं किया जा सकता है, इन्फिनिटी के प्रत्यक्ष प्रतिनिधित्व भी है n
संबंधित मुद्दे