使用jQuery/Sizzle选择器查找当前元素的父元素?

3

是否有一种方法可以仅使用jQuery/Sizzle的CSS选择器获取所选元素的父元素?

我需要在使用jQuery时能够获取元素的父元素,但是我无法使用jQuery('#myelement').parent(),因为我接收到的选择器是一个字符串,而“用户”需要能够向上移动树。

我在文档中找不到任何内容,所以我想知道它是否未记录或者是否有一个我可以使用的黑客方法?


为什么您无法使用.parent()方法? - David V.
他可能需要使用父级元素来进行live函数。 - naugtur
4个回答

3

正确的解决方案(即实际使用jQuery选择器而不是jQuery API的方案)是这个:

$(':has(> #myElement)');

这意味着你的“当前元素”实际上必须是“has”参数,而不是基本表达式。这不应该改变任何东西,只是相对于<来说可读性稍差一些。

参考jQuery API可能无法在某些情况下有效替代选择器,例如:

$(document).on('click', ':has(> .widget)', function () {
    // ...
});

在这种情况下,选择器可以过滤实时事件。

0

jQuery(jQuery('#myelement').parent()) 是不带附加功能的获取对象。

好了,笑话到此为止;)

我猜您需要为 live 函数选择父级,这就是为什么您不能用这种方式获取它的原因。

jQuery('#'+jQuery('#myelement').parent().attr('id')).live(something);

重要的是你如何去做才能让它工作。 如果父元素没有id,你可以使用更复杂的技巧。

    //newline for reading comfort. skip it. --v
jQuery('[title='+jQuery('#myelement').parent() 
.attr('title',Math.round(Math.random()*100000)+']').attr('title')).live(something);

你可以使用id、title或class,取决于页面上已有什么。

如果你真的需要通过css选择器找到它——据我所知,这在设计上是不可能的。


真的需要通过CSS选择器来完成,因为选择器是作为字符串传递的。很烦人的是CSS不能像XPath一样遍历回树。 :( - Phillip B Oldham

0

这样的选择器在CSS和jQuery/Sizzle中都不存在。

您可以更改源代码吗?

如果可以,可以添加自定义伪选择器:

jQuery.expr[":"].getParent = function (node, index, prop, nodes) {
    return jQuery(node).parent(); 
};

使用示例(请注意,父级已经存在,因此我使用了getParent):
jQuery('#myelement:getParent');

正如@maël-nison的答案所示,直接选择父级是完全可能的。 - LeoRochael
这个不起作用了(再也?)。伪选择器只是过滤器,它们不能返回另一个元素。您可以在此处看到h1:getParent返回相同的元素:https://i.stack.imgur.com/fMZYQ.png - fregante

0

由于CSS无法像XPath那样回溯树状结构,所以我进行了一些操作,并在字符串中检查字符<,然后根据该字符进行分割并手动调用.parent()方法。虽然不是最优解,但目前能够正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接