본문 바로가기
오류 해결

[jQuery] attr로 할당한 data태그를 data함수로 받아올 때 값이 안 찍히는 버그 해결

by 머그워트 2023. 7. 12.
728x90

HTML에서 data- 로 시작하는 태그는 jQuery에서 .data() 함수로 가져올 수 있다.

예를 들어 data-idx 태그라면 $(this).data("idx") 이런 식으로 해당 태그를 선택할 수 있다.

 

속성값을 가져오는 .attr() 함수로도 비슷한 기능을 수행할 수 있다.

예를 들어 data-idx 태그를 가져오려면 $(this).attr("data-idx") 이렇게도 가져올 수 있다.

 

근데 이 data 함수로 값을 가져와 주는 쪽에서 오류가 나서..

검색해 보니 attr 함수와 data 함수에는 차이가 있기 때문에 사용에 조심해야 한다고 한다!!

 

문제가 된 로직은 이것이다.

 

1. 기본 상태에는 data-idx에 값이 들어 있지 않음

<button type="button" id="btn" data-idx="">btn</button>

 

2. 이 버튼에 jQuery attr 함수로 data-idx값을 넣어 줌

$("#btn").attr("data-idx", 1)

 

3. 같은 페이지에서 data 함수로 이 버튼의 data-idx값을 가져와서 사용함

var idx = $("#btn").data("idx")

 

4. 같은 버튼에 data 함수로 data-idx에 2를 넣어 줌

$("#btn").data("idx", 2)

 

5. attr 함수로 버튼의 data-idx값을 가져옴

$("#btn").attr("data-idx")

 → 2가 찍힐 거라고 예상했는데 1이 찍힌다

개발자 도구에서 확인한 HTML 태그의 data-idx도 2로 갱신되지 않았다.

 

테스트해본 결과 data로 넣은 값은 data로 가져오고, attr로 넣은 값은 attr로 가져와야 한다는 걸 알게 됐다..

 

data()로 넣은 값은 HTML 태그에 적용되지 않고 별도의 메모리에 저장되는 듯하다. (받아오는 건 잘 되는데..)

반면 attr()로 넣은 값은 HTML 태그에 잘 적용된다.

그래서 data-idx 태그에 값이 들어 있지 않은 상태에서 $("#btn").data("idx",2) 를 해줘도

개발자 도구에서 HTML을 확인해 보면 data-idx에 값이 들어가지 않는다.

근데 console.log($("#btn").data("idx"))를 하면 또 2가 찍힌다. 별도의 메모리에 저장됐기 때문..!!

 

아무래도 HTML에 찍히는게 디버깅이나 여러모로 편할 듯해서 나는 이부분은 다 attr()로 사용하도록 수정했다.

 

data 함수와 attr 함수의 기능은 유사하지만 이를 섞어서 쓰는 일이 없어야 할 듯하다.

728x90

댓글