답변:
jQuery 1.8 이상에서는을 사용할 수 있습니다 .addBack()
. 선택기가 필요하므로 결과를 필터링하지 않아도됩니다.
object.find('selector').addBack('selector')
jQuery 1.8 이전에는 .andSelf()
필터링이 필요한 (이제 더 이상 사용되지 않고 제거되었습니다) 붙어 있습니다 .
object.find('selector').andSelf().filter('selector')
'selector'
두 번 지정해야 캡슐화가 더 바람직합니다. YMMV
'selector'
두 번 지정할 필요가 없습니다 (@ronen에서 언급했듯이), 그냥 사용할 수 없었 object.parent().find('selector')
습니까 ??? — 나는 그것이 당신을 위해 그것을하는 lib의 아이디어를 좋아한다고 말합니다.
object.parent().find('selector')
에는 형제 자매 object
와 그 자손이 포함됩니다.
내가 직접 생각할 수없는, 내가 생각할 수있는 가장 가까운 것은 다음과 같이 사용 .andSelf()
하고 호출하는 것입니다 .filter()
.
$(selector).find(oSelector).andSelf().filter(oSelector)
//or...
$(selector).find('*').andSelf().filter(oSelector);
불행히도 .andSelf()
선택기를 사용하지 않으므로 편리합니다.
closest(..)
현재 DOM 요소와 트리를 포함하는 반면 트리 등의 모든 순회 메소드 find(..)
는 현재 요소와 일치하지 않습니다. 마치 jQuery 팀이 두 작업이 모두 세로 검색을 위해 함께 사용될 때 중복되지 않도록 의도적으로 구현 한 것처럼 보입니다.
밝히다
$.fn.findSelf = function(selector) {
var result = this.find(selector);
this.each(function() {
if ($(this).is(selector)) {
result.add($(this));
}
});
return result;
};
그런 다음 사용
$.findSelf(selector);
대신에
$find(selector);
슬프게도 jQuery에는이 내장 기능이 없습니다. 수년간의 개발로 정말 이상합니다. .find () 작동 방식으로 인해 AJAX 핸들러가 일부 최상위 요소에 적용되지 않았습니다.
filter()
이 거기에 사용 되므로 더 의미가 있습니다.
$('selector').find('otherSelector').add($('selector').filter('otherSelector'))
$('selector')
속도 향상을 위해 변수에 저장할 수 있습니다 . 필요한 경우 사용자 정의 함수를 작성할 수도 있습니다.
$.fn.andFind = function(expr) {
return this.find(expr).add(this.filter(expr));
};
$('selector').andFind('otherSelector')
$('selector').find('otherSelector').add($('otherSelector'))
되었습니다 .andSelf()
. 현재 가지고있는 것과 같습니다 . 마지막으로, .andFind()
표현식을 기반으로 필터링하지 않습니다. .add($(this).filter(expr))
:)
$('selector')
jQuery 객체를 얻는 다른 방법으로 대체 되는지 여부 는 중요하지 않습니다 (선택기로 시작하지 않는 것이 의미가있는 경우) add()
가능한 한 모든 것을 처리 $()
할 수 있습니다.
$('selector')
이 $('selector').children('filter').closest('.class').last()
... 체인에있을 수 있으며 추가하는 객체가 무엇인지 전혀 모른다는 것이므로 일반적인 솔루션은 필터처럼 이전 객체를
this
플러그인이 호출 된 jQuery 객체입니다. 콜 체인의 결과 일 수도 있습니다.
체인이 제대로 작동하려면 아래 스 니펫을 사용하십시오.
$.fn.findBack = function(expr) {
var r = this.find(expr);
if (this.is(expr)) r = r.add(this);
return this.pushStack(r);
};
end 함수를 호출 한 후 #foo 요소를 반환합니다.
$('#foo')
.findBack('.red')
.css('color', 'red')
.end()
.removeAttr('id');
추가 플러그인을 정의하지 않으면이 문제가 발생합니다.
$('#foo')
.find('.red')
.addBack('.red')
.css('color', 'red')
.end()
.end()
.removeAttr('id');
this
하나 이상의 요소 this.is()
만 일치한다면 이미 하나 이상의 요소 가 만족된다면.
현재 요소 또는 내부의 요소 중 하나 를 정확히 찾고있는 경우 다음 을 사용할 수 있습니다.
result = elem.is(selector) ? elem : elem.find(selector);
여러 요소 를 찾는 경우 다음 을 사용할 수 있습니다.
result = elem.filter(selector).add(elem.find(selector));
andSelf
/ 사용 andBack
은 매우 드물지만 왜 그런지 확실하지 않습니다. 아마도 성능 문제로 인해 일부 사람들이 앞에서 언급했습니다.
(지금은 Tgr이 이미 두 번째 해결책을 제시했음을 알았습니다 )
나는 이것이 오래된 질문이라는 것을 알고 있지만 더 올바른 방법이 있습니다. 예를 들어와 같은 선택기를 일치시킬 때 순서가 중요한 :first
경우 find()
실제로 현재 요소 집합을 포함하는 것과 동일한 결과를 반환하는 작은 함수를 작성했습니다 .
$.fn.findAll = function(selector) {
var $result = $();
for(var i = 0; i < this.length; i++) {
$result = $result.add(this.eq(i).filter(selector));
$result = $result.add(this.eq(i).find(selector));
}
return $result.filter(selector);
};
어떤 방법으로도 효율적이지는 않지만 적절한 순서를 유지하기 위해 내가 찾은 최고입니다.
현재 노드를 엄격히 찾고 있다면 간단히 수행하십시오.
$(html).filter('selector')
나는 스스로 반복하지 않는 솔루션 을 찾으려고 노력했습니다 (즉, 동일한 선택기에 두 번 입력 하지 않음 ).
그리고이 작은 jQuery 확장은 다음을 수행합니다.
jQuery.fn.findWithSelf = function(...args) {
return this.pushStack(this.find(...args).add(this.filter(...args)));
};
find()
(자손 만)과 filter()
(현재 세트 만 )을 결합 하고 둘 다 먹는 인수를 모두 지원합니다. 이 pushStack()
가능 .end()
예상대로 작동합니다.
다음과 같이 사용하십시오.
$(element).findWithSelf('.target')
올바른 (하지만 슬픈) 진실은 다음과 같습니다.
$(selector).parent().find(oSelector).filter($(selector).find('*'))
$(selector)
모든 경우에 세트에서 자신을 제거 합니다.