วิธีการตั้งค่าคุณสมบัติข้อมูลในองค์ประกอบ HTML


233

ฉันมี div data-myval = "10"ที่มีคุณลักษณะต์ ฉันต้องการอัปเดตค่าของมัน มันจะไม่เปลี่ยนถ้าฉันใช้div.data('myval',20)? ฉันจำเป็นต้องใช้div.attr('data-myval','20')เท่านั้นหรือไม่

ฉันสับสนระหว่าง HTML5 และ jQuery หรือไม่ กรุณาแนะนำ ขอบคุณ!

แก้ไข: อัปเดตdiv.data('myval')=20เป็นdiv.data('myval',20)แต่ยังไม่มีการอัปเดต HTML


1
มีอะไรในdiv? วัตถุหรือองค์ประกอบ jQuery?
แบรด

2
div.data('myval')=20จะไม่ทำงานเพื่อเก็บค่าเพียงเพราะไวยากรณ์ผิด - ดูคำตอบสำหรับไวยากรณ์ที่ถูกต้อง แต่โปรดทราบ.data()ว่าไม่ได้อัปเดตแอตทริบิวต์องค์ประกอบจริง ๆมันเก็บข้อมูลไว้ที่อื่น
nnnnnn

สำหรับผู้ที่มีเหตุผลที่จะหลีกเลี่ยง gQuery ให้ใช้สิ่งนี้ -> div.dataset.myval = '20';
Harijs Krūtainis

คำตอบ:


448

HTML

<div id="mydiv" data-myval="10"></div>

JS

var a = $('#mydiv').data('myval'); //getter

$('#mydiv').data('myval',20); //setter

การสาธิต

การอ้างอิง

จากการอ้างอิง:

jQuery ใช้.data()วิธีการบันทึกข้อมูลภายใต้ชื่อ 'events' และ 'handle' และยังสงวนชื่อข้อมูลใด ๆ ที่เริ่มต้นด้วยเครื่องหมายขีดล่าง ('_') สำหรับการใช้ภายใน

ควรสังเกตว่า jQuery data()ไม่เปลี่ยนdataคุณลักษณะใน HTML

ดังนั้นหากคุณต้องการเปลี่ยนdataแอตทริบิวต์ใน HTML คุณควรใช้.attr()แทน

HTML

<div id="outer">
    <div id="mydiv" data-myval="10"></div>
</div>

JS:

alert($('#outer').html());   // alerts <div id="mydiv" data-myval="10"> </div>
var a = $('#mydiv').data('myval'); //getter
$('#mydiv').attr("data-myval","20"); //setter
alert($('#outer').html());   //alerts <div id="mydiv" data-myval="20"> </div>

ดูการสาธิตนี้


ฉันไม่ทราบว่าสิ่งที่สอดคล้องที่คุณต้องการ แต่ฉันอยากจะแนะนำให้ใช้data()ไปgetและsetHTML 5 คุณลักษณะข้อมูล
Jashwant

7
@Jashwant อาจเป็นการแก้ไขที่มีประโยชน์แทน: ลองนึกถึงกฎ CSS เช่น[data-myval="10"]{ color: red; }นั้นมันจะจัดรูปแบบแท็กตามค่าของแอตทริบิวต์ของข้อมูล
TechNyquist

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

@Gaucho ตอนนี้มันดีกว่าเหรอ?
Jashwant

1
@Gaucho .data จะทำงานเฉพาะเมื่อคุณใช้ jQuery รุ่นใหม่กว่า> = 1.4.3 สำหรับรุ่นที่เก่ากว่า .attr จะทำงานได้
เลียส

41

คุณสามารถใช้attrสิ่งต่อไปนี้

HTML

<div id="mydiv" data-myval="JohnCena"></div>

ต้นฉบับ

 $('#mydiv').attr('data-myval', 'Undertaker'); // sets 
 $('#mydiv').attr('data-myval'); // gets

หรือ

$('#mydiv').data('myval'); // gets value
$('#mydiv').data('myval','John Cena'); // sets value

6
สำหรับฉันทำงานกับ. atr เท่านั้น เป็นไปได้ไหม
Zariweya

ฉันดีใจที่มันได้ผล การเรียก. data () เป็นการพิเศษ - ไม่เพียง แต่ดึงข้อมูลคุณลักษณะ HTML5 เท่านั้น แต่ยังพยายามประเมิน / แยกแอตทริบิวต์ ดังนั้นด้วยแอ็ตทริบิวต์เช่น data-myval = '{"hello": "world"}' เมื่อดึงข้อมูลผ่าน. data () จะส่งคืนออบเจ็กต์ขณะดึงข้อมูลผ่าน .attr () จะส่งคืนสตริง
Baqer Naqvi

32

โปรดทราบว่า jQuery .data()ไม่ได้รับการอัพเดตเมื่อคุณเปลี่ยนdata-แอตทริบิวต์html5 ด้วย javascript

หากคุณใช้ jQuery .data()เพื่อตั้งค่าdata-คุณสมบัติในองค์ประกอบ HTML คุณควรใช้ jQuery .data()เพื่ออ่าน มิฉะนั้นอาจมีความไม่สอดคล้องกันหากคุณอัปเดตแอตทริบิวต์แบบไดนามิก ตัวอย่างเช่นดูsetAttribute(), dataset(), attr()ด้านล่าง เปลี่ยนค่ากดปุ่มหลาย ๆ ครั้งและดูคอนโซล


29

โซลูชัน Javascript ของวานิลลา

HTML

<div id="mydiv" data-myval="10"></div>

JavaScript:

  • ใช้getAttribute()คุณสมบัติของ DOM

     var brand = mydiv.getAttribute("data-myval")//returns "10"
     mydiv.setAttribute("data-myval", "20")      //changes "data-myval" to "20"
     mydiv.removeAttribute("data-myval")         //removes "data-myval" attribute entirely
    
  • การใช้datasetคุณสมบัติของ JavaScript

    var myval = mydiv.dataset.myval     //returns "10"
    mydiv.dataset.myval = '20'          //changes "data-myval" to "20"
    mydiv.dataset.myval = null          //removes "data-myval" attribute
    

8

หากคุณใช้ jQuery ให้ใช้.data():

div.data('myval', 20);

คุณสามารถจัดเก็บข้อมูลโดยพลการ.data()แต่คุณ จำกัด .attr()เพียงแค่สายเมื่อใช้


14
โปรดทราบว่า.data()วิธีนี้ไม่ได้อัปเดตแอdata- ททริบิวต์ - นั่นคือข้อมูลที่จัดเก็บไม่ได้อยู่ในแอททริบิวต์ (ซึ่งเป็นสาเหตุที่สามารถเก็บค่าที่ไม่ใช่สตริง) แม้ว่ามันจะสามารถดึงค่าจากแอdata-ททริบิวต์ได้ แม้ว่าฉันจะสงสัยว่า OP ไม่จำเป็นต้องกำหนดคุณลักษณะแม้ว่าคำถามนั้นจะถาม
nnnnnn

1
ฉันไม่คิดว่ามันจะเป็นปัญหา (นอกเหนือจากที่คุณพูดถึงหรือหากมีรหัสอื่นที่ใช้.attr()ในการดึงข้อมูลคุณลักษณะ) ฉันคิดว่ามันคุ้มค่าที่จะชี้ให้เห็นว่า OP ชัดเจน (ถ้าผิดพลาด) ถามเกี่ยวกับการอัปเดตคุณลักษณะ
nnnnnn

1
@ ผู้หักบัญชีนี่ไม่ได้ตอบคำถามของฉัน ฉันต้องการอัปเดต HTML แต่ในเวลาเดียวกันให้ใช้ element.data ('myval') เพื่อดึงข้อมูลเช่นกัน
Pulkit Mittal

1
ฉันต้องทำเช่นนั้นเพราะองค์ประกอบที่สร้างขึ้นในการโหลดเอกสารมีองค์ประกอบเป็นข้อมูลคุณลักษณะและฉันต้องการทำเช่นนั้นสำหรับองค์ประกอบแบบไดนามิกใหม่เช่นกัน ฉันรู้ว่าอาจไม่มีความต้องการเฉพาะเจาะจงสำหรับเรื่องนั้น แต่ฉันต้องการให้มีความมั่นคง
Pulkit Mittal

1
@PulkitMittal - โปรดทราบว่าแม้ว่า.attr()คุณจะไม่ได้อัปเดต "the html" จริงๆ แต่คุณกำลังอัปเดต DOM เมื่อคุณขอให้เบราว์เซอร์ให้ "html" แก่คุณ (ไม่ว่าจะโดย.html()DOM หรือelement.innerHTML) เบราว์เซอร์ก็จะทำการสร้างใหม่ให้กับคุณตามสถานะของ DOM ในเวลานั้น เรียงจาก
nnnnnn

3

[jQuery] .data () vs .attr () vs .extend ()

วิธีการ jQuery .data()อัปเดตวัตถุภายในที่จัดการโดย jQuery ผ่านการใช้วิธีนี้หากฉันถูกต้อง

หากคุณต้องการอัปเดตสเปรดของคุณdata-attributesให้ใช้ -

$('body').attr({ 'data-test': 'text' });

- มิฉะนั้น$('body').attr('data-test', 'text');จะทำงานได้ดี

อีกวิธีที่คุณสามารถทำได้คือใช้

$.extend( $('body')[0].dataset, { datum: true } );

- ซึ่ง จำกัด การเปลี่ยนแปลงใด ๆ ที่จะแอตทริบิวต์HTMLElement.prototype.dataset, ไม่เพิ่มเติมใดHTMLElement.prototype.attributes


2

อีกวิธีในการตั้งค่า data- คือการใช้คุณสมบัติชุดข้อมูล

<div id="user" data-id="1234567890" data-user="johndoe" data-date-of-birth>John Doe</div>

const el = document.querySelector('#user');

// el.id == 'user'
// el.dataset.id === '1234567890'
// el.dataset.user === 'johndoe'
// el.dataset.dateOfBirth === ''

// set the data attribute
el.dataset.dateOfBirth = '1960-10-03'; 
// Result: el.dataset.dateOfBirth === 1960-10-03

delete el.dataset.dateOfBirth;
// Result: el.dataset.dateOfBirth === undefined

// 'someDataAttr' in el.dataset === false
el.dataset.someDataAttr = 'mydata';
// Result: 'someDataAttr' in el.dataset === true

0

เพื่อให้ jQuery และ DOM อยู่ในสถานะซิงค์ตัวเลือกง่ายๆอาจเป็น

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