【问题标题】:How can I return the parent using selector?如何使用选择器返回父级?
【发布时间】:2016-12-08 17:49:17
【问题描述】:

如何仅使用 jQuery 选择器返回特定索引处的父元素?通过我使用:eq() 管理的索引来获取,但:parent 似乎不起作用。无论我有多少:parent,它都会返回相同的元素。我试过这个:

div.unread span.text:eq(2):parent

我需要这个的原因是我正在编写一个针对 jQuery 的工具,因为我使用的是 .NET 的浏览器,所以我必须使用 Javascript 来与网页的 DOM 交互。 Generate .parent() 方法会使代码生成更加复杂。所以我试图让它尽可能短,生成选择器尽可能地完成所有工作。 所以不用担心它是否会不可读,反正它不会被任何人阅读。

【问题讨论】:

  • 不要相信单独使用 css 选择器可以选择父元素。虽然您可以扩展 jQuery 来提供该功能。
  • 那个扩展名怎么样?为 jQuery 对象创建一个新方法?我只想使用选择器来避免使代码生成器变得复杂
  • span.text:eq(2)的父元素是不是div.unread的元素?您能否在 Question 中包含 html 并描述预期匹配的元素?

标签: javascript jquery html .net


【解决方案1】:

如果您需要元素的索引在全局范围内工作,您可以扩展 jQuery 表达式以使用您自己的表达式:

$.extend($.expr[':'],{
    parentOf: function(elm, _, a) {
        return $(elm).find($(a[3])).length
    }
});

然后使用:

$('div.unread:parentOf(span.text:eq(2))')

$.extend($.expr[':'],{
    parentOf: function(elm, _, a) {
        return $(elm).find($(a[3])).length
    }
});


$('div.unread:parentOf(span.text:eq(2))').css('color', 'red');
$('span.text:eq(2)').css('color', 'green');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="unread">
  <span class="text">span</span>
  <span class="text">span</span>
  <span class="text">span</span>
</div>
<div class="unread">
  <span class="text">span</span>
  <span class="text">span</span>
  <span class="text">span</span>
</div>
<div class="unread">
  <span class="text">span</span>
  <span class="text">span</span>
  <span class="text">span</span>
</div>

【讨论】:

  • @guest271314 因为在 DOM 上只有一个 span:eq(2)。我猜这是您的预期行为,否则请使用 Rory 的答案。更新:看看如何工作:eq()jsfiddle.net/1j9r7801
  • 每个div.unread 都包含一个span:eq(2) 后代元素?
  • 不,只有第一个 div。再次查看 jsFiddle jsfiddle.net/1j9r7801 中的 div.unread span:eq(2) 是哪个,否则将是 :nth-child(3)。我知道,这很令人困惑......
  • 这是试图向 OP 描述的方法。是的,:eq()的默认返回值是单个元素;尽管有多个 div.unread 父元素和选择器 :parentOf(span.text:eq(2)),但这里预计会返回多个匹配的 div.unread,因为每个 div.unread 元素都包含一个匹配 span.text:eq(2) 选择器的后代元素。
【解决方案2】:

在 jQuery 中使用 closest() 表示父级

$('span.text:eq(2)').closest('div.unread');

你也可以用like

$('span.text:eq(2)').closest('div.unread').css("background","red");

$('span.text').eq(2).closest('div.unread').css("background","green");

$('span.text:nth-child(2)').closest('div.unread').css("background","blue");


$('span.text:nth-child(3)').parents('div.unread').css("background","orange");
//:nth-child(3) denotes 3rd element unlike eq(3) refers 4th element

$('span.text:nth-child(3)').parent().css("background","yellow");

$('span.text:eq(2)').closest('div.unread').css("background","red");

$('span.text').eq(2).closest('div.unread').css("background","green");

$('span.text:nth-child(2)').closest('div.unread').css("background","blue");


$('span.text:nth-child(3)').parents('div.unread').css("background","orange");

$('span.text:nth-child(3)').parent().css("background","yellow");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="unread">
  <span class="text">text1</span>
  <span class="text">text2</span>
  <span class="text">text3</span>
</div>

【讨论】:

  • 如何返回特定索引处的父元素仅使用 jQuery 选择器
【解决方案3】:

您可以使用:has 选择器根据其子级检索父级:

$('div.unread:has(span.text:eq(2))');

请注意,如 @A.Wolff 所述,此实例中的 :eq() 选择器在每个单独的 div.unread 元素的上下文中工作,而不是全局,如果这是您的初衷。

【讨论】:

  • :eq() 不会匹配全局元素索引,但如果在:has() 中使用子元素索引,我不知道为什么?!编辑:我想这是预期的行为,因为:has() 将只检查后代,因此,任何传递到那里的选择器都将针对 only 孩子...看看我的意思here
  • @A.Wolff 非常好。我将更新以包含关于此的注释和使用 :nth-child() 的修复:jsfiddle.net/RoryMcCrossan/86wr0ac0/1
  • 抱歉,这是相反的::eq() selector in this instance works globally 不,它仅适用于儿童
  • 很确定它是全球性的——这就是为什么在你的第一个例子中只有一个跨度是绿色的。
  • 但是 3 个 div 是红色的,而只有包含第三个 span 的 div 应该是红色的。 (绿色跨度)
猜你喜欢
  • 2011-03-01
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 2019-11-11
  • 2016-08-22
相关资源
最近更新 更多