e.target.dataset과 jQuery의 .data()의 결과 값이 다르다?

어떻게 된일인지 파악해보자.

 

 

환경정보

-jQuery : https://code.jquery.com/jquery-3.3.1.min.js

 

 

 

요구사항

data-lang 속성의 값이 'ko'인 타겟을 클릭하면 data-lang 값이 en으로 변경된다.

이 때 변경된 data-lang의 값을 타겟 재 클릭 시 가져오기

 

 

 

이슈사항

vue.js 를 사용하여 동적으로 리스트 생성했고, 동적으로 생성하는 타겟을 클릭 -> 동적으로 타겟의 값이 수정됨 -> 타겟을 재 클릭 시 결과 값이 e.target.dataset과 .data();의 값이 상이함.

 

e.target.dataset의 경우 내가 의도한대로 수정된 결과 값을 리턴한다.

하지만 $(e.target).data()의 경우 기존의 결과 값이 리턴되므로 오류를 생겼다. 

 

 

 

원인분석

jQuery에서 .data() 메서드를 파라미터 없이 호출하게 되면 캐싱(caching)기능이 작동하게 되어서 생기는 문제

(파라미터가 없음이 기준)

 

 

1.jQuery의 data()로직을 따라가다 보면 cache메서드 호출이 되고, 이 때 this.expando의 유니크한 키 값이 없을 경우 object에 저장한다.

 

2.그 후 data()가 같은 객체에서 호출이 되면 cache 메서드에서 유니크한 키 값을 찾게되고, 일치하는 값이 object에 있으면 저장된 값(캐싱된 값)을 가져온다.

 

따라서 e.target.dataset과 .data()의 값은 상이한 결과가 나오는게 맞다.

내 코드가 문제인 줄 알고 한참을 삽질했다.

 

dataset의 값은 lang:en으로 정상적으로 변경되었으나 value값은 기존에 캐싱된 ko가 나오는 것을 확인 할 수 있다.

 

이래서 메서드를 잘 알고 있어야 하는구나 싶었다..

 

 

+ Recent posts