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

发布于 2024-08-23 17:28:03 字数 268 浏览 4 评论 0原文

有没有办法只使用 jQuery/sizzle 的 CSS 选择器来获取所选元素的父元素?

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

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

Is there a way I can get the selected element's parent using only jQuery's/sizzle's CSS selectors?

I need to be able to get an element's parent while using jQuery, but I'm unable use jQuery('#myelement').parent() since I'm receiving the selector as a string and the "user" needs to be able to move back up the tree.

I can't see anything in the docs, so I'm wondering whether it's undocumented or if there's a hack I can use?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

无远思近则忧 2024-08-30 17:28:03

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

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

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

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

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

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

The correct solution (ie. the one which actually use jQuery selectors rather than jQuery API) is this one :

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

That means that your "current element" actually has to be the 'has' parameter rather than the base expression. It shouldn't change anything, except that it is a bit less readable than <.

For reference, the jQuery API may not be a valid replacement to selectors in a few cases, such as :

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

In this case, the selector allows to filter the live events.

再可℃爱ぅ一点好了 2024-08-30 17:28:03

jQuery(jQuery('#myelement').parent()) 正在获取对象,无需附加函数。

好吧,笑话结束了;)

我猜您需要为实时功能选择父级,这就是为什么您不能以这种方式获得它。

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 或标题或类,具体取决于页面上已有的内容

如果您确实需要仅通过 css 选择器找到它- 据我所知,CSS 选择器的设计是不可能的

jQuery(jQuery('#myelement').parent()) is getting the object without the additional function.

Ok, end of jokes ;)

I'm guessing that You need the parent selected for the live function and that is why You can't get it this way.

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

It's the way You do it to make it work.
If the parent element has no id You can use more complicated tricks

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

You can use id or title or class, depends on what is already on the page

And if You really need it to be found by just css selector - as far as I know this is impossible with css selectors by design

彻夜缠绵 2024-08-30 17:28:03

这样的选择器不存在,CSS 中也不存在,jQuery/Sizzle 中也不存在。

可以改源码吗?

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

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

使用示例(请注意,父级已经存在,因此我使用了 getParent 代替):

jQuery('#myelement:getParent');

Such selector doesn't exists, nor in CSS neither in jQuery/Sizzle.

You can change the source code?

If yes, it is possible to add custom pseudo-selector:

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

Use example (Note that parent already exists, so I've used getParent instead):

jQuery('#myelement:getParent');
薄荷梦 2024-08-30 17:28:03

由于 CSS 无法像 XPath 那样遍历树,因此我进行了一些修改并检查字符串中的字符 <,对其进行拆分并调用 .parent () 手动。它不是最佳的,但它正在工作。

Since CSS can't traverse back up the tree like XPath can, I'm doing a bit of munging and checking for the character < in the string, splitting on that and calling .parent() manually. Its not optimal but it's working.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文