Проверить, является ли элемент дочерним по отношению к родителю


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

60

.has()похоже, предназначен для этой цели. Поскольку он возвращает объект jQuery, вам также необходимо проверить .length:

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

@redanimalwar Право; вот что это делает. Вы находите родительский элемент, затем проверяете, targetнаходится ли он внутри него.
Blazemonger

22

Ванильный однострочник для IE8 +:

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 (контейнер, содержащийся)
Описание: проверьте, является ли элемент DOM потомком другого элемента DOM.

Вы можете передать родительский элемент и элемент, который вы хотите проверить, этой функции, и она вернется, если последний является потомком первого.


3
Обратите особое внимание на $.containsиспользование элементов DOM, а не экземпляров jQuery, иначе он всегда будет возвращать false.
aleclarson

Еще одна деталь, которую следует запомнить: $.containsникогда не возвращает истину, если два аргумента являются одним и тем же элементом. Если вы этого хотите, используйте domElement.contains(domElement).
aleclarson

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)...
Питер Аджтай

0

В дополнение к другим ответам вы можете использовать этот менее известный метод для захвата элементов определенного родителя, например, так,

$('child', 'parent');

В вашем случае это было бы

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

Обратите внимание на использование запятых между дочерним и родительским элементом и их отдельные кавычки. Если бы они были окружены одинаковыми кавычками

$('child, parent');

у вас будет объект, содержащий оба объекта, независимо от того, существуют ли они в их деревьях документов.


Это крутой хак, но он плохо работает с элементами без идентификаторов или классов
aln447 09
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.