.data () 키 / 값을 기반으로하는 필터 요소


116

.navlink클릭하면 .data()라는 키 'selected'를 다음 값으로 설정하는 데 사용하는 class와 함께 4 개의 div 요소가 있다고 가정합니다 true.

$('.navlink')click(function() { $(this).data('selected', true); })

새 항목 .navlink을 클릭 할 때마다 navlink나중에 조작 할 수 있도록 이전에 선택한 항목을 저장하고 싶습니다 . 를 사용하여 저장된 항목을 기반으로 요소를 선택하는 빠르고 쉬운 방법이 .data()있습니까?

청구서에 맞는 jQuery : 필터 가없는 것 같고 동일한 클릭 이벤트 내에서 다음을 시도했지만 어떤 이유로 작동하지 않습니다.

var $previous = $('.navlink').filter( 
    function() { $(this).data("selected") == true }
);

이 작업을 수행하는 다른 방법이 있다는 것을 알고 있지만 지금은을 통해 수행 할 수 있는지 대부분 궁금합니다 .data().

답변:


192

필터는 작동하지만 필터에 전달 된 함수의 일치하는 객체에 대해 true를 반환해야 필터를 잡을 수 있습니다.

var $previous = $('.navlink').filter(function() { 
  return $(this).data("selected") == true 
});

6
이가 더 이상이 작업을 수행 할 수있는 유일한 방법이므로주의 해주세요, StefanoP 대안을 제공했다
나단 쿠프

3
@NathanKoop, 정답이 아닙니다. 그의 대답에 대한 내 의견을 참조하십시오.
Bryan Downing

데이터 속성을 사용하여 문서의 어느 위치에서든 찾을 수없는 요소 (id less divs 등 ... 어떤 이유로 든 액세스 할 수 있어야 함)를 찾는 사람들을 위해 :$("*").filter(function() { return $(this).data("DATA IDENTIFIER HERE") == DATA VALUE HERE; });
Tschallacka

이것은 "지저분 함"이 아닙니다. 이것은 검색 용어를 나머지 선택자와 연결해도 잘못된 선택자를 만들지 않도록 해당 값을 "이스케이프"하지 않고도 임의의 용어를 필터링하는 유일한 안전한 방법입니다.
Alnitak

145

기록을 위해 jquery로 데이터를 필터링 할 수 있습니다 (이 질문은 꽤 오래되었고 그 이후로 jQuery가 발전 했으므로이 솔루션도 작성하는 것이 옳습니다).

$('.navlink[data-selected="true"]');

또는 더 나은 (성능을 위해) :

$('.navlink').filter('[data-selected="true"]');

또는 data-selected세트로 모든 요소를 ​​얻으려면 다음을 수행하십시오.

$('[data-selected]')

참고 이 방법은 HTML-속성을 통해 설정 데이터를 작동합니다. .data()호출로 데이터를 설정하거나 변경 하면이 메서드는 더 이상 작동하지 않습니다.


9
이 응답 겁에 대한 낮은 당첨는 경우 - 그것은 거의 동일 질문에 대한 100+ 투표로 허용 대답 stackoverflow.com/questions/4146502은
Simon_Weaver

48
-1 속성 .data()대신 메소드로 데이터를 설정하면 작동하지 않습니다 data-. 이 바이올린을 참조하십시오 : jsfiddle.net/bryandowning/tySWC- 또한 .find()메서드는 이전 선택기의 자식을 검색합니다. 주어진 예에서은 의 하위가 아니라 data-selected의 속성 .navlink입니다 .navlink. 또한, $('div p')그리고 $('div').find('p')본질적으로 동등하다. 사용은 .find()(나는 이것에 대해 긍정적 인 아니에요 있지만) 그 때문에 여분의 함수 호출에 속도가 느려질 수 있습니다처럼 보인다. 이 중 하나라도 틀렸다면 저를 수정하십시오 (이 방법이 효과가 있었으면 좋겠습니다).
Bryan Downing

3
몇 가지 : 1)를 사용하여 데이터를 설정하면 작동하지 않는다는 것이 맞습니다. .data()jQuery는 DOM을 통해 검색하기 때문에 다른 이유로이 질문에 답한 사람들을 위해 게시했습니다. 2) 정확하고, .find()아이들을 통해 검색하므로이 예에서는 잘못되었습니다. 3) 틀 렸습니다. jQuery가 오른쪽에서 왼쪽으로 검색하므로 동등하지 않습니다. jonraasch.com/blog/를
StefanoP

2
투표까지에 대한 $('[data-selected]')이 같은 저를 도와$('ul.categories a[data-categories_id]').click(......);
누가 사촌

또한 .attr을 사용하여 데이터 속성을 업데이트하면 .data를 사용하여 검색하면 값이 업데이트되지 않는 것 같습니다. 따라서 두 가지를 혼합 할 때주의하십시오
Fabio Lolli

13

플러그인을 매우 쉽게 만들 수 있습니다.

$.fn.filterData = function(key, value) {
    return this.filter(function() {
        return $(this).data(key) == value;
    });
};

사용법 (라디오 버튼 확인) :

$('input[name=location_id]').filterData('my-data','data-val').prop('checked',true);

당신의 평균 플러그인 방법은 , 그렇지 않으면이 ... 허용 대답과 동일
jave.web

@ jave.web 정말. 그러나 모든 사람이 그것을 플러그인으로 바꾸는 방법을 아는 것은 아닙니다. 설명이 업데이트되었습니다.
mpen

오해하지 마십시오. 귀하의 답변은 훌륭하지만 여기에있는 단어는 매우 중요합니다. 업데이트 해 주셔서 감사합니다. :)
jave.web

8

내가 눈치 챘은 두 가지 (그래도 적어 놓을 때 실수 일 수 있음).

  1. 첫 번째 예 ( $('.navlink').click) 에서 점을 놓쳤습니다.
  2. 필터가 작동하려면 값 ( return $(this).data("selected")==true) 을 반환해야합니다.

-1

그 가치보다 더 많은 일처럼 들립니다.

1) 현재 선택된 element \ jQuery 객체에 대한 참조를 저장하는 단일 자바 스크립트 변수 만 있으면 안됩니다.

2) 현재 선택된 요소에 클래스를 추가하지 않는 이유는 무엇입니까? 그런 다음 DOM에서 ".active"클래스 등을 쿼리 할 수 ​​있습니다.


그래,하지만 내가 말했듯이 그것을 달성하는 다른 방법이 있다는 것을 알고 있었다. 나는 그것이 data ()를 통해 필터링 될 수 있는지, 왜 filter ()가 나를 위해 작동하지 않는지에 대해 고민했습니다. 그래도 고마워.
user113716

죄송합니다. 나는 당신의 질문에서 그 부분을 놓쳤습니다.
Bryan Migliorisi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.