Không thể cập nhật giá trị thuộc tính dữ liệu


91

Mặc dù có một số ví dụ về điều này trên web, nhưng nó dường như không hoạt động chính xác. Tôi không thể tìm ra vấn đề.

Tôi có html đơn giản này

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

Mỗi khi tôi nhấp vào liên kết "thay đổi giá trị dữ liệu", tôi muốn cập nhật giá trị dữ liệu của data-num. Ví dụ: tôi cần nó là 1,2,3,4, ... (cộng 1 mỗi khi tôi nhấp vào liên kết)

những gì tôi có là

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

Giá trị thay đổi một lần từ 0 đến 1 mỗi lần. Tôi không thể làm cho nó tăng dần. Bất kỳ đề xuất những gì tôi đang làm sai?


5
data- chỉ là một thuộc tính khi tải trang. Dữ liệu được tải vào dom và được thao tác ở đó bằng cách sử dụng .data(). Thuộc tính không được cập nhật và không nên được sử dụng để lưu trữ hoặc truy xuất dữ liệu, chỉ để thiết lập dữ liệu ban đầu.
Nigel Angel

1
@NigelAngel Sai. Mục đích của thuộc tính dữ liệu là cung cấp phương tiện mà người dùng có thể lưu trữ (và sửa đổi) dữ liệu tùy ý mà không có bất kỳ nơi hợp lệ nào khác để sử dụng. Và ví dụ về điều này sẽ dành cho ngoại tệ khi dấu thập phân là dấu phẩy. Để tính toán số với điều này, bạn phải lưu trữ một giá trị thích hợp với một dấu thập phân thực ở đâu đó. Nếu đây là tổng giá và cần được cập nhật dựa trên những thay đổi thì một lần nữa giá trị dữ liệu này sẽ phải thay đổi và do đó bạn cần có thể cập nhật nó. Đối với điều này, bạn sẽ sử dụng .attr ()
jezzipin.

Câu trả lời:


64

CÂU TRẢ LỜI DƯỚI ĐÂY LÀ CÂU TRẢ LỜI TỐT

Bạn không sử dụng đúng phương pháp dữ liệu . Mã chính xác để cập nhật dữ liệu là:

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

Vì vậy, ví dụ của bạn sẽ là:

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

97
Điều này là sai, đây là sai phương pháp để cập nhật một thuộc tính
adeneo

2
Có, tôi đồng ý với bạn @adeneo nhưng anh ấy không sử dụng phương pháp dữ liệu một cách chính xác. Tại sao lại sử dụng loại thuộc tính này nếu bạn muốn cập nhật nó bằng phương thức attr?
Lucas Willems,

@dev Tôi đã chỉnh sửa câu trả lời của mình và thêm toàn bộ mã bạn phải sử dụng.
Lucas Willems

7
Hay đấy. Tôi có thể thấy rằng giá trị thay đổi trong bảng điều khiển. Nhưng khi tôi nhìn vào html bằng Chrome thì nó là 0 (chữ cái đầu). Tôi đoán nó là ok nếu sau này tôi có thể lấy giá trị cuối cùng (ví dụ 5)
dev

6
Như @dev đã nói, tôi đã thử và thấy điều đó đã thay đổi trong jQuery nhưng không ảnh hưởng đến html trong chrome và safari. Vì vậy, tôi quyết định sử dụng attr () thay vì data ().
QMaster

118

Sử dụng điều đó thay thế, nếu bạn muốn thay đổi thuộc tính data-num của phần tử nút, không phải của đối tượng dữ liệu :

BẢN GIỚI THIỆU

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

Tái bút: nhưng bạn nên sử dụng đối tượng data () trong hầu hết mọi trường hợp, nhưng không phải tất cả ...


7
Dữ liệu được tải vào dom và được thao tác ở đó bằng cách sử dụng .data (). Thuộc tính không được cập nhật và không nên được sử dụng để lưu trữ hoặc truy xuất dữ liệu, chỉ để thiết lập dữ liệu ban đầu. Mặc dù đây là một cách để thay đổi một thuộc tính ( .prop()được ưu tiên), nhưng nó không phải là cách chính xác để sử dụng dữ liệu.
Nigel Thiên thần

4
.prop()sẽ truy cập hoặc thay đổi giá trị của bất kỳ thuộc tính hoặc thuộc tính nào trong DOM nhưng không phải HTML. .attr()sẽ truy cập và viết lại HTML khiến nó chậm hơn .prop(). Bạn không nên sử dụng .attr()thay thế .data(), không chỉ vì nó chậm hơn, mà vì đó không phải là cách nó hoạt động. jsfiddle.net/eXA76/2
Nigel Angel

1
Tôi nghĩ câu trả lời này nên bị xóa vì nó đưa ra lời khuyên không tốt về việc sử dụng dữ liệu ().
Nigel Angel

2
Có, tài liệu jQuery về cách nó được sử dụng! Dữ liệu api.jquery.com/data được lưu trữ trong một biến toàn cục khi tải tài liệu. Tham chiếu nó qua thuộc tính SẼ KHÔNG HOẠT ĐỘNG nếu một nhà phát triển, plugin hoặc tập lệnh khác cập nhật dữ liệu một cách chính xác bằng cách sử dụng .data(). Bằng cách bỏ qua phương pháp chính xác và sử dụng thuộc tính bạn đang hướng tới việc cố ý gây ra sự cố.
Nigel Thiên thần

4
@NigelAngel Mặc dù tôi đánh giá cao ý kiến ​​của bạn về điều này, nhưng dữ liệu không phải lúc nào cũng là lựa chọn tốt nhất để sử dụng. Điều gì sẽ xảy ra nếu bạn cần cập nhật giá trị của một thuộc tính dữ liệu và hiển thị nó trong dom cũng như thực sự thay đổi giá trị cơ bản sau đó được CSS hoặc thậm chí Javascript sử dụng? Cách tốt nhất thường là sử dụng .data () nếu bạn không cập nhật giá trị theo bất kỳ cách nào từ Javascript nhưng nếu bạn có, hãy luôn sử dụng .attr () để đặt và truy xuất giá trị.
jezzipin

30

Nếu chúng tôi muốn truy xuất hoặc cập nhật các thuộc tính này bằng cách sử dụng JavaScript gốc, hiện có , thì chúng tôi có thể làm như vậy bằng cách sử dụng các phương thức getAttributesetAttributenhư được hiển thị bên dưới:

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>

Thông qua 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'); 

Đọc tài liệu này cho vani js hoặc tài liệu này cho jquery


@Nigel Angel, Bạn đã thử nghiệm nó trên firefox chưa? $ (this) .data ('fruit') không hoạt động trên firefox.
Lalit Kumar Maurya

Cảm ơn bạn rất nhiều về lời khuyên cuối cùng "Bạn phải đặt nó như bên dưới để cập nhật giá trị. Sau đó, bạn sẽ nhận được giá trị cập nhật" rly hành vi kỳ lạ trong jquery ..
jgr

12

Đối với bản thân tôi, sử dụng Jquery lib 2.1.1, điều sau KHÔNG hoạt động như tôi mong đợi:

Đặt giá trị thuộc tính dữ liệu phần tử:

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

NHƯNG bản thân phần tử vẫn không có thuộc tính:

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

Tôi cần cập nhật DOM để sau này có thể thực hiện $ ('. My-class [data-num = "myValue"]') // chiều dài hiện tại là 0

Vì vậy, tôi phải làm

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

Để cập nhật DOM:

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

Thuộc tính có tồn tại hay không $ .attr sẽ ghi đè.


1
Tôi gặp vấn đề tương tự với jquery 2.1.1!
phlegx

8

Gặp vấn đề tương tự và cuối cùng tôi phải đặt cả hai

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

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

Và sau này

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

Hi vọng điêu nay co ich.


6

Về cơ bản, có hai cách để thiết lập / cập nhật giá trị thuộc tính dữ liệu, tùy thuộc vào nhu cầu của bạn. Sự khác biệt chỉ là, nơi dữ liệu được lưu,

Nếu bạn sử dụng, .data()nó sẽ được lưu trong biến cục bộ được gọi là data_user, và nó sẽ không hiển thị khi kiểm tra phần tử, Nếu bạn sử dụng, .attr()nó sẽ hiển thị công khai.

Giải thích rõ ràng hơn nhiều về nhận xét này


2

Câu trả lời này dành cho những người muốn chỉ thay đổi giá trị của một thuộc tính dữ liệu

Đề xuất sẽ không thay đổi giá trị của Jquery data-attr của bạn một cách chính xác như @adeneo đã nêu. Tuy nhiên, vì một số lý do, tôi không thấy anh ấy (hoặc bất kỳ người nào khác) đăng phương pháp chính xác cho những người đang tìm cách cập nhật data-attr của họ. Câu trả lời mà @Lucas Willems đã đăng có thể là câu trả lời cho vấn đề Brian Tompsett - 汤 莱恩 đang gặp phải, nhưng nó không phải là câu trả lời cho câu hỏi có thể đưa những người dùng khác đến đây.

Câu trả lời nhanh liên quan đến tuyên bố yêu cầu ban đầu

-Để cập nhật data-attr

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

Những sai lầm dễ mắc phải * - phải có "data-" ở đầu thuộc tính mà bạn đang muốn thay đổi giá trị.


2

Gặp sự cố tương tự, tôi đề xuất giải pháp này mặc dù không được hỗ trợ trong IE 10 trở xuống.

Được

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

Tiêu chuẩn Javascript định nghĩa một thuộc tính được gọi là tập dữ liệu để cập nhật dữ liệu-ví dụ-cập nhật.

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

Lưu ý: sử dụng ký hiệu trường hợp lạc đà để truy cập thuộc tính dữ liệu chính xác.

Nguồn: https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes


1

Tôi đã gặp vấn đề tương tự là thẻ dữ liệu html không cập nhật khi tôi đang sử dụng jquery Nhưng việc thay đổi mã thực sự hoạt động từ jquery sang javascript đã hoạt động.

Hãy thử sử dụng điều này khi nút được nhấp: (Lưu ý rằng mã chính là hàm 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);

});
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.