javascript - jQuery Transverse Up(通过 sibs、parents、grandPs 等)直到找到 Element 的第一个实例
问题描述
我正在尝试使用 jQuery 遍历 DOM 以找到标签的第一个匹配项。我试过closest
, prev
, prevAll
,但在某些结构情况下它们都失败了。如果p
示例中的标记从兄弟姐妹更改为父标记或向上标记,则会失败。所以我总是以p
标签为目标。但是,如果您删除p
小提琴()中的标签p tag 1
...我想p tag test 2
突出显示...如果您删除p tag 2
- 我想p tag 3
突出显示。我正在寻找一种任意向上的方式。一个不是基于选择器与 sib、parent、grandP 的位置关系,而是基于在所述选择器上方的 p 标签的第一个查找。
<div>(great-great-grandparent)
<div>div (great-grandparent)
<p>p6</p>
<div>ul (second ancestor - second grandparent)
<p>p5</p>
<div>ul (first ancestor - first grandparent)
<p>p4</p>
<div>Wrapper
<!-- <span>span3</span> -->
<div>li (direct parent)
<!-- <p>p2-2</p> -->
<!-- <p>p2</p> -->
<label class='one'>label1</label>
<p>p1</p>
</div>
</div>
</div>
</div>
</div>
</div>
示例:https ://jsfiddle.net/rooksstrife/04nq37wr/44/
所有这些都无法完成......第一个 p 标签在哪里 up。
$('.one').prevAll('p:first')
$('.one').prev('p')
$('.one').closest('p')
这是我得到的最接近的,但它只上升了 1 级而不是搜索第一个p
:
if ($(".one").prevAll("p:first").length == 0) {
$(".one").closest(":not(.one)*").prevAll("p:first").css({
"color": "red",
"border": "2px solid red"
});
} else {
$(".one").prevAll("p:first").css({
"color": "red",
"border": "2px solid red"
});
}
解决方案
您可以使用父母(https://api.jquery.com/parents/)。父母遍历 UP 直到遇到通过的选择器。
$("span").parents(".ancestors").find("p:first");
另一种选择是使用父母和 jQuery 的第一个选择器(不是 CSS):
$(document).ready(() => {
$("span").parents("div").find("p").first().css({
"color": "red",
"border": "2px solid red"
});
});
div, p, span * {
display: block;
border: 2px solid lightgrey;
color: lightgrey;
padding: 5px;
margin: 15px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>(great-great-grandparent)
<div>div (great-grandparent)
<b>test4</b>
<div>ul (second ancestor - second grandparent)
<p>test3</p>
<div>ul (first ancestor - first grandparent)
<p>test2</p>
<div>li (direct parent)
<p> Test 1</p>
<span>span</span>
</div>
</div>
</div>
</div>
</div>
推荐阅读
- mocking - React-bootstrap Typeahead 不适用于 Jest 快照
- ios - 在加载新数据时使缓存数据响应显示
- php - 使用 PHP 更新 XML 文件
- go - 如何使用 net.Conn 使用扫描仪解组原型?
- javascript - 如何从 html 文件中获取保存的数据?
- android - Android Studio 返回类型不匹配
- javascript - 事件目标在我的 Blazor 项目中不起作用
- flask - 如何修复:“flask request.arg.get('language') 函数返回 NONE
- java - 如何避免在字符串中打印重复的特殊字符?
- android - 填写数据库时出错:字段“价格”不是“Android Studio 版本:3.4.2”