डेटा-विशेषता मान को अपडेट नहीं किया जा सकता


91

हालांकि वेब पर इसके बारे में कुछ उदाहरण हैं, लेकिन यह सही ढंग से काम नहीं करता है। मैं इस समस्या का पता नहीं लगा सकता।

मेरे पास यह सरल HTML है

         <div id="foo" data-num="0"></ div>
         <a href="#" id="changeData">change data value</a>

हर बार जब मैं लिंक "परिवर्तन डेटा मूल्य" पर क्लिक करता हूं तो मैं डेटा-संख्या के डेटा मूल्य को अपडेट करना चाहता हूं। उदाहरण के लिए मुझे 1,2,3,4 होना चाहिए, ... (प्लस 1 हर बार जब मैं लिंक पर क्लिक करता हूं)

मेरे पास क्या है

            var num = $('#foo').data("num");
            console.log(num);
            num = num+1;               
            console.log(num);
            $('#foo').attr('data-num', num);   

मान हर बार 0 से 1 तक बदलता है। मैं इसे वृद्धिशील नहीं बना सकता। कोई भी सुझाव जो मैं गलत कर रहा हूँ?


5
data- केवल पेज लोड पर एक विशेषता है। डेटा को डोम में लोड किया जाता है और उपयोग करके उसमें हेरफेर किया जाता है .data()। विशेषता को अद्यतन नहीं किया गया है और इसका उपयोग डेटा को संग्रहीत या पुनर्प्राप्त करने के लिए नहीं किया जाना चाहिए, केवल प्रारंभ में डेटा सेट करने के लिए।
निगेल एंजेल

1
@NigelAngel गलत। डेटा विशेषता का उद्देश्य एक ऐसा साधन प्रदान करना है जिसके द्वारा उपयोगकर्ता मनमाना डेटा स्टोर कर सकते हैं (और संशोधित कर सकते हैं) जिसमें अन्य कोई वैध जगह न हो। और इसका उदाहरण विदेशी मुद्रा के लिए होगा जब दशमलव बिंदु एक अल्पविराम है। इसके साथ संख्यात्मक गणना करने के लिए आपको कहीं न कहीं एक वास्तविक दशमलव बिंदु के साथ उचित मूल्य जमा करना होगा। यदि यह कुल मूल्य है और इसे परिवर्तनों के आधार पर अपडेट करने की आवश्यकता है तो फिर से इस डेटा मूल्य को बदलना होगा और इसलिए आपको इसे अपडेट करने में सक्षम होने की आवश्यकता है। इसके लिए, आप .attr ()
jezzipin

जवाबों:


64

उत्तर कम एक अच्छा है

आप डेटा विधि का सही उपयोग नहीं कर रहे हैं । डेटा को अपडेट करने का सही कोड है:

$('#foo').data('num', num); 

तो आपका उदाहरण होगा:

var num = $('#foo').data("num") + 1;       
console.log(num)       
$('#foo').data('num', num); 
console.log(num)

97
यह गलत है, यह एक विशेषता को अपडेट करने की गलत विधि है
adeneo

2
हां मैं आपसे @adeneo सहमत हूं लेकिन वह डेटा पद्धति का सही उपयोग नहीं कर रहा है। यदि आप इसे attr विधि से अद्यतन करना चाहते हैं तो इस तरह की विशेषता का उपयोग क्यों करें?
लुकास विल्म्स

@ देवा ने मेरा जवाब संपादित किया और आपको जो पूरा कोड इस्तेमाल करना है, उसे जोड़ दिया।
लुकास विलेम्स

7
यह दिलचस्प है। मैं देख सकता हूं कि कंसोल में मान बदलता है। लेकिन जब मैं क्रोम का उपयोग करते हुए html देखता हूं तो यह 0 (प्रारंभिक) है। मुझे लगता है कि यह ठीक है अगर बाद में मैं अंतिम मूल्य (उदाहरण के लिए 5) प्राप्त कर सकता हूं
देव

6
जैसा कि @dev ने कहा कि मैंने कोशिश की और देखा कि यह jQuery में बदल गया है लेकिन क्रोम और सफारी में html को प्रभावित नहीं करता है। इसलिए मैं attr () बल्कि डेटा () का उपयोग करने का निर्णय लेता हूं।
QMaster

118

इसके बजाय इसका उपयोग करें, यदि आप नोड ऑब्जेक्ट के विशेषता डेटा-संख्या को बदलना चाहते हैं , तो डेटा ऑब्जेक्ट का नहीं :

डेमो

$('#changeData').click(function (e) { 
    e.preventDefault();
    var num = +$('#foo').attr("data-num");
    console.log(num);
    num = num + 1;
    console.log(num);
    $('#foo').attr('data-num', num);
});

पुनश्च: लेकिन आपको लगभग सभी मामलों में डेटा () ऑब्जेक्ट का उपयोग करना चाहिए, लेकिन सभी नहीं ...


7
डेटा को डोम में लोड किया गया है और वहां .data () का उपयोग करके हेरफेर किया गया है। विशेषता को अद्यतन नहीं किया गया है और इसका उपयोग डेटा को संग्रहीत या पुनर्प्राप्त करने के लिए नहीं किया जाना चाहिए, केवल प्रारंभ में डेटा सेट करने के लिए। हालांकि यह एक विशेषता को बदलने का एक तरीका है ( .prop()पसंद किया जाता है), यह डेटा का उपयोग करने का सही तरीका नहीं है।
निगेल एंजेल

4
.prop()DOM में किसी भी गुण या विशेषता के मान को एक्सेस या बदल देगा लेकिन HTML नहीं। .attr()HTML तक पहुंच और उसे फिर से लिखना होगा जो इसे धीमा बनाता है .prop()। आपको .attr()इसके बजाय उपयोग नहीं करना चाहिए .data(), न केवल इसलिए कि यह धीमा है, बल्कि इसलिए कि यह काम करने का तरीका नहीं है। jsfiddle.net/eXA76/2
निगेल एंजेल

1
मुझे लगता है कि यह उत्तर हटा दिया जाना चाहिए क्योंकि यह डेटा () का उपयोग करने पर बुरी सलाह देता है।
निगेल एंजेल

2
हाँ, jQuery डॉक्स का उपयोग कैसे करना चाहिए, इस पर! api.jquery.com/data डेटा को दस्तावेज़ लोड पर एक वैश्विक चर में संग्रहीत किया जाता है। यदि अन्य डेवलपर, प्लगइन या स्क्रिप्ट सही तरीके से डेटा का उपयोग कर अद्यतन करता है , तो इसे विशेषता के माध्यम से संदर्भित नहीं किया जाएगा .data()। सही विधि की अनदेखी करके और विशेषता का उपयोग करके आप जानबूझकर समस्याओं का कारण बन रहे हैं।
निगेल एंजेल

4
@NigelAngel Whilst मैं इस पर आपकी राय की सराहना करता हूं, डेटा हमेशा उपयोग करने का सबसे अच्छा विकल्प नहीं है। क्या होगा यदि आपको एक डेटा विशेषता के मूल्य को अपडेट करने की आवश्यकता है और इसे डोम में प्रदर्शित किया है और साथ ही वास्तव में अंतर्निहित मूल्य को बदल रहा है जो तब सीएसएस या यहां तक ​​कि जावास्क्रिप्ट द्वारा उपयोग किया जाता है? सबसे अच्छा तरीका आम तौर पर .data () का उपयोग करना है यदि आप जावास्क्रिप्ट से किसी भी तरह से मूल्य को अपडेट नहीं कर रहे हैं, लेकिन यदि आप हैं, तो हमेशा .attr () का उपयोग दोनों सेट और मान प्राप्त करने के लिए करें।
जेजिपिन

30

यदि हम मौजूदा, देशी जावास्क्रिप्ट का उपयोग करके इन विशेषताओं को पुनः प्राप्त या अद्यतन करना चाहते हैं , तो हम नीचे दिखाए गए तरीकों getAttributeऔर setAttributeतरीकों का उपयोग करके ऐसा कर सकते हैं :

जावास्क्रिप्ट

<script>
// 'Getting' data-attributes using getAttribute
var plant = document.getElementById('strawberry-plant');
var fruitCount = plant.getAttribute('data-fruit'); // fruitCount = '12'

// 'Setting' data-attributes using setAttribute
plant.setAttribute('data-fruit','7'); // Pesky birds
</script>

JQuery के माध्यम से

// Fetching data
var fruitCount = $(this).data('fruit');

// Above does not work in firefox. So use below to get attribute value.
var fruitCount = $(this).attr('data-fruit');

// Assigning data
$(this).data('fruit','7');

// But when you get the value again, it will return old value. 
// You have to set it as below to update value. Then you will get updated value.
$(this).attr('data-fruit','7'); 

वेनिला js के लिए यह दस्तावेज़ पढ़ें या jquery के लिए यह दस्तावेज़


@ नील एंजेल, क्या आपने इसे फ़ायरफ़ॉक्स पर परीक्षण किया है? $ (यह) .डाटा ('फल') फ़ायरफ़ॉक्स पर काम नहीं करता है।
ललित कुमार मौर्य

अंतिम सलाह के लिए बहुत बहुत धन्यवाद "आपको इसे अपडेट करने के लिए नीचे सेट करना होगा। फिर आपको अपडेटेड वैल्यू मिलेगी" jquery में rly अजीब व्यवहार ..
jgr

12

खुद के लिए, Jquery lib 2.1 का उपयोग करते हुए निम्नलिखित ने मेरे द्वारा अपेक्षित तरीके से काम नहीं किया:

तत्व डेटा विशेषता मान सेट करें:

$('.my-class').data('num', 'myValue');
console.log($('#myElem').data('num'));// as expected = 'myValue'

इस तत्व के बिना ही विशेषता बनी रहती है:

<div class="my-class"></div>

मुझे DOM अपडेटेड की आवश्यकता थी इसलिए मैं बाद में $ ('। My-class [data-num = "myValue"]') कर सकता था। // वर्तमान लंबाई ० है।

इसलिए मुझे करना पड़ा

$('.my-class').attr('data-num', 'myValue');

अद्यतन करने के लिए DOM पाने के लिए:

<div class="my-class" data-num="myValue"></div>

क्या विशेषता मौजूद है या नहीं .attr अधिलेखित हो जाएगा।


1
मुझे 2.1.1 jquery की यही समस्या है!
phlegx

8

इसी तरह की समस्या थी और अंत में मुझे दोनों को सेट करना पड़ा

obj.attr('data-myvar','myval')

तथा

obj.data('myvar','myval')

और उसके बाद

obj.data('myvar') == obj.attr('data-myvar')

उम्मीद है की यह मदद करेगा।


6

मूल रूप से, डेटा विशेषता मान सेट / अपडेट करने के दो तरीके हैं, आपकी आवश्यकता पर निर्भर करता है। अंतर सिर्फ इतना है, जहां डेटा सहेजा गया है,

यदि आप इसका उपयोग करते हैं, तो .data()इसे स्थानीय चर में सहेजा जाएगा data_user, और इसका तत्व निरीक्षण पर दिखाई नहीं देगा, यदि आप इसका उपयोग करते हैं तो .attr()यह सार्वजनिक रूप से दिखाई देगा।

इस टिप्पणी पर बहुत स्पष्ट व्याख्या


2

यह उत्तर उन लोगों के लिए है जो केवल डेटा-विशेषता का मान बदलना चाहते हैं

सुझाए गए आपके Jquery डेटा-Attr का मान सही ढंग से नहीं बदलेगा जैसा कि @adeneo ने बताया है। हालांकि किसी कारण से, मैं उसे (या किसी अन्य को) नहीं देख रहा हूं, जो अपने डेटा-एटीआर को अपडेट करने की मांग कर रहा है। @Lucas Willems ने जो जवाब पोस्ट किया है, वह ब्रायन टॉम्पसेट की समस्या का जवाब हो सकता है - 莱恩 uc हो रहा है, लेकिन यह उस पूछताछ का जवाब नहीं है जो अन्य उपयोगकर्ताओं को यहां ला रही हो सकती है।

मूल पूछताछ कथन के संबंध में त्वरित उत्तर

अद्यतन डेटा- attr के लिए

$('#ElementId').attr('data-attributeTitle',newAttributeValue);

आसान गलतियाँ * - आपकी विशेषता की शुरुआत में "डेटा-" होना चाहिए, जिसका मूल्य आप बदलना चाह रहे हैं।


2

इसी तरह की समस्या थी, मैं प्रस्ताव करता हूं कि इस समाधान का समर्थन IE 10 और उससे कम में समर्थित नहीं है।

दिया हुआ

<div id='example' data-example-update='1'></div>

जावास्क्रिप्ट मानक डेटा-उदाहरण-अद्यतन को अद्यतन करने के लिए डेटासेट नामक एक संपत्ति को परिभाषित करता है।

document.getElementById('example').dataset.exampleUpdate = 2;

नोट: सही डेटा विशेषता तक पहुँचने के लिए ऊँट केस नोटेशन का उपयोग करें।

स्रोत: https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes


1

जब मैं jquery का उपयोग कर रहा था तो html डेटा टैग को अपडेट न करने की मेरे पास एक ही समस्या थी लेकिन कोड को बदलना जो कि jquery से जावास्क्रिप्ट में काम करता है, ने काम किया।

बटन क्लिक करने पर इसका उपयोग करने का प्रयास करें: (ध्यान दें कि मुख्य कोड Javascripts setAttribute () फ़ंक्शन है।)

function increment(q) {

    //increment current num by adding with 1
    q = q+1;

    //change data attribute using JS setAttribute function
    div.setAttribute('data-num',q);

    //refresh data-num value (get data-num value again using JS getAttribute function)
    num = parseInt(div.getAttribute('data-num'));

    //show values
    console.log("(After Increment) Current Num: "+num);

}

//get variables, set as global vars
var div = document.getElementById('foo');
var num = parseInt(div.getAttribute('data-num'));

//increment values using click
$("#changeData").on('click',function(){

    //pass current data-num as parameter
    increment(num);

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