jQuery는 데이터 속성 값을 기반으로 요소를 찾는 방법?


994

다음과 같은 시나리오가 있습니다.

var el = 'li';

<li>페이지에 각각 5 개의 data-slide=number속성 이있는 숫자가 있습니다 (각각 1,2,3,4,5) .

이제 var current = $('ul').data(current);각 슬라이드 변경에 매핑되고 업데이트 되는 현재 활성 슬라이드 번호를 찾아야합니다 .

지금까지 시도가 실패하여 현재 슬라이드와 일치하는 선택기를 구성하려고 시도했습니다.

$('ul').find(el+[data-slide=+current+]);

일치하지 않거나 아무것도 반환하지 않습니다…

내가 li파트를 하드 코딩 할 수없는 이유 는 이것이 필요한 경우 다른 요소로 변경할 수있는 사용자 액세스 가능한 변수이기 때문에 항상 li.

내가 잃어버린 것에 대한 아이디어가 있습니까?


6
당신 .find(el+[data-slide=+current+]);이 작성한 코드가 확실 합니까? 당신이 몇 가지 견적을 놓친 것"[data-slide]"
xandy

그건 내가 선택하는 데 도움이 무엇의 모든 데이터 속성 (에 관계없이 값) : $('*[data-slide]')당신은 예와 함께 사용할 수$('*[data-slide]').each( function() { ... });
카이 NOACK

답변:


1481

당신의 가치 주입해야 current특성이 같음 선택기를 :

$("ul").find(`[data-slide='${current}']`)

오래된 JavaScript 환경 ( ES5 이하 ) :

$("ul").find("[data-slide='" + current + "']"); 

8
@Jannis, 당신은 할 수 있습니다 $("ul").find(el + "[data-slide='" + current +"']");.
프레데릭 하 미디

7
@ c00lryguy, jQuery UI 는 하나를 정의하며 주위에 독립형 구현이 있습니다. jQuery Core에 추가하려는 시도는 거부 된 것으로 보인다 . 두번 .
Frédéric Hamidi

6
비슷한 게시물에 대한 이 답변 은 필터 기능의 예를 보여줍니다
drzaus

77
jQuery .data (...) 함수를 통해 데이터를 추가하면 이것이 작동하지 않을까 걱정합니다. 왜냐하면 이것이 항상 속성을 렌더링하지는 않으며 soemtimes는 브라우저 특정 저장 메커니즘을 사용하기 때문입니다. jQuery core에 데이터 선택기가 있었으면하는 또 다른 이유입니다.
AaronLS

77
$ ( '# element'). data ( 'some-att-name', value);로 데이터를 설정 한 요소에는 작동하지 않습니다. 그러나 하드 코딩 된 속성을 가진 사람들에게만 해당됩니다. 이 문제가 발생하여 속성을 직접 작성하여 작업 세트 데이터를 작동 시키려면 $ ( '# element'). attr ( 'data-some-att-name', value);
Pawel

463

모든 것을 입력하지 않으려는 경우 data 속성으로 쿼리하는 더 짧은 방법이 있습니다.

$("ul[data-slide='" + current +"']");

참고 : http://james.padolsey.com/javascript/a-better-data-selector-for-jquery/


31
관심있는 사람들에게는 구조가 주어지면 <ul><li data-slide="item"></li></ul>이 답변의 선택기는 정의되지 않은 상태로 반환되므로 사용자 시나리오에서 작동하지 않습니다. 이 답변은 구조에 적용 <ul data-slide="item"><li></li></ul> 됩니다. 간결성으로 인해 인기가있는 이유를 이해하지만 기술적으로 잘못된 답변입니다. jsfiddle.net/py5p2abL/1
akousmata

4
그것을 배열로 취급하는 것을 잊지 마십시오. [0]찾은 첫 번째 요소에 액세스하는 데 사용 합니다.
Aminah Nuraini 2016 년

기묘한 부작용 ...이 방법은 .find("[data-attrib='value']")작동하지 않을 때 요소와 데이터 속성을 일치시켜 작업했습니다. 값이 데이터 속성인지 jQuery에 의해 추가
되었는지 아닌지 모르겠습니다

1
두 답변이 서로 다른 두 가지 일을하기 때문에 이상하지 않습니다. $.find특히 해당 요소 의 하위 항목찾습니다. 그러나 선택기 문자열에서 필터 구문을 사용하면 결과 만 필터링됩니다.
Phil

227

[data-x = ...]로 검색 할 때 jQuery.data (..) setter와 작동하지 않습니다 .

$('<b data-x="1">'  ).is('[data-x=1]') // this works
> true

$('<b>').data('x', 1).is('[data-x=1]') // this doesn't
> false

$('<b>').attr('data-x', 1).is('[data-x=1]') // this is the workaround
> true

대신 이것을 사용할 수 있습니다 :

$.fn.filterByData = function(prop, val) {
    return this.filter(
        function() { return $(this).data(prop)==val; }
    );
}

$('<b>').data('x', 1).filterByData('x', 1).length
> 1

1
$.fn.filterByData훌륭; 그러나 이것은 복사 붙여 넣기에 대한 경고 입니다 .로 태그 만 $('<b>').filterByData('x', 1)찾으면 <b>됩니다 data-x="1". .data(x, 1)부분 을 복사하여 붙여 넣으면 data-x필터링하기 전에 "1" 로 설정됩니다 .
WEBjuju

39

나는에 개선 싸이코 BRM의 filterByData 확장 jQuery를합니다.

이전 확장이 키-값 쌍을 검색 한 경우이 확장을 사용하면 값에 관계없이 데이터 속성이 있는지 검색 할 수 있습니다.

(function ($) {

    $.fn.filterByData = function (prop, val) {
        var $self = this;
        if (typeof val === 'undefined') {
            return $self.filter(
                function () { return typeof $(this).data(prop) !== 'undefined'; }
            );
        }
        return $self.filter(
            function () { return $(this).data(prop) == val; }
        );
    };

})(window.jQuery);

용법:

$('<b>').data('x', 1).filterByData('x', 1).length    // output: 1
$('<b>').data('x', 1).filterByData('x').length       // output: 1

또는 바이올린 : http://jsfiddle.net/PTqmE/46/


34

JQuery없이 ES6

document.querySelectorAll(`[data-slide='${current}']`);

JQuery에 대한 질문은 알고 있지만 독자는 순수한 JS 메소드를 원할 수 있습니다.


33

jQuery와 data- * 속성을 사용하여 요소를 가져 오는 동안 동일한 문제에 직면했습니다.

참고로 가장 짧은 코드는 다음과 같습니다.

이것은 내 HTML 코드입니다.

<section data-js="carousel"></section>
<section></section>
<section></section>
<section data-js="carousel"></section>

이것은 내 jQuery 선택기입니다.

$('section[data-js="carousel"]');
// this will return array of the section elements which has data-js="carousel" attribute.

19
$("ul").find("li[data-slide='" + current + "']");

이것이 더 잘 작동하기를 바랍니다.

감사


15

이 선택기 $("ul [data-slide='" + current +"']");는 다음 구조에서 작동합니다.

<ul><li data-slide="item"></li></ul>  

이것이 $("ul[data-slide='" + current +"']");작동 하는 동안 :

<ul data-slide="item"><li></li></ul>


12

사전에 요소 유형을 몰라도이 작업을 수행하는 방법에 대한 원래 질문으로 돌아가서 다음을 수행하십시오.

$(ContainerNode).find(el.nodeName + "[data-slide='" + current + "']");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.