요소가 부모의 자식인지 확인


115

다음 코드가 있습니다.

<html>
<head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
</head>

<div id="hello">Hello <div>Child-Of-Hello</div></div>
<br />
<div id="goodbye">Goodbye <div>Child-Of-Goodbye</div></div>

<script type="text/javascript">
<!--
function fun(evt) {
    var target = $(evt.target);    
    if ($('div#hello').parents(target).length) {
        alert('Your clicked element is having div#hello as parent');
    }
}
$(document).bind('click', fun);
-->
</script>

</html>

Child-Of-Hello클릭 할 때만 기대하고 $('div#hello').parents(target).length> 0을 반환합니다.

그러나 아무 곳이나 클릭 할 때마다 발생합니다.

내 코드에 문제가 있습니까?

답변:


160

다른 조상이 아닌 직계 상위에만 관심이있는 경우 parent()에서와 같이을 사용 하고 선택기를 제공 할 수 있습니다 target.parent('div#hello').

예 : http://jsfiddle.net/6BX9n/

function fun(evt) {
    var target = $(evt.target);    
    if (target.parent('div#hello').length) {
        alert('Your clicked element is having div#hello as parent');
    }
}

또는 일치하는 조상이 있는지 확인하려면을 사용하십시오 .parents().

예 : http://jsfiddle.net/6BX9n/1/

function fun(evt) {
    var target = $(evt.target);    
    if (target.parents('div#hello').length) {
        alert('Your clicked element is having div#hello as parent');
    }
}

19
jquery없이 어떻게할까요?
SuperUberDuper 2015-08-28

60

.has()이 목적을 위해 설계된 것 같습니다. jQuery 객체를 반환하므로 다음 사항도 테스트해야합니다 .length.

if ($('div#hello').has(target).length) {
   alert('Target is a child of #hello');
}

@redanimalwar 맞아; 그것이하는 일입니다. 부모 요소를 찾은 다음 그 target안에 있는지 확인 합니다.
Blazemonger

22

IE8 + 용 Vanilla 1-liner :

parent !== child && parent.contains(child);

작동 원리는 다음과 같습니다.

function contains(parent, child) {
  return parent !== child && parent.contains(child);
}

var parentEl = document.querySelector('#parent'),
    childEl = document.querySelector('#child')
    
if (contains(parentEl, childEl)) {
  document.querySelector('#result').innerText = 'I confirm, that child is within parent el';
}

if (!contains(childEl, parentEl)) {
  document.querySelector('#result').innerText += ' and parent is not within child';
}
<div id="parent">
  <div>
    <table>
      <tr>
        <td><span id="child"></span></td>
      </tr>
    </table>
  </div>
</div>
<div id="result"></div>


고마워, 정말 놀랍다! 재귀는 멋지다. 함수의 인수가 함수가 작동하는 객체 (내부)가되는 방법이 궁금합니다. 그것에 대한 자세한 정보에 대한 링크가 있습니까?
JohnK

20

특정 선택자가없는 요소가 있고 여전히 다른 요소의 하위 요소인지 확인하려면 jQuery.contains ()를 사용할 수 있습니다.

jQuery.contains (container, included)
설명 : DOM 요소가 다른 DOM 요소의 자손인지 확인합니다.

부모 요소와 확인하려는 요소를 해당 함수에 전달할 수 있으며 후자가 첫 번째의 후손이면 반환됩니다.


3
jQuery 인스턴스가 아닌$.contains DOM 요소 를 사용 하는 데 특히주의하십시오. 그렇지 않으면 항상 false를 반환합니다.
aleclarson

기억해야 할 또 다른 세부 사항 : $.contains두 인수가 동일한 요소이면 절대로 true를 반환하지 않습니다. 원하는 경우 domElement.contains(domElement).
aleclarson jul.

9

대신 .closest ()를 사용했습니다.

$(document).on("click", function (event) {
    if($(event.target).closest(".CustomControllerMainDiv").length == 1)
    alert('element is a child of the custom controller')
});

3

두 용어를 바꾸면 코드가 작동하도록 할 수 있습니다.

if ($(target).parents('div#hello').length) {

당신은 아이와 부모가 잘못된 길을 가졌습니다.


2
var target = $(evt.target);그래서 당신의 코드를 읽어야 if (target.parents('div#hello').length) {하지...$(target)...
피터 Ajtai에게

0

다른 답변 외에도이 덜 알려진 방법을 사용하여 특정 부모의 요소를 잡을 수 있습니다.

$('child', 'parent');

귀하의 경우에는

if ($(event.target, 'div#hello')[0]) console.log(`${event.target.tagName} is an offspring of div#hello`);

자식과 부모 사이에 쉼표를 사용하고 별도의 따옴표를 사용합니다. 같은 따옴표로 묶인 경우

$('child, parent');

문서 트리에 존재하는지 여부에 관계없이 두 개체를 모두 포함하는 개체가 있습니다.


이 멋진 해킹이지만, IDS없는 요소, 또는 클래스와 잘 작동하지 않습니다
aln447
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.