ไม่สามารถอัปเดตค่า data-attribute


92

แม้ว่าจะมีตัวอย่างบางส่วนเกี่ยวกับเรื่องนี้บนเว็บ แต่ดูเหมือนว่าจะทำงานไม่ถูกต้อง ฉันคิดปัญหาไม่ออก

ฉันมี html ง่ายๆนี้

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

ทุกครั้งที่คลิกลิงก์ "เปลี่ยนค่าข้อมูล" ฉันต้องการอัปเดตค่าข้อมูลของ data-num ตัวอย่างเช่นฉันต้องการให้เป็น 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- เป็นเพียงแอตทริบิวต์ในการโหลดหน้าเว็บ ข้อมูลจะถูกโหลดลงใน Dom .data()และการจัดการมีการใช้ แอตทริบิวต์ไม่ได้รับการอัปเดตและไม่ควรใช้เพื่อจัดเก็บหรือดึงข้อมูลเพียงเพื่อตั้งค่าข้อมูลในตอนแรกเท่านั้น
Nigel Angel

1
@NigelAngel ผิด. วัตถุประสงค์ของแอตทริบิวต์ข้อมูลคือเพื่อให้วิธีการที่ผู้ใช้สามารถจัดเก็บ (และแก้ไข) ข้อมูลโดยพลการที่ไม่มีที่อื่นที่ถูกต้องให้ไป และตัวอย่างนี้จะเป็นสกุลเงินต่างประเทศเมื่อจุดทศนิยมเป็นลูกน้ำ ในการคำนวณตัวเลขด้วยสิ่งนี้คุณต้องเก็บค่าที่เหมาะสมพร้อมจุดทศนิยมจริงไว้ที่ใดที่หนึ่ง หากนี่คือราคารวมและจำเป็นต้องอัปเดตตามการเปลี่ยนแปลงค่าข้อมูลนี้จะต้องเปลี่ยนแปลงอีกครั้งดังนั้นคุณต้องสามารถอัปเดตได้ สำหรับสิ่งนี้คุณจะใช้ .attr ()
jezzipin

คำตอบ:


66

คำตอบด้านล่างคือคำตอบที่ดี

คุณใช้วิธีการข้อมูลไม่ถูกต้อง รหัสที่ถูกต้องในการอัปเดตข้อมูลคือ:

$('#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
Lucas Willems

@dev ฉันแก้ไขคำตอบของฉันและเพิ่มรหัสทั้งหมดที่คุณต้องใช้
Lucas Willems

7
เรื่องนี้น่าสนใจ ฉันเห็นว่าค่าเปลี่ยนแปลงในคอนโซล แต่เมื่อฉันดู html โดยใช้ Chrome มันเป็น 0 (เริ่มต้น) ฉันเดาว่ามันก็โอเคถ้าในภายหลังฉันสามารถดึงค่าสุดท้ายได้ (เช่น 5)
dev

6
ดังที่ @dev กล่าวว่าฉันได้ลองและเห็นว่ามีการเปลี่ยนแปลงใน jQuery แต่ไม่มีผลต่อ html ใน Chrome และ Safari ดังนั้นฉันจึงตัดสินใจใช้ attr () แทน data ()
QMaster

118

ใช้สิ่งนี้แทนหากคุณต้องการเปลี่ยนแอตทริบิวต์ data-num ขององค์ประกอบโหนดไม่ใช่ของ data object :

การสาธิต

$('#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);
});

PS: แต่คุณควรใช้วัตถุ data () ในแทบทุกกรณี แต่ไม่ใช่ทั้งหมด ...


7
ข้อมูลถูกโหลดลงในโดมและจัดการที่นั่นโดยใช้. data () แอตทริบิวต์ไม่ได้รับการอัปเดตและไม่ควรใช้เพื่อจัดเก็บหรือดึงข้อมูลเพียงเพื่อตั้งค่าข้อมูลในตอนแรกเท่านั้น แม้ว่านี่จะเป็นวิธีหนึ่งในการเปลี่ยนแอตทริบิวต์ ( .prop()เป็นที่ต้องการ) แต่ก็ไม่ใช่วิธีที่ถูกต้องในการใช้ข้อมูล
Nigel Angel

4
.prop()จะเข้าถึงหรือเปลี่ยนแปลงค่าของคุณสมบัติหรือแอตทริบิวต์ใด ๆ ใน DOM แต่ไม่ใช่ HTML .attr()จะเข้าถึงและเขียน HTML .prop()ซึ่งจะทำให้มันช้ากว่า คุณไม่ควรใช้.attr()แทน.data()ไม่ใช่เพียงเพราะมันช้ากว่า แต่เพราะนั่นไม่ใช่วิธีการทำงาน jsfiddle.net/eXA76/2
Nigel Angel

1
ฉันคิดว่าคำตอบนี้ควรถูกลบเพราะให้คำแนะนำที่ไม่ดีในการใช้ data ()
Nigel Angel

2
ใช่เอกสาร jQuery เกี่ยวกับวิธีการใช้งาน! api.jquery.com/dataข้อมูลจะถูกเก็บไว้ในตัวแปรส่วนกลางในการโหลดเอกสาร อ้างอิงทางแอตทริบิวต์จะไม่ทำงานถ้าหากนักพัฒนาอื่นปลั๊กอินหรือสคริปต์อย่างถูกต้อง.data()ปรับปรุงข้อมูลโดยใช้ โดยไม่สนใจวิธีการที่ถูกต้องและใช้แอตทริบิวต์คุณกำลังมุ่งหน้าไปสู่การก่อให้เกิดปัญหา
Nigel Angel

4
@NigelAngel ในขณะที่ฉันขอขอบคุณสำหรับความคิดเห็นของคุณเกี่ยวกับเรื่องนี้ข้อมูลไม่ใช่ตัวเลือกที่ดีที่สุดเสมอไป จะเกิดอะไรขึ้นหากคุณต้องการอัปเดตค่าของแอตทริบิวต์ข้อมูลและแสดงในโดเมนรวมทั้งเปลี่ยนค่าพื้นฐานที่ CSS หรือแม้แต่ Javascript ใช้จริง โดยทั่วไปวิธีที่ดีที่สุดคือใช้. data () หากคุณไม่ได้อัปเดตค่าจาก Javascript แต่ถ้าเป็นเช่นนั้นให้ใช้ .attr () เพื่อตั้งค่าและดึงค่า
jezzipin

31

หากเราต้องการดึงข้อมูลหรืออัปเดตแอตทริบิวต์เหล่านี้โดยใช้JavaScriptดั้งเดิมที่มีอยู่เราสามารถทำได้โดยใช้getAttributeและsetAttributeวิธีการดังที่แสดงด้านล่าง:

JavaScript

<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'); 

อ่านเอกสารนี้สำหรับ vanilla jsหรือเอกสารสำหรับ jquery


@Nigel Angel คุณเคยทดสอบกับ Firefox หรือไม่? $ (this) .data ('fruit') ไม่ทำงานบน firefox
Lalit Kumar Maurya

ขอบคุณมากสำหรับคำแนะนำสุดท้าย "คุณต้องตั้งค่าดังต่อไปนี้เพื่ออัปเดตค่าจากนั้นคุณจะได้รับการอัปเดตค่า" พฤติกรรมแปลก ๆ ใน jquery ..
jgr

12

สำหรับตัวฉันเองการใช้ Jquery lib 2.1.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"]') ได้ในภายหลัง // ความยาวปัจจุบันคือ 0

ผมจึงต้องทำ

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

ในการรับ DOM เพื่ออัปเดต:

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

ไม่ว่าจะมีแอตทริบิวต์อยู่หรือไม่ $ .attr จะเขียนทับ


1
ฉันมีปัญหาเดียวกันกับ jquery 2.1.1!
เสมหะ

8

มีปัญหาที่คล้ายกันและในที่สุดฉันต้องตั้งค่าทั้งสองอย่าง

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

และ

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

และหลังจากนี้

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

หวังว่านี่จะช่วยได้


6

โดยทั่วไปมีสองวิธีในการตั้งค่า / อัปเดตค่าแอตทริบิวต์ข้อมูลขึ้นอยู่กับความต้องการของคุณ ความแตกต่างอยู่ที่ข้อมูลที่บันทึกไว้

หากคุณใช้.data()มันจะถูกบันทึกในตัวแปรภายในที่เรียกว่าdata_userและจะไม่ปรากฏให้เห็นเมื่อตรวจสอบองค์ประกอบหากคุณใช้.attr()มันจะปรากฏต่อสาธารณะ

คำอธิบายที่ชัดเจนกว่ามากเกี่ยวกับความคิดเห็นนี้


2

คำตอบนี้มีไว้สำหรับผู้ที่ต้องการเปลี่ยนค่าของ data-attribute

ข้อเสนอแนะจะไม่เปลี่ยนค่าของ Jquery data-attr ของคุณอย่างถูกต้องตามที่ @adeneo ระบุไว้ ด้วยเหตุผลบางประการฉันไม่เห็นเขา (หรือคนอื่น ๆ ) โพสต์วิธีการที่ถูกต้องสำหรับผู้ที่ต้องการอัปเดต data-attr คำตอบที่ @Lucas Willems โพสต์อาจเป็นคำตอบสำหรับปัญหาที่ Brian Tompsett - 汤莱恩กำลังมีอยู่ แต่ไม่ใช่คำตอบสำหรับคำถามที่อาจนำผู้ใช้รายอื่นมาที่นี่

คำตอบอย่างรวดเร็วเกี่ยวกับคำชี้แจงการสอบถามต้นฉบับ

- เพื่ออัปเดตข้อมูล -tr

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

ข้อผิดพลาดง่าย ๆ * - ต้องมี "data-" ที่จุดเริ่มต้นของแอตทริบิวต์ของคุณที่คุณต้องการเปลี่ยนค่า


2

มีปัญหาที่คล้ายกันฉันเสนอวิธีแก้ปัญหานี้แม้ว่าจะไม่รองรับใน IE 10 และต่ำกว่า

ให้

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

มาตรฐาน Javascript กำหนดคุณสมบัติที่เรียกว่า dataset เพื่ออัพเดต data-example-update

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

หมายเหตุ: ใช้สัญลักษณ์กรณีอูฐเพื่อเข้าถึงแอตทริบิวต์ข้อมูลที่ถูกต้อง

ที่มา: https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes


1

ฉันมีปัญหาเดียวกันกับแท็กข้อมูล html ที่ไม่อัปเดตเมื่อฉันใช้ jquery แต่การเปลี่ยนรหัสที่ทำงานจริงจาก jquery เป็น javascript ได้

ลองใช้สิ่งนี้เมื่อคลิกปุ่ม: (โปรดทราบว่าโค้ดหลักคือฟังก์ชัน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);

});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.