Cách đặt thuộc tính dữ liệu trong các phần tử HTML


233

Tôi có một div với một thuộc tính data-myval = "10". Tôi muốn cập nhật giá trị của nó; Nó sẽ không thay đổi nếu tôi sử dụng div.data('myval',20)? Tôi chỉ cần sử dụng div.attr('data-myval','20')?

Tôi có bị nhầm lẫn giữa HTML5 và jQuery không? Xin tư vấn. Cảm ơn!

EDIT: Cập nhật div.data('myval')=20đến div.data('myval',20), nhưng vẫn không hỗ trợ HTML cập nhật.


1
Có gì trong div? Một đối tượng hoặc phần tử jQuery?
Brad

2
div.data('myval')=20sẽ không hoạt động để lưu trữ một giá trị chỉ vì cú pháp sai - xem câu trả lời cho cú pháp đúng. Nhưng lưu ý rằng .data()không thực sự cập nhật thuộc tính phần tử , nó lưu trữ dữ liệu ở nơi khác.
nnnnnn

Đối với những người có ý thức tránh gQuery, hãy sử dụng cái này -> div.dataset.myval = '20';
Harijs Krūtainis

Câu trả lời:


448

HTML

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

Mã não

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

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

Bản giới thiệu

Tài liệu tham khảo

Từ tài liệu tham khảo:

Bản thân jQuery sử dụng .data()phương thức để lưu thông tin dưới tên 'sự kiện' và 'xử lý' và cũng bảo lưu bất kỳ tên dữ liệu nào bắt đầu bằng dấu gạch dưới ('_') để sử dụng nội bộ.

Cần lưu ý rằng jQuery data()không thay đổi datathuộc tính trong HTML.

Vì vậy, nếu bạn cần thay đổi datathuộc tính trong HTML, bạn nên sử dụng .attr()thay thế.

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>

Xem bản demo này


Tôi không biết những gì bạn cần nhất quán, nhưng tôi sẽ khuyên bạn nên sử dụng data()để getsetHTML-5 thuộc tính dữ liệu.
Jashwant

7
@Jashwant có thể là một chỉnh sửa hữu ích thay vào đó: nghĩ về quy tắc css như [data-myval="10"]{ color: red; }, nó sẽ định kiểu thẻ theo giá trị của thuộc tính dữ liệu.
TechNyquist

4
.data không hoạt động. .attr hoạt động. có thể chúng ta có thể chỉnh sửa câu trả lời để làm cho nó rõ ràng. có vẻ như giải pháp đầu tiên là giải pháp, trong khi nó có thể được tiếp xúc tốt hơn một chút. Tôi không chắc về cách giải thích rõ hơn, đây là lý do tại sao tôi không chỉnh sửa bài đăng.
Gaucho

@Gaucho, bây giờ có tốt hơn không?
Jashwant

1
@Gaucho .data sẽ chỉ hoạt động nếu bạn sử dụng jQuery mới hơn = = 1.4.3, đối với các phiên bản cũ hơn .attr sẽ hoạt động.
Ilias

41

Bạn cũng có thể sử dụng những attrđiều sau đây ;

HTML

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

Kịch bản

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

HOẶC LÀ

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

6
Đối với tôi chỉ làm việc với .attr. Điều đó thậm chí có thể?
Zariweya

Tôi vui vì nó đã làm việc. Cuộc gọi .data () là đặc biệt - không chỉ truy xuất các thuộc tính dữ liệu HTML5 mà nó còn cố gắng đánh giá / phân tích các thuộc tính. Vì vậy, với một thuộc tính như data-myval = '{"hello": "world"}' khi được truy xuất qua .data () sẽ trả về một Object trong khi truy xuất qua .attr () sẽ trả về một chuỗi.
Baqer Naqvi

32

Xin lưu ý rằng jQuery .data()không được cập nhật khi bạn thay đổi data-các thuộc tính html5 bằng javascript.

Nếu bạn sử dụng jQuery .data()để đặt data-các thuộc tính trong các phần tử HTML, tốt hơn bạn nên sử dụng jQuery .data()để đọc chúng. Nếu không, có thể có sự không nhất quán nếu bạn cập nhật các thuộc tính một cách linh hoạt. Ví dụ, xem setAttribute(), dataset(), attr()bên dưới. Thay đổi giá trị, nhấn nút nhiều lần và xem bảng điều khiển.


29

Giải pháp Vanilla Javascript

HTML

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

JavaScript:

  • Sử dụng getAttribute()tài sản của 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
  • Sử dụng thuộc datasettính của 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

Nếu bạn đang sử dụng jQuery, hãy sử dụng .data():

div.data('myval', 20);

Bạn có thể lưu trữ dữ liệu tùy ý .data(), nhưng bạn bị hạn chế chỉ chuỗi khi sử dụng .attr().


14
Lưu ý rằng .data()phương thức không cập nhật data- các thuộc tính - nghĩa là dữ liệu mà nó lưu trữ không nằm trong một thuộc tính (đó là lý do tại sao nó có thể lưu trữ các giá trị không phải chuỗi) ngay cả khi nó có thể truy xuất giá trị từ một data-thuộc tính. Mặc dù tôi nghi ngờ OP không thực sự cần thiết lập các thuộc tính mặc dù đó là những gì câu hỏi được hỏi.
nnnnnn

1
Tôi không nghĩ đó sẽ là một vấn đề (ngoài những gì bạn đã đề cập hoặc nếu có mã khác sử dụng .attr()để truy xuất thuộc tính). Tôi chỉ nghĩ rằng nó đáng để chỉ ra rằng OP rõ ràng (nếu có thể nhầm lẫn) đã hỏi về việc cập nhật các thuộc tính.
nnnnnn

1
@Blender này không thực sự trả lời câu hỏi của tôi. Tôi muốn cập nhật HTML, nhưng đồng thời, sử dụng Element.data ('myval') để truy xuất nó.
Pulkit Găng

1
Tôi cần phải làm điều đó bởi vì các phần tử được tạo khi tải tài liệu có các phần tử đó là thuộc tính dữ liệu và tôi cũng muốn làm như vậy cho các phần tử động mới. Tôi biết có thể không có nhu cầu cụ thể cho việc đó, nhưng tôi muốn giữ sự nhất quán.
Pulkit Găng

1
@PulkitMittal - Lưu ý rằng ngay cả khi .attr()bạn không thực sự cập nhật "html", bạn vẫn đang cập nhật DOM. Khi bạn yêu cầu trình duyệt cung cấp cho bạn "html" (cho dù bằng .html()hoặc DOM element.innerHTML), trình duyệt đang tạo lại nó một cách hiệu quả cho bạn dựa trên trạng thái của DOM tại thời điểm đó. Sắp xếp
nnnnnn

3

[jQuery] .data () so với .attr () so với .extend ()

Phương thức jQuery .data()cập nhật một đối tượng nội bộ được quản lý bởi jQuery thông qua việc sử dụng phương thức, nếu tôi đúng.

Nếu bạn muốn cập nhật thông tin của mình data-attributes, hãy sử dụng -

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

- nếu không, $('body').attr('data-test', 'text');sẽ hoạt động tốt.

Một cách khác bạn có thể thực hiện điều này là sử dụng -

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

- trong đó hạn chế bất kỳ thay đổi thuộc tính nào HTMLElement.prototype.dataset, không bổ sungHTMLElement.prototype.attributes .


2

Một cách khác để đặt thuộc tính data- là sử dụng thuộc tính tập dữ liệu .

<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

Để giữ cho jQuery và DOM đồng bộ hóa, một tùy chọn đơn giản có thể là

$('#mydiv').data('myval',20).attr('data-myval',20);        
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.