在JavaScript或Jquery中测试祖先/后代关系的对象

我试图想出一个可重用的JS或jQuery函数,它允许我测试一个对象是否是另一个对象的DOM后代。

我见过一个测试模型

$b.parents('nodename').length>0 

当你只需要检查一个元素是否是该名称的任何节点的子节点时,这是太棒了。

但是特定节点怎么样? 你无法测试

 $b.parents($a).length>0 

因为jQuery父对象将nodename表达式作为参数进行过滤。

作为一个小背景,我试图测试文档点击事件的目标是否是特定对象的子项。 例如,如果event.target是$ b的子节点,则返回true,否则返回false。 但是这个function可能会在以后产生其他影响。

谢谢!

在我建议的jQuery祖先使用jQuery对象

 if ($(obj1).parents().index($(obj2)) >= 0) { // obj1 is a descendant of obj2 } 
 a.contains(b) 

这是一个使用Node.contains的纯JavaScript解决方案。 该函数是包含的, a.contains(a)计算结果为true。

IE9中有一个边缘情况:如果b是文本节点,则contains将始终返回false。

试试这个:

 $('#foo').filter(function(){ return $(this).parent().is('#foo-parent'); }); 

所以我们在这里选择所有foo元素,然后只过滤那些将foo-parent作为其直接父元素的元素。

如果您要查找当前对象的任何祖先是否符合规则,那么我想它应该是:

 $('#foo').filter(function(){ return $(this).parents().is('#foo-parent'); });