데이터 속성 값을 업데이트 할 수 없습니다.


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

답변:


65

아래 답은 좋은 사람입니다

데이터 메서드를 올바르게 사용하고 있지 않습니다 . 데이터를 업데이트하는 올바른 코드는 다음과 같습니다.

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

@dev 나는 내 대답을 편집하고 사용해야하는 전체 코드를 추가했습니다.
Lucas Willems 2013

7
이것은 흥미 롭다. 콘솔에서 값이 변경되는 것을 볼 수 있습니다. 그러나 Chrome을 사용하여 html을 보면 0 (초기)입니다. 나중에 마지막 값 (예 : 5)을 검색 할 수 있으면 괜찮을 것 같아요
dev

6
@dev가 말했듯이 jQuery에서 변경되었지만 크롬 및 사파리의 html에는 영향을 미치지 않습니다. 그래서 나는 data () 대신 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);
});

추신 :하지만 거의 모든 경우에 data () 객체를 사용해야하지만 전부는 아닙니다 ...


7
데이터는 dom에로드되고 .data ()를 사용하여 조작됩니다. 속성은 업데이트되지 않으며 데이터를 저장하거나 검색하는 데 사용해서는 안되며 초기 설정 데이터에만 사용하면 안됩니다. 이것은 속성을 변경하는 한 가지 방법이지만 ( .prop()선호 됨) 데이터를 사용하는 올바른 방법은 아닙니다.
Nigel Angel

4
.prop()HTML이 아닌 DOM의 속성 또는 속성 값에 액세스하거나 변경합니다. .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 이에 대한 귀하의 의견에 감사 드리지만 데이터가 항상 사용하기에 가장 좋은 옵션은 아닙니다. 데이터 속성의 값을 업데이트하고 DOM에 표시하고 CSS 또는 Javascript에서 사용되는 기본 값을 실제로 변경해야하는 경우 어떻게해야합니까? 가장 좋은 방법은 Javascript에서 어떤 방식 으로든 값을 업데이트하지 않는 경우 일반적으로 .data ()를 사용하는 것입니다.하지만 그렇다면 항상 .attr ()을 사용하여 값을 설정하고 검색합니다.
jezzipin

30

기존의 기본 JavaScript를 사용하여 이러한 속성을 검색하거나 업데이트 하려면 아래와 같이 getAttributesetAttribute메소드를 사용하면 됩니다.

자바 스크립트

<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 2015 년

마지막 조언을 해주셔서 대단히 감사합니다. "값을 업데이트하려면 다음과 같이 설정해야합니다. 그러면 업데이트 된 값을 얻게됩니다."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"]') // current length is 0

그래서해야 했어요

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

DOM을 업데이트하려면 :

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

속성이 있는지 여부 $ .attr이 덮어 씁니다.


1
jquery 2.1.1과 동일한 문제가 있습니다!
phlegx

8

비슷한 문제가 있었고 결국 두 가지를 모두 설정해야했습니다.

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

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

그리고이 후

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

도움이 되었기를 바랍니다.


6

기본적으로 필요에 따라 데이터 속성 값을 설정 / 업데이트하는 두 가지 방법이 있습니다. 차이점은 데이터가 저장되는 곳에

사용 .data()하면라는 로컬 변수에 저장되며 data_user, 요소 검사시 표시되지 않으며 사용 .attr()하면 공개적으로 표시됩니다.

이 댓글에 대한 훨씬 더 명확한 설명


2

이 답변은 데이터 속성의 값을 변경하려는 사람들을위한 것입니다.

제안은 @adeneo가 말했듯이 Jquery data-attr의 값을 올바르게 변경하지 않습니다. 그러나 어떤 이유로 든, 나는 그 (또는 다른 사람들)이 데이터 작성자를 업데이트하려는 사람들을 위해 올바른 방법을 게시하는 것을 보지 못했습니다. @Lucas Willems가 올린 답변은 Brian Tompsett-汤 莱恩가 겪고있는 문제에 대한 답변 일 수 있지만 다른 사용자를 여기로 데려 오는 질문에 대한 답변은 아닙니다.

원문 문에 대한 빠른 답변

-데이터를 업데이트하려면

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

쉬운 실수 *-값을 변경하려는 속성의 시작 부분에 "데이터-"가 있어야합니다.


2

비슷한 문제가 있었지만 IE 10 이하에서는 지원되지 않지만이 솔루션을 제안합니다.

주어진

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

Javascript 표준은 data-example-update를 업데이트하기 위해 dataset이라는 속성을 정의합니다.

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

참고 : 올바른 데이터 속성에 액세스하려면 카멜 케이스 표기법을 사용하십시오.

출처 : https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes


1

jquery를 사용할 때 html 데이터 태그가 업데이트되지 않는 동일한 문제가 있었지만 실제 작업을 수행하는 코드를 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.