jquery는 클래스와 가장 가까운 이전 형제를 찾습니다.


146

여기 내가 다루는 대략적인 HTML이 있습니다.

<li class="par_cat"></li>
<li class="sub_cat"></li>
<li class="sub_cat"></li>
<li class="par_cat"></li> // this is the single element I need to select
<li class="sub_cat"></li>
<li class="sub_cat"></li>
<li class="sub_cat current_sub"></li> // this is where I need to start searching
<li class="par_cat"></li>
<li class="sub_cat"></li>
<li class="par_cat"></li>

에서를 통과 .current_sub하고 가장 가까운 이전 항목을 찾아서 .par_cat수행해야합니다.

.find("li.par_cat")의 전체로드를 반환합니다 .par_cat(페이지에 약 30이 있습니다). 나는 하나를 목표로 삼아야한다.

정말 팁을 주셔서 감사합니다 :)


7
와우, 고양이는 정말 인터넷을 통해 온다! 이제 파 고양이와 서브 고양이도 있습니다.
JD Smith

답변:


257

시험:

$('li.current_sub').prevAll("li.par_cat:first");

마크 업으로 테스트했습니다.

$('li.current_sub').prevAll("li.par_cat:first").text("woohoo");

가장 가까운 이전 li.par_cat을 "woohoo"로 채 웁니다 .


카림 감사합니다. 이것도 잘 작동했지만 .prev ()는 이전에 일치하는 모든 요소를 ​​가져 와서 필요한 요소를 필터링하므로 .prev ()는 적은 리소스를 소비한다고 가정합니다. Ed의 대답을 받아들입니다.
daulex 2019

3
실제로 약간의 문자 메시지 후에 .prev ()가 몇 가지 인스턴스에서 실패했습니다. .prevAll with : first는 매번 작동했습니다. 감사합니다.
daulex

1
.prev ()는 바로 앞에있는 요소 만 확인합니다. jsFiddle 예제와 함께 아래 답변에 주석을 추가했습니다. 둘러 본 후에는 모든 요소를 ​​순환해야하지만 모든 것을 잡고 필터를 찾기 위해 두 가지 기능이 필요하지 않으므로 가장 좋은 대답입니다.
David

8
이것은 :first선택된 객체와 가장 가까운 곳에서 시작하는 반환 된 요소 목록에서 작업하고 있음을 의미합니까 (페이지와 관련하여 위에서 아래로)?
NReilingh

2
매우 유용한 답변에 대해 대단히 감사합니다. 정말 혼란 스러우므로 @NReilingh 질문에 대답 할 수 있습니까? 아닌가 :first선택의 첫 번째 요소하는 CSS 선택기 DOM은 (예 : div.red:first필드에 첫 번째 빨간색 DIV 선택합니다 DOM을 jQuery를 다르게 선택을 구문 분석했다)는?
회계사 م

17

시험

$('li.current_sub').prev('.par_cat').[do stuff];


19
무엇을 기다립니다? 바로 앞의 요소 만 검사하지 않습니까? 따라서 코드가 null을 반환합니까? -여기 jsFiddle에서 테스트되었습니다 : jsfiddle.net/Y2TEH
David

4
@DavidHobs 2 년 전에이 글을 썼습니다. 요즘에는 prevAll ()을 사용할 것입니다.
Ed James

8
이 경우 @EdWoodcock은 답변 업데이트를 고려합니다.
휴고 징크

14

prevUntil ()을 사용하면 모든 것을 얻지 않고도 먼 형제를 얻을 수 있습니다. prevAll ()을 사용하여 CPU를 많이 사용하는 특히 긴 세트가 있습니다.

var category = $('li.current_sub').prev('li.par_cat');
if (category.length == 0){
  category = $('li.current_sub').prevUntil('li.par_cat').last().prev();
}
category.show();

일치하는 첫 번째 형제를 가져옵니다. 그렇지 않으면 일치하는 형제보다 먼저 형제를 가져옵니다. 따라서 prev ()를 사용하여 원하는 요소를 하나 더 백업합니다.


5

나는 모든 대답에 무언가가 부족하다고 생각합니다. 나는 이런 것을 사용하는 것을 선호한다

$('li.current_sub').prevUntil("li.par_cat").prev();

선택기 내부에 : first를 추가하지 않고 저장하고 읽고 이해하기가 더 쉽습니다. prevUntil () 메소드는 prevAll ()을 사용하는 것보다 성능이 우수합니다.


0

이 코드를 따를 수 있습니다 :

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
    $(document).ready(function () {
        $(".add").on("click", function () {
            var v = $(this).closest(".division").find("input[name='roll']").val();
            alert(v);
        });
    });
</script>
<?php

for ($i = 1; $i <= 5; $i++) {
    echo'<div class = "division">'
        . '<form method="POST" action="">'
        . '<p><input type="number" name="roll" placeholder="Enter Roll"></p>'
        . '<p><input type="button" class="add" name = "submit" value = "Click"></p>'
        . '</form></div>';
}
?>

이것으로부터 아이디어를 얻을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.