Я пытаюсь придумать многоразовую функцию JS или jQuery, которая позволила бы мне проверить, является ли один объект потомком DOM другого.
Я видел модель тестирования для
$b.parents('nodename').length>0
Это прекрасно, когда вам нужно только проверить, является ли элемент дочерним по отношению к какому-либо узлу с таким именем.
Но как насчет конкретного узла? Вы не можете проверить
$b.parents($a).length>0
Поскольку родители jQuery принимают выражение имени узла в качестве аргумента для фильтрации.
В качестве небольшой справки я пытаюсь проверить, является ли цель события щелчка документа дочерним по отношению к определенному объекту. Например, если event.target является дочерним по отношению к $ b, верните true, в противном случае верните false. Но позже эта функция может иметь и другие значения.
Спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуй это:
$('#foo').filter(function(){
return $(this).parent().is('#foo-parent');
});
Итак, здесь мы выбираем все элементы foo, а затем фильтруем только те элементы, непосредственным родителем которых является foo-parent.
Если вы хотите узнать, соответствует ли какой-либо из предков текущего объекта правилу, я думаю, это должно быть:
$('#foo').filter(function(){
return $(this).parents().is('#foo-parent');
});
В Предки jQuery, использующие объекты jQuery я предложил
if ($(obj1).parents().index($(obj2)) >= 0) {
// obj1 is a descendant of obj2
}
Вы можете передать развернутый элемент DOM в индекс, так что это можно упростить до if ($ (obj1) .parents (). Index (obj2)> = 0)
Теперь есть $ .contains, если вас беспокоит Node.contains.
a.contains(b)
Это чистое решение JavaScript с использованием Node.contains. Функция включающая, a.contains(a) принимает значение true.
В IE9 есть крайний случай: если b является текстовым узлом, contains всегда будет возвращать false.
Отлично! Меня устраивает. Я всегда предпочитаю чистый JS фреймворкам.
Идеальный. Этот фактически позволяет передавать объект вместо селектора, что является фантастическим. Еще раз спасибо!