如何使用jQuery选择树中的最后一个孩子?

Posted

技术标签:

【中文标题】如何使用jQuery选择树中的最后一个孩子?【英文标题】:How to select the last child inside the tree using jQuery? 【发布时间】:2019-10-01 10:50:41 【问题描述】:

假设我有这样的结构:

<div id="content">
    <div>
        <span>
            <b>
                <i>
                    <u>
                        <span>Price</span>
                    </u>
                </i>
            </b>
        </span>
    </div>
</div>

在这种情况下,div #content 内的标签数量以及他们不认识我的标签数量。我只能访问 id content

如何让选择器找到包含文本 Price 的最新跨度?

附言lastChild 方法返回所选选择器中的最后一个子节点,但不会更深!

【问题讨论】:

【参考方案1】:

使用*选择器选择#content的所有子元素,并使用.filter()过滤元素。在回调过滤元素中没有任何子元素。

$("#content *").filter(function()
  return $("*", this).length == 0;
);
// Or using ES6
$("#content *").filter((i,v) => $("*", v).length == 0);

var ele = $("#content *").filter((i,v) => $("*", v).length == 0);
console.log(ele[0].outerhtml);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="content">
    <div>
        <span>
            <b>
                <i>
                    <u>
                        <span>Price</span>
                    </u>
                </i>
            </b>
        </span>
    </div>
</div>

【讨论】:

【参考方案2】:

您可以使用.find(): https://api.jquery.com/find/

这将递归查找您的选择器,因此: $('#content').find('span') 将为您提供两个跨度,一个用于第一个嵌套跨度,一个用于第二个嵌套跨度。不利的一面是,如果您有多个跨度,则需要找到正确的跨度。

如果您可以在最后一个标识符中添加一个标识符,比如一个名为“target-class”的类,那么您就会知道您会找到正确的标识符: $('#content').find('span.target-class');

【讨论】:

以Span为例,可能有完全不同的标签。【参考方案3】:

首先让我们修正你的语法。您不能将&lt;span&gt; 直接放在&lt;u&gt; 中。您需要一个 &lt;li&gt; 节点。此外,您不能/不应该将块元素(例如 ul)放入内联元素(span、a、b、i...)中。甚至不推荐使用&lt;b&gt;&lt;i&gt;,最好使用&lt;strong&gt;&lt;em&gt; 等语义标记。

现在你的问题。我认为您不必关心成为最后一个节点。如果您知道包含的文本是“价格”,则可以通过以下方式查找:

var selector = $('#content').find(":contains('Price')");
$(selector).addClass('highlighted');
.highlighted 
background-color: red;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="content">
    <div>
        <u>
          <li>
              <span>Price</span>
          </li>
        </u>
    </div>
</div>

如果此解决方案不符合您的需求,要获取最后一个节点,您必须检查所有节点是否有子节点。一旦他们不这样做,你就达到了你的目标。 但我不得不说这是你可以在 SO 中找到的解决方案。 Select deepest child in jQuery

【讨论】:

1.我随意输入的标签例如2。我不知道标签里面的文字,它可以是任何。我的任务是替换文本并将整个标签链保存在某处。 很好,但是认为我们将使用您的代码来解决您的问题。语法错误会导致代码中断。您应该注意语法以节省我们修复它的时间。就这样。希望你能理解。 2.所以我给了你两个答案。 是的,谢谢评论,我下次会考虑语法错误。【参考方案4】:

Jquery 方式- 您可以使用$() 定位所有跨度并使用slice() 方法定位最新的跨度。

$('#content span').slice(-1)[0];

Javascript 方式 - 使用querySelectorAll() 查找所有跨度,你会得到一个NodeArray,你可以使用Array.from() 和slice() 将其转换为数组,其中最后一项是最新的跨度。

Array.from(document.querySelectorAll('#content span')).slice(-1)[0]

【讨论】:

不知道最后一个标签会是span

以上是关于如何使用jQuery选择树中的最后一个孩子?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用jquery排除子选择器中的子项?

如何在jQuery中选择最后一个子元素?

使用 jQuery 如何在使用 .closest() 时选择一个孩子?

如何从树中删除每个对象[重复]

如何使用CSS选择最后一个孩子的具体数量?

ajax刷新后如何使jquery选择器保持活动状态