Jquery를 사용하여 부모 div의 ID 찾기


99

다음과 같은 HTML이 있습니다.

<div id="1">
    <p>
        Volume = <input type="text" />
        <button rel="3.93e-6" class="1" type="button">Check answer</button>
    </p>
    <div></div>
</div>

다음과 같은 일부 JS :

$("button").click(function () {
    var buttonNo = $(this).attr('class');
    var correct = Number($(this).attr('rel'));

    validate (Number($("#"+buttonNo+" input").val()),correct);
    $("#"+buttonNo+" div").html(feedback);
});

내가 정말로 원하는 것은 버튼에 class = "1"이 필요하지 않은 경우입니다 (숫자 클래스가 유효하지 않다는 것을 알고 있지만 이것은 WIP입니다!). 상위 div의 ID입니다. 실제 생활에는 이와 같은 여러 섹션이 있습니다.

  1. 버튼을 부모로 지정하는 div의 ID를 어떻게 찾습니까?

  2. 버튼 코드에 답변을 저장하는 더 의미있는 방법은 무엇입니까? 프로그래머가 아닌 사람이 내용을 깨지 않고 복사하여 붙여 넣을 수 있도록 가능한 한 완벽하게 만들고 싶습니다!

답변:


212

상위 div에서 이벤트 위임 을 사용할 수 있습니다 . 또는 가장 가까운 방법을 사용하여 버튼의 부모를 찾습니다.

둘 중 가장 쉬운 것이 아마도 가장 가까운 것입니다.

var id = $("button").closest("div").prop("id");

6
.closest ( "div.foo")와 같은 일을 할 수 있고 코드가 구조에 묶여 있지 않기 때문에 가장 가까운 것을 정말 좋아합니다.
Mark

2
Thx i는 재귀 함수를 수행하려고했습니다 .... 그런 다음 jquery에 이미 뭔가가 있다는 것을 알고 있습니다. 제 경우에는 $ ( "#"+ id) .closest ( "div.form-group")을 사용하여 form-group 클래스를 가진 부모 div.
cabaji99

47

1.

$(this).parent().attr("id");

2.

많은 방법이있을 것입니다! 하나는 답을 포함하는 요소를 숨기는 것일 수 있습니다.

<div>
    Volume = <input type="text" />
    <button type="button">Check answer</button>
    <span style="display: hidden">3.93e-6&lt;/span>
    <div></div>
</div>

그런 다음 위와 유사한 jQuery 코드를 사용하여이를 잡으십시오.

$("button").click(function () 
{
    var correct = Number($(this).parent().children("span").text());
    validate ($(this).siblings("input").val(),correct);
    $(this).siblings("div").html(feedback);
});

클라이언트 코드에 답을 넣으면 볼 수 있다는 점을 명심하십시오. 이렇게하는 가장 좋은 방법은 서버 측에서 유효성을 검사하는 것이지만 범위가 제한된 앱의 경우 문제가되지 않을 수 있습니다.


이 편집기에서 HTML 형식을 지정하는 방법을 모르겠지만 이것은 Pim의 ( 'div : eq (0)') 항목보다 부모를 잡는 다소 간단한 방법 인 것 같습니다. 여기서 미묘한 부분이 누락되지 않는 한 html 요소는 모두 parent ()로 얻는 하나의 직접적인 부모를 갖습니다.
Rob Grant

부모는 실제로 가장 가까운 부모를 반환하지만, 그가 필드 셋이나 질문 주위에 Div 내부에 무언가를 추가하기로 결정하면 어떻게됩니까?
Pim Jager

실제로 자신의 예에서는 <p>를 반환합니다.
Pim Jager

실제로 더 많은 div가 추가되면 'div : eq (0)'이 잘못 될 수 있습니다. 구조를 변경하고 그것을 구문 분석하는 코드를 변경합니다. 예, 예에 필요한 최소한의 html로 예제를 단순화했습니다. 부모에게 두 번 전화해야합니다.
Rob Grant

어떤 이유로 parent ()를 사용했을 때 attr (id)에 접근 할 수 없었습니다 $(parent[0]).attr('id'). 몇 개의 부모 선택자를 좋아 한 후에 이렇게 결과를 래핑해야했습니다 .
Piotr Kula 2014

11

이 시도:

$("button").click(function () {
    $(this).parents("div:first").html(...);
});


7

상위 div의 ID를 얻으려면 :

$(buttonSelector).parents('div:eq(0)').attr('id');

또한 코드를 상당히 리팩토링 할 수 있습니다.

$('button').click( function() {
 var correct = Number($(this).attr('rel'));
 validate(Number($(this).siblings('input').val()), correct);
 $(this).parents('div:eq(0)').html(feedback);
});

이제 버튼 클래스가 필요하지 않습니다.

설명
eq (0)은 jQuery 객체에서 하나의 요소 (이 경우 요소 0)를 선택한다는 것을 의미합니다. http://docs.jquery.com/Selectors/eq#index
$ (selector) .siblings (siblingsSelector)는 siblingsSelector http://docs.jquery.com/Traversing 과 일치하는 모든 형제 (동일한 부모를 가진 요소)를 선택합니다. / siblings # expr
$ (selector) .parents (parentsSelector)는 부모 선택자와 일치하는 선택자와 일치하는 요소의 모든 부모를 선택합니다. http://docs.jquery.com/Traversing/parents#expr
따라서 : $ (selector) .parents ( 'div : eq (0)'); 선택기와 일치하는 요소의 첫 번째 상위 div와 일치합니다.

jQuery 문서, 특히 선택기와 순회를 살펴보아야합니다.


간단하고 쉽습니다! 왜 div : eq (0)입니까? 그게 무슨 뜻이야?
Rich Bradshaw

나는 이것이 모두 적어도 하나의 div로 래핑되면 'div : eq (0)'이 잘못 될 것이라고 생각합니다. 상대가 아닌 DOM의 절대 순회를 수행하기 때문입니다. 첫 번째 요소가 "가장 가까운"상위 요소이면 괜찮지 만 그렇지 않은 경우 다음을 제안합니다. tinyurl.com/bbegow
Rob Grant

1
(따라서 parent () 대신 사용)
Rob Grant


5

다음을 수행하여 쉽게 수행 할 수 있습니다.

$(this).closest('table').attr('id');

이것을 테이블 내부의 모든 개체에 연결하면 해당 테이블의 ID를 반환합니다.


3

JQUery에는 DOM 트리 위로 이동할 수있는 .parents () 메서드가 있습니다.

좀 더 의미론적인 방법에 관심이 있다면 버튼에 REL 속성을 사용하는 것이 코드에서 "이것이 답입니다"를 의미 론적으로 정의하는 가장 좋은 방법이라고 생각하지 않습니다. 다음과 같은 내용을 추천합니다.

<p id="question1">
    <label for="input1">Volume =</label> 
    <input type="text" name="userInput1" id="userInput1" />
    <button type="button">Check answer</button>
    <input type="hidden" id="answer1" name="answer1" value="3.93e-6" />
</p>

$("button").click(function () {
    var correctAnswer = $(this).parent().siblings("input[type=hidden]").val();
    var userAnswer = $(this).parent().siblings("input[type=text]").val();
    validate(userAnswer, correctAnswer);
    $("#messages").html(feedback);
});

검증 및 피드백이 어떻게 작동하는지 확실하지 않지만 아이디어를 얻습니다.


0

find () 및 가장 가까운 ()은 다음보다 약간 느립니다.

$(this).parent().attr("id");

$(this).parent().parent().attr("id");?
Alejandro Iván
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.