如何使用 jQuery select 树中的最后一个 child?
How to select the last child inside the tree using jQuery?
假设我有这样一个结构:
<div id="content">
<div>
<span>
<b>
<i>
<u>
<span>Price</span>
</u>
</i>
</b>
</span>
</div>
</div>
在这种情况下,div #content
中的标签数量以及他们不认识我的标签数量。我只能访问 ID content
.
如何将选择器获取到包含文本 Price 的最新范围?
p.s。 lastChild
方法 returns 所选选择器中的最后一个 child,但不能更深!
Select #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>
您可以使用 .find()
:
https://api.jquery.com/find/
这将递归地查找您的选择器,因此:
$('#content').find('span')
将为您提供两个跨度,一个用于第一个嵌套跨度,一个用于第二个嵌套跨度。缺点是,如果您有多个跨度,则需要找到合适的跨度。
如果您可以在最后一个标识符中添加一个标识符,比如一个名为 'target-class' 的 class,您就会知道您会找到正确的标识符:
$('#content').find('span.target-class');
首先让我们修正一下语法。您不能将 <span>
直接放在 <u>
中。您需要一个 <li>
节点。此外,您不能将 t/shouldn 等块元素放入行内元素(span、a、b、i...)中,例如 ul
。甚至不推荐 <b>
和 <i>
,最好使用语义标记,例如 <strong>
或 <em>
。
现在你的问题。我认为您不必关心成为最后一个节点。如果您知道包含的文本是 "Price" 您可以通过以下方式查找它:
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>
如果此解决方案不符合您的需求,要获得最后一个节点,您必须让所有节点检查它们是否具有 children。一旦他们不这样做,您就达到了目标。
但我不得不说,这是您可以在 SO 中找到的解决方案。
Select deepest child in jQuery
Jquery 方式-
您可以使用 slice() 方法定位所有范围 $()
并定位最新范围。
$('#content span').slice(-1)[0];
Javascript 方式-
使用 querySelectorAll() 查找所有跨度,您会得到一个 NodeArray,您可以使用 Array.from() 将其转换为数组,然后slice() 它的最后一项是最新的跨度。
Array.from(document.querySelectorAll('#content span')).slice(-1)[0]
假设我有这样一个结构:
<div id="content">
<div>
<span>
<b>
<i>
<u>
<span>Price</span>
</u>
</i>
</b>
</span>
</div>
</div>
在这种情况下,div #content
中的标签数量以及他们不认识我的标签数量。我只能访问 ID content
.
如何将选择器获取到包含文本 Price 的最新范围?
p.s。 lastChild
方法 returns 所选选择器中的最后一个 child,但不能更深!
Select #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>
您可以使用 .find()
:
https://api.jquery.com/find/
这将递归地查找您的选择器,因此:
$('#content').find('span')
将为您提供两个跨度,一个用于第一个嵌套跨度,一个用于第二个嵌套跨度。缺点是,如果您有多个跨度,则需要找到合适的跨度。
如果您可以在最后一个标识符中添加一个标识符,比如一个名为 'target-class' 的 class,您就会知道您会找到正确的标识符:
$('#content').find('span.target-class');
首先让我们修正一下语法。您不能将 <span>
直接放在 <u>
中。您需要一个 <li>
节点。此外,您不能将 t/shouldn 等块元素放入行内元素(span、a、b、i...)中,例如 ul
。甚至不推荐 <b>
和 <i>
,最好使用语义标记,例如 <strong>
或 <em>
。
现在你的问题。我认为您不必关心成为最后一个节点。如果您知道包含的文本是 "Price" 您可以通过以下方式查找它:
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>
如果此解决方案不符合您的需求,要获得最后一个节点,您必须让所有节点检查它们是否具有 children。一旦他们不这样做,您就达到了目标。 但我不得不说,这是您可以在 SO 中找到的解决方案。 Select deepest child in jQuery
Jquery 方式-
您可以使用 slice() 方法定位所有范围 $()
并定位最新范围。
$('#content span').slice(-1)[0];
Javascript 方式- 使用 querySelectorAll() 查找所有跨度,您会得到一个 NodeArray,您可以使用 Array.from() 将其转换为数组,然后slice() 它的最后一项是最新的跨度。
Array.from(document.querySelectorAll('#content span')).slice(-1)[0]