Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用jQuery和CSS选择器选择嵌套元素的公共父级/父级_Javascript_Jquery_Html_Jquery Selectors_Dom Traversal - Fatal编程技术网

Javascript 使用jQuery和CSS选择器选择嵌套元素的公共父级/父级

Javascript 使用jQuery和CSS选择器选择嵌套元素的公共父级/父级,javascript,jquery,html,jquery-selectors,dom-traversal,Javascript,Jquery,Html,Jquery Selectors,Dom Traversal,我希望选择多个嵌套元素的公共父元素,我只知道这些元素的内部文本 例如,在以下代码中: <unknown> <unknown class="unknown"> .... <unknown> <unknown>Sometext</unknown> </unknown> <unknown>

我希望选择多个嵌套元素的公共父元素,我只知道这些元素的内部文本

例如,在以下代码中:

<unknown>       
    <unknown class="unknown">
        ....
        <unknown>
            <unknown>Sometext</unknown>
        </unknown>
        <unknown>
            <unknown>Sometext</unknown>
        </unknown>
        <unknown>
            <unknown>Sometext</unknown>
        </unknown>
        ....
    </unknown>
</unknown>

....
一些文字
一些文字
一些文字
....
在这个场景中,我想获取类未知的最近元素(公共父元素)。我不知道实际的标签或类名。我只知道nest元素包含“Sometext”。我知道这可以通过使用jQuery/Javascript的循环来完成,但是有没有一个CSS选择器可以与jQuery一起使用来找到这个呢?我尝试使用最接近的()、parents()、parentsUntil()的组合,但似乎无法访问此元素


谢谢大家!

这应该可以完成这项工作。基本上,您可以找到所有匹配元素的所有相关父元素,获取每个集合的交集,然后获取第一个集合以获取嵌套最常见的父元素

您甚至可以将其包装为jquery插件

if(console&&console.clear)console.clear();
//为阵列创建一个方便的相交方法
//看http://stackoverflow.com/a/16227294/1901857
Array.prototype.intersect=函数(arr){
var a=此,b=arr;
变量t;
如果(b.length>a.length)t=b,b=a,a=t;//indexOf to loop over shorter
返回a.filter(函数(e){
返回b.indexOf(e)>-1;
});
};
;(函数($){
$.fn.commonParents=函数(选择器){
//找到每个元素的所有相关父元素并设置交点
//pushStack意味着您可以在链接中正确使用end()等
返回此.pushStack(someText.get().reduce(函数(prevParents,el)){
//此元素的公共父级-请注意,最低级别的父级是第一级
var parents=$(el).parents(选择器| |'*').get();
//与上一个值相交(如果是第一个值,则与自身相交)
返回(prevParents | | parents)。相交(parents);
},null),“commonParents”,参数);
};
})(jQuery);
//要搜索的文本
var search=“Sometext”;
//父选择器,用于按例如“未知”筛选父项-对所有父项使用null
var parentSelector=null;
//查找包含搜索的所有内容
var sometext=$(“:contains(“+search+”)”).filter(函数(){return$(this.text()==search;});
//获取第一个公共父级-最低级别的父级-如果没有,则为null
var commonParent=sometext.commonParents(parentSelector).get(0);
console.log(commonParent)

一些文字
一些文字
一些文字

首先,您需要确保只匹配叶节点(没有子节点的节点),因此使用:

因此,要查找所有精确匹配(仅叶节点),请使用:

或者仅对所有元素使用组合过滤器(添加0个子项检查):

注意:我还没有测试这两个选项中哪一个最快

然后,您需要找到(第一个匹配项的)第一个祖先,该祖先包含所有匹配项:

var commonparent = matches.first().parents().filter(function () {
    return $(this).find(matches).length == matches.length;
}).first();
JSFiddle:

根据David Thomas的建议,这里它是一对jQuery扩展(
commonParents()
commonParents()
),将来可能会用于人们:

要查找jQuery集合的所有公共父级,请使用“commonParents()”:

JSFiddle:(普通父母):

要查找jQuery集合最近的公共父级,请使用
commonParent()

JSFiddle:(commonParent):

注意事项:

  • jQuery优化了
    commonParent
    中的
    first()
    commonParents
    过滤器()的组合使用,它只调用
    commonParents
    中的代码,直到进行第一次匹配,因此
    commonParent
    不需要提高效率
那么你的意思是,如果第一个“Sometext”有一个直接的父项,它会忽略它,而仍然选择顶级父项,因为这是所有“Sometext”的共同点?是的,这是正确的。谢谢Rhumboll。如果我真的知道家长的班级,这就行了。然而,我命名为unknown,因为它是变化的。这就是我想要得到的,但我认为它可以改进/重构:
var jq=$('*').find(':last:contains(“Sometext”);var prnt=$(jq[0]);each(函数(){prnt=prnt.parents().add(prnt).has(this.last();});返回prnt哦,对了,那么类位实际上是不相关的?如果您只需要公共父级,只需将parentClass设置为
*
。很好地完成了,这里有一个以插件形式重写的方法版本:。@David Thomas:很好地包装为扩展。我认为这不是一个经常需要的扩展,但我会在答案中添加我自己的扩展。是的,我想这可能是一个比较少见的扩展,但我看到了你的答案,有几分钟……现在,如果你能在答案中加入可能的搜索词组,那么这方面的长尾应该令人印象深刻。:)真棒的回答。感谢您详细解释此过程。
var matches = $(':not(:has(*))').filter(function () {
    return $(this).text() == "Sometext";
});
var matches = $('*').filter(function () {
     return !$(this).children().length && $(this).text() == "Sometext";
});
var commonparent = matches.first().parents().filter(function () {
    return $(this).find(matches).length == matches.length;
}).first();
$.fn.commonParents = function (){
    var cachedThis = this;
    return cachedThis.first().parents().filter(function () {
        return $(this).find(cachedThis).length === cachedThis.length;
    });
};
$.fn.commonParent = function (){
    return $(this).commonParents().first();
};