.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.