jQuery 데이터 대 Attr?


513

사용시 $.data$.attr사용시 의 차이점은 무엇입니까 data-someAttribute?

내 이해는 DOM이 아닌 $.datajQuery 내에 저장 된다는 것 입니다 $.cache. 따라서 $.cache데이터 저장 에 사용하려면 을 사용해야합니다 $.data. HTML5 데이터 속성을 추가하려면을 사용해야합니다 $.attr("data-attribute", "myCoolValue").



14
@zzz 실제로 질문에 대답하지 않는 것 같습니다 ...?
sdleihssirhc

2
실제로는 간접적으로 수행됩니다. attr()사용하는 data()것이 안전 하지만 객체를 통해 연결하면 메모리 누수가 발생할 수 있습니다 (적어도 IE에서는) . 그는 명시 적으로 나오지 않고 말하지는 않지만 답장에서 이것을 암시합니다. jQuery 문서에 대한 자세한 정보 ( "추가 정보"참조) : api.jquery.com/attr
ken

6
@John B, 단지 FYI (이것은 오래되었지만)의 데이터 속성 data-someAttribute은 유효하지 않습니다. 사양에 따라 소문자 만 허용됩니다. 대문자를 사용하면 수많은 이상한 문제가 발생합니다.
ken

1
@AdrienBe Lot의 참조는 검색을 통해 쉽게 찾을 수 있지만 지루하기 때문에 여기로 이동하십시오. stackoverflow.com/a/22753630/84473
ken

답변:


748

서버에서 DOM 요소로 데이터를 전달하는 경우 요소에서 데이터를 설정해야합니다.

<a id="foo" data-foo="bar" href="#">foo!</a>

그런 다음 .data()jQuery를 사용하여 데이터에 액세스 할 수 있습니다 .

console.log( $('#foo').data('foo') );
//outputs "bar"

그러나 데이터를 사용하여 jQuery의 DOM 노드에 데이터를 저장하면 변수가 노드 객체 에 저장됩니다 . 이는 속성이 문자열 값만 수용 하므로 노드 요소 에 데이터를 저장하는 것처럼 복잡한 객체 및 참조를 수용하기위한 것입니다.

위의 예를 계속하십시오.
$('#foo').data('foo', 'baz');

console.log( $('#foo').attr('data-foo') );
//outputs "bar" as the attribute was never changed

console.log( $('#foo').data('foo') );
//outputs "baz" as the value has been updated on the object

또한 데이터 속성의 명명 규칙에는 약간의 숨겨진 "gotcha"가 있습니다.

HTML :
<a id="bar" data-foo-bar-baz="fizz-buzz" href="#">fizz buzz!</a>
JS :
console.log( $('#bar').data('fooBarBaz') );
//outputs "fizz-buzz" as hyphens are automatically camelCase'd

하이픈 키는 여전히 작동합니다.

HTML :
<a id="bar" data-foo-bar-baz="fizz-buzz" href="#">fizz buzz!</a>
JS :
console.log( $('#bar').data('foo-bar-baz') );
//still outputs "fizz-buzz"

그러나 반환 된 객체 .data()에는 하이픈 키 세트가 없습니다.

$('#bar').data().fooBarBaz; //works
$('#bar').data()['fooBarBaz']; //works
$('#bar').data()['foo-bar-baz']; //does not work

이런 이유로 자바 스크립트에서 하이픈 키를 피하는 것이 좋습니다.

HTML의 경우 하이픈 형식을 계속 사용하십시오. HTML 속성은 ASCII-소문자 자동으로 얻을로되어있다 그래서,<div data-foobar></div> , <DIV DATA-FOOBAR></DIV><dIv DaTa-FoObAr></DiV>되는 가정 동일로 취급하지만, 최고의 호환성을 위해 소문자 형태를 선호한다.

그만큼 .data() 방법은 값이 인식 된 패턴과 일치하는 경우 몇 가지 기본 자동 전송을 수행합니다.

HTML :
<a id="foo"
    href="#"
    data-str="bar"
    data-bool="true"
    data-num="15"
    data-json='{"fizz":["buzz"]}'>foo!</a>
JS :
$('#foo').data('str');  //`"bar"`
$('#foo').data('bool'); //`true`
$('#foo').data('num');  //`15`
$('#foo').data('json'); //`{fizz:['buzz']}`

이 자동 전송 기능은 위젯 및 플러그인 인스턴스화에 매우 편리합니다.

$('.widget').each(function () {
    $(this).widget($(this).data());
    //-or-
    $(this).widget($(this).data('widget'));
});

원래 값을 문자열로 사용해야하는 경우 사용해야합니다. .attr() 다음 .

HTML :
<a id="foo" href="#" data-color="ABC123"></a>
<a id="bar" href="#" data-color="654321"></a>
JS :
$('#foo').data('color').length; //6
$('#bar').data('color').length; //undefined, length isn't a property of numbers

$('#foo').attr('data-color').length; //6
$('#bar').attr('data-color').length; //6

이것은 좋은 예였습니다. 색상 값을 저장하기 위해 숫자 16 진수 표기법 (예 : 0xABC123)을 사용했지만 1.7.2 이전의 jQuery 버전에서 16 진수가 잘못 구문 분석 되었음을 주목할 가치가 있습니다. 구문 분석되었으며 NumberjQuery 1.8 rc 1에서 더 이상 구문 분석되지 않습니다 .

jQuery 1.8 rc 1은 자동 전송 동작을 변경했습니다 . 이전에 유효한 형식으로 된 형식은Number 은로 캐스팅되었습니다 Number. 이제 숫자 값은 표시가 동일하게 유지되는 경우에만 자동 전송됩니다. 이것은 예제와 함께 가장 잘 설명됩니다.

HTML :
<a id="foo"
    href="#"
    data-int="1000"
    data-decimal="1000.00"
    data-scientific="1e3"
    data-hex="0x03e8">foo!</a>
JS :
                              // pre 1.8    post 1.8
$('#foo').data('int');        //    1000        1000
$('#foo').data('decimal');    //    1000   "1000.00"
$('#foo').data('scientific'); //    1000       "1e3"
$('#foo').data('hex');        //    1000     "0x03e8"

대체 숫자 구문을 사용하여 숫자 값에 액세스하려는 경우 값을 Number 단항 +연산자 와 같이 먼저 .

JS (계속) :
+$('#foo').data('hex'); // 1000

17
이것이 사실 동안 @vitorbal,에 의해 반환되는 객체는 .data()것입니다 하지 그래서, 하이픈 형태로 설정되어 $('#bar').data('foo-bar-baz')작동하지만, $('#bar').data()['foo-bar-baz']하지 않습니다. 이런 이유로 사람들은 하이픈 형식을 사용하지 않는 것이 좋습니다.
zzzzBov

1
좋아, 이제 네가 무슨 뜻인지 알 겠어. 업데이트에 감사드립니다. :)
vitorbal

1
@SableFoste, 어느 링크? api.jquery.com/data 는 메소드의 올바른 링크이며 내가 아는 한 변경되지 않았습니다.
zzzzBov

1
난 foo, bar, baz, fizz, buzz 더 좋아 : D
Usman Younas

1
모든 라인을 사랑하십시오.
Foo Bar

108

이 둘의 주요 차이점은 저장 위치와 액세스 방법입니다.

$.fn.attr 검사시 공개적으로 볼 수있는 속성에 요소에 직접 정보를 저장하고 요소의 고유 API에서 사용할 수 있습니다.

$.fn.data어리석게 모호한 장소에 정보를 저장합니다 . data_user로컬로 정의 된 함수 Data의 인스턴스 인 로컬 변수에 닫혀 있습니다 . 이 변수는 jQuery 외부에서 직접 액세스 할 수 없습니다.

데이터 세트 attr()

  • 에서 접근 가능 $(element).attr('data-name')
  • 접근에서 element.getAttribute('data-name'),
  • 값의 형태 인 경우 data-name도에서 액세스 할 수 $(element).data(name)element.dataset['name']element.dataset.name
  • 검사시 요소에 표시
  • 객체가 될 수 없습니다

데이터 세트 .data()

  • 접근 에서.data(name)
  • .attr()어디서나 접근 할 수없는
  • 검사시 요소에 공개적으로 보이지 않음
  • 객체가 될 수 있습니다

2
예, 내 주요 질문은이 데이터가 저장된 위치에 관한 것이므로 해당 정보에 감사드립니다!
Max Wilder 2018 년

2
또한 .attr()나중에 당신이 사용하려는 경우 이동하는 방법이며, 데이터 셀렉터 등을 ( .data()를 찾을 수 없습니다; 참조 codepen.io/anon/pen/EvawPV?editors=1011를 )
Kamafeather

1

data-*속성을 사용 하여 사용자 정의 데이터를 임베드 할 수 있습니다 . data-*속성은 모든 HTML 요소에 속성을 우리에게 삽입 사용자 정의 데이터 할 수있는 기능을 제공합니다.

jQuery .data() 메소드를 사용하면 순환 참조 및 메모리 누수로부터 안전한 방식으로 모든 유형의 데이터를 DOM 요소에 가져 오거나 설정할 수 있습니다.

.attr()일치하는 세트의 첫 번째 요소에 대해서만 jQuery 메소드 get / set 속성 값.

예:

<span id="test" title="foo" data-kind="primary">foo</span>

$("#test").attr("title");
$("#test").attr("data-kind");
$("#test").data("kind");
$("#test").data("value", "bar");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.