데이터 속성으로 요소 선택


1019

data속성을 기반으로 요소를 선택하는 쉽고 간단한 방법이 있습니까? 예를 들어, 명명 된 속성 데이터를 보유하고있는 모든 앵커 선택 customerID의 값을 갖는다 22.

rel그러한 정보를 저장 하는 데 주저 하거나 다른 속성 을 사용하는 것이 주저 하지만 어떤 데이터가 저장되어 있는지에 따라 요소를 선택하는 것이 훨씬 어렵다는 것을 알았습니다.



이것이 모든 데이터 속성 을 선택하는 데 도움이 된 것입니다 (값에 관계없이). $('*[data-customerID]')예를 들어$('*[data-customerID]').each( function() { ... });
Kai Noack

답변:


1467
$('*[data-customerID="22"]');

를 생략 할 수는 *있지만 사용중인 jQuery 버전에 따라 올바르게 기억하면 잘못된 결과가 발생할 수 있습니다.

이 경우 Selectors API ( document.querySelector{,all}) 와의 호환성을 위해 속성 값 ( 22) 주위의 따옴표 는 생략 할 수 없습니다 .

또한 jQuery 스크립트에서 데이터 속성을 많이 사용하는 경우 HTML5 사용자 정의 데이터 속성 플러그인 사용을 고려할 수 있습니다 . 이를 사용 .dataAttr('foo')하면를 사용하여 훨씬 더 읽기 쉬운 코드를 작성할 수 있으며 축소 후 파일 크기가 줄어 듭니다 (를 사용하는 것과 비교 .attr('data-foo')).


69
jQuery 1.4.3부터 .data ( 'foo')는 'data-foo'속성의 값을 가져 오는 데 작동합니다. 또한 jQuery 1.6 이후 : .data ( 'fooBar')는 'data-foo-bar'속성을 가져옵니다.
James McCormack

4
@Zootius : 예, 플러그인 readme에 대한 메모가 있습니다.“jQuery 1.4.3부터 기본적 .data()으로 사용자 정의 data-*속성에 매핑 되어이 플러그인이 중복됩니다. 그래도 이전 버전의 jQuery에도 사용할 수 있습니다.”
Mathias Bynens

그렇다면 jQuery 1.4.3을 어떻게 게시하고 데이터 객체의 값으로 객체를 선택합니까? 이 예에서 customerID에 대한 데이터가 22 인 객체를 선택하려고 했습니까?
Trip

54
또한 특정 데이터 속성에 관심이있는 경우 다음을 수행 할 수 있습니다.$('[data-customerID]')
Darkside

7
데이터 필드가 jquery (을 사용하여 .data()) 로 설정하면 작동하지 않습니다 .
Martin R.

329

인터넷 검색을하고 데이터 속성을 사용하여 선택하는 방법에 대한 일반적인 규칙을 원할 경우 :

$("[data-test]")단지 어느 한 요소를 선택한다 갖는 데이터 속성이 (어떠한 속성의 값을 상관 없음). 포함 :

<div data-test=value>attributes with values</div>
<div data-test>attributes without values</div>

$('[data-test~="foo"]')data 속성에 포함되어 foo 있지만 정확하지 않아도되는 요소를 선택합니다 .

<div data-test="foo">Exact Matches</div>
<div data-test="this has the word foo">Where the Attribute merely contains "foo"</div>

$('[data-test="the_exact_value"]')데이터 속성 정확한 값이 the_exact_value인 요소를 선택합니다 ( 예 :

<div data-test="the_exact_value">Exact Matches</div>

하지만

<div data-test="the_exact_value foo">This won't match</div>

21
좋은. 참고로 ~=일치하는 반면 공백 단어 구분 *=일치하는 문자열을.
sam

무엇에 대한 ^문자?
kuba44

1
@ kuba44 실제로 당신은 또한 같은 ^ 사용할 수 있습니다 $('[data-test^=foo]')당신은 같은 foo를 시작으로 아무것도 선택이 경우 <div data-test="foo_exact_value">또는 <div data-test="food">이 아닌<div data-test="seafoo">
JDuarteDJ

속성 선택기의 포괄적 인 목록 : drafts.csswg.org/selectors-3/#attribute-selectors
user1460043

142

를 사용 $('[data-whatever="myvalue"]')하면 html 속성이있는 것을 선택하지만 최신 jQueries에서는 $(...).data(...)데이터를 첨부하는 데 사용 하면 마술 브라우저를 사용하고 html에 영향을 미치지 않으므로 이전 답변에.find 표시된 것처럼 검색되지 않는 것 같습니다 .

확인 (1.7.2 이상으로 테스트) (또한 바이올린 참조 ) : (보다 완벽하게 업데이트 됨)

var $container = $('<div><div id="item1"/><div id="item2"/></div>');

// add html attribute
var $item1 = $('#item1').attr('data-generated', true);

// add as data
var $item2 = $('#item2').data('generated', true);

// create item, add data attribute via jquery
var $item3 = $('<div />', {id: 'item3', data: { generated: 'true' }, text: 'Item 3' });
$container.append($item3);

// create item, "manually" add data attribute
var $item4 = $('<div id="item4" data-generated="true">Item 4</div>');
$container.append($item4);

// only returns $item1 and $item4
var $result = $container.find('[data-generated="true"]');

1
aha-

4
.filter 여기에
drzaus

22
그것은 마술 브라우저를 사용하고 HTML에는 영향을 미치지 않습니다 : 마술과 같은 것은 없습니다;) learningjquery.com/2011/09/using-jquerys-data-apis
Tom Sarduy


1
나중에 찾아야하는 데이터 속성을 추가하려면 다음을 사용하십시오.$item.attr('data-id', 10);
Pedro Moreira

77

jQuery가 없으면 JavaScript 답변을 보지 못했습니다. 잘만되면 그것은 누군가를 돕는다.

var elements = document.querySelectorAll('[data-customerID="22"]');

elements[0].innerHTML = 'it worked!';
<a data-customerID='22'>test</a>

정보 :


1
고마워 비 jquery 솔루션을 만나서 반갑습니다.
Chuck

68

data 속성을 가진 모든 앵커를 선택하려면 data-customerID==22을 포함 a하여 검색 범위를 해당 요소 유형으로 만 제한 해야 합니다. 페이지에 많은 요소가있을 때 큰 루프 또는 높은 빈도로 데이터 속성 검색을 수행하면 성능 문제가 발생할 수 있습니다.

$('a[data-customerID="22"]');

27

기본 JS 예제

요소의 NodeList 가져 오기

var elem = document.querySelectorAll('[data-id="container"]')

html : <div data-id="container"></div>

첫 번째 요소 얻기

var firstElem = document.querySelector('[id="container"]')

html : <div id="container"></div>

노드리스트를 리턴하는 노드 콜렉션을 대상으로합니다.

document.getElementById('footer').querySelectorAll('[data-id]')

html :

<div class="footer">
    <div data-id="12"></div>
    <div data-id="22"></div>
</div>

여러 (OR) 데이터 값을 기반으로 요소 가져 오기

document.querySelectorAll('[data-section="12"],[data-selection="20"]')

html :

<div data-selection="20"></div>
<div data-section="12"></div>

결합 된 (AND) 데이터 값을 기반으로 요소 가져 오기

document.querySelectorAll('[data-prop1="12"][data-prop2="20"]')

html :

<div data-prop1="12" data-prop2="20"></div>

값이 시작하는 항목 가져 오기

document.querySelectorAll('[href^="https://"]')

"첫 번째 요소 얻기"의 선택기는 정확하지만 다른 예제와 일치하지 않습니다. "data-"가 누락 된 것 같습니다.
GuyPaddock

15

Jquery filter () 메소드를 통해 :

http://jsfiddle.net/9n4e1agn/1/

HTML :

<button   data-id='1'>One</button>
<button   data-id='2'>Two</button>

자바 스크립트 :

$(function() {    
    $('button').filter(function(){
        return $(this).data("id")   == 2}).css({background:'red'});  
     });

당신은 바이올린을 시도 했습니까? 필터 방법은 동일한 것을 달성하기위한 또 다른 접근법입니다. Jquery 객체 세트가 이미 있고 데이터 속성 또는 기타 항목을 기준으로 필터링해야 할 때 유용 할 수 있습니다.
Razan Paul

사과합니다, @Blizzard. 나는 정답에 대해 언급했습니다. 지금 바로 붙여 넣습니다. #AlwaysALongDayAtWork
Peter Bishop

15

Safari 8.0$('[data-XXX=111]') 에서는 다음과 같은 구성이 작동하지 않습니다 .

data attribute를 이런 식으로 $('div').data('XXX', 111)설정하면 다음과 같이 DOM에서 data attribute를 직접 설정 한 경우에만 작동합니다 $('div').attr('data-XXX', 111).

jQuery 팀은 메모리 변경 및 각 변경 데이터 속성에 대한 DOM 재구성의 과도한 작업을 방지하기 위해 가비지 수집기를 최적화했기 때문이라고 생각합니다.


이것은 데이터 나 prop 메소드를 사용한 경우 $ ( '... [data-x = "y"]')에 의한 선택이 작동하지 않는 대신 많은 도움이되었습니다. 대신 attr을 사용했습니다 (속성 변경을 DOM). Thx
Jarda

13

이 크롬에서 작동하려면 값이 있어야 하지 따옴표의 또 다른 쌍을 가지고있다.

예를 들어 다음과 같이 작동합니다.

$('a[data-customerID=22]');

4
잘못된 것 같습니다. 적어도 지금은 정확하지 않습니다. 방금 $ ( '[data-action = "setStatus"]'). removeClass ( 'disabled');를 사용했습니다. Chrome에서 완벽하게 작동합니다.
Peter Bishop

내가 선택 내 ""의 아무 소용이없는 것 같아요, 그것은로 사용할 수 있습니다$('[data-action=setStatus]').removeClass('disabled')
Animesh 싱

6

프로그래밍 방식으로 데이터 항목이 첨부되어 있는지 (dom 속성을 통하지 않음) 요소를 기준으로 요소를 필터링하는 것이 바람직한 경우가 있습니다 .

$el.filter(function(i, x) { return $(x).data('foo-bar'); }).doSomething();

위의 방법은 작동하지만 읽을 수는 없습니다. 더 나은 방법은 이러한 종류의 테스트를 위해 의사 선택기를 사용하는 것입니다.

$.expr[":"].hasData = $.expr.createPseudo(function (arg) {
    return function (domEl) {
        var $el = $(domEl);
        return $el.is("[" + ((arg.startsWith("data-") ? "" : "data-") + arg) + "]") || typeof ($el.data(arg)) !== "undefined";
    };
});

이제 우리는 원래 문장을보다 유창하고 읽기 쉬운 것으로 리팩토링 할 수 있습니다.

$el.filter(":hasData('foo-bar')").doSomething();

1
첫 번째 해결책은 return 문을 놓치면 다음과 같아야합니다. $ el.filter (function (i, x) {return $ (x) .data ( 'foo-bar');}). doSomething ();
Salma Gomaa

3

'살아있는 표준'의 일부 기능으로 모든 답변을 완성하기 만하면됩니다. (지금은 html5 시대) 타사 라이브러리없이 할 수 있습니다.

  • querySelector가 포함 된 순수 / 일반 JS (CSS 선택기 사용) :
    • DOM에서 첫 번째를 선택하십시오. document.querySelector('[data-answer="42"],[type="submit"]')
    • DOM에서 모두 선택하십시오. document.querySelectorAll('[data-answer="42"],[type="submit"]')
  • 순수 / 일반 CSS
    • 일부 특정 태그 : [data-answer="42"],[type="submit"]
    • 특정 속성을 가진 모든 태그 : [data-answer]또는input[type]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.