HTML 요소에 JavaScript 객체를 첨부하는 좋은 방법이 있습니까?


96

JavaScript 개체를 HTML 요소와 연결하고 싶습니다. 이를 수행하는 간단한 방법이 있습니까?

나는 눈치 HTML DOM이 의 setAttribute 메소드를 정의하고이 임의의 속성 이름에 대해 정의 된 것 같습니다. 그러나 이것은 문자열 값만 설정할 수 있습니다. (물론 이것을 사용하여 키를 사전에 저장할 수 있습니다.)

세부 사항 (일반적인 질문에 대부분 관심이 있지만) :

특히, 트리의 노드를 나타내는 HTML 요소가 있고 드래그 앤 드롭을 활성화하려고하지만 jQuery 드롭 이벤트는 드래그 앤 드롭되는 요소 만 제공합니다.

이벤트 핸들러로 정보를 가져 오는 일반적인 패턴은 자바 스크립트 객체를 생성하는 동시에 HTML 요소를 생성 한 다음 이러한 자바 스크립트 객체를 닫아 이벤트 핸들러를 정의하는 것 같습니다. 그러나이 방법은 잘 작동하지 않습니다. 케이스 (드래그가 시작될 때 채워지는 전역 객체를 가질 수 있지만 ... 약간 불쾌한 느낌).

답변:


44

jQuery data () 메서드를 보셨습니까 ? 원하는 경우 복잡한 개체를 요소에 할당하거나 해당 메서드를 활용하여 최소한 개체 (또는 다른 데이터)에 대한 참조를 유지할 수 있습니다.


8
감사합니다 : 이것은 제가 찾던 것입니다. 흥미롭게도이 메소드를 정의하는 것은 jquery가 각 요소의 문자열 속성에있는 전역 사전에 키를 저장합니다. 이 문자열 속성의 이름은 jquery가 처음로드 될 때 무작위로 생성됩니다. (좋은 방법이 없다고 제안하는 것은 DOM만을 사용하여이 작업을 수행하는 더 좋은 방법이 없습니다.)
user47741

6
bobince가 준 대답 을 사용하여 jQuery가 data() 작동 한다는 점은 주목할 가치가 있으므로 아직 jquery를 사용하고 있지 않다면 그것을 사용하는 것이 좋습니다.
Eamon Nerbonne 2014 년

6
6 년 후이 답변을 되돌아보고 "이것은 매우 차선적인 답변입니다. @bobince가 받아 들여진 답변을 가져야합니다"라고 생각할 수 있다는 사실이 재밌습니다.
Phil.Wheeler 2015 년

6
이 질문에는 jQuery 태그가 없습니다.
Michał Perłakowski

111

JavaScript 객체에는 임의의 속성이 할당 될 수 있으며이를 허용하기 위해 특별히 수행해야하는 작업은 없습니다. 여기에는 DOM 요소가 포함됩니다. 이 동작은 DOM 표준의 일부는 아니지만 JavaScript의 첫 번째 버전으로 돌아가서 완전히 신뢰할 수 있습니다.

var div= document.getElementById('nav');
div.potato= ['lemons', 3];

5
@ tat.wright-그가 말하는 HTML 요소의 임의 속성을 Expando 속성이라고합니다. 또한 div.potato는 div.getAttribute ( "potato")를 의미하지 않습니다.
nickytonline

37
@ 팀 다운 : 그럼 그냥하지 마세요. 신뢰할 수없는 이유를 알지 못합니다. 이것은 null로 설정할 수 있기 때문에 String 개체가 신뢰할 수 없다고 말하는 것과 같습니다.
simon 09.09.10

5
@TimDown :하지만 document.expando = falsebreak jQuery.data 도 설정하지 않습니까?
Joey Adams

8
내 경험상 이것이 나쁠 수있는 이유는 가능한 메모리 누수 때문입니다. 쉽게 피할 수있는 방법이 있을지 모르지만 이것을 많이 사용하는 디자인을 만들었을 때 많은 메모리 누수가 발생했습니다. 요소가 페이지에서 제거되면 참조 계산이 처리되지 않고 (정리되지 않음) 특히주의해야한다고 생각합니다.
eselk 2013-01-29

7
공정한 경고 : 대답이 설명하는대로 행복하게하고 있었지만 필드 이름 "potato"대신 "scope"를 사용했습니다. "범위"는 테이블 셀 요소 ( <td>) 의 속성 이고이 필드에 할당 한 개체는 # toString'ed입니다. td.scope === '[object Object]'를보고 매우 혼란 스러웠습니다.
David Groomes 2015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.