【发布时间】:2019-10-27 06:34:42
【问题描述】:
在下面的例子中。我想为 #main 和 #secondary 这两个项目找到第一个 .invalid-feedback 和 .valid-feedback。
显然我对通用案例感兴趣,这就是我为 jQuery 编写原型扩展的原因。
$.fn.extend({
closestNext: function (selector) {
let found = null
let search = (el, selector) => {
if (!el.length) return
if (el.nextAll(selector).length) {
found = el.nextAll(selector).first()
return
}
search(el.parent(), selector)
}
search($(this), selector)
return found
}
})
// Proof
$('#main').closestNext('.invalid-feedback').text('main-invalid')
$('#secondary').closestNext('.invalid-feedback').text('secondary-invalid')
$('#main').closestNext('.valid-feedback').text('any-valid')
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
<div>
<input id="main"/>
</div>
<div class="dummy"></div>
<div class="invalid-feedback"></div>
<div>
<input id="secondary"/>
</div>
<div class="invalid-feedback"></div>
</div>
<div class="valid-feedback"></div>
我写的东西看起来很复杂,我期待这种 DOM 遍历函数成为 jQuery 的一部分。不幸的是,我在手册上没有找到任何相关的功能。
有没有更简单的方法可以达到与closestNext 相同的结果?
编辑
从更算法的角度来看,我正在寻找一个按以下顺序执行的树遍历函数,但其复杂性比我在示例中实现的要好。
.
├── A1
│ ├── B1
│ │ ├── C1
│ │ ├── C2
│ │ └── C3
│ ├── B2
│ │ ├── C4 <--- Entry point
│ │ ├── C5
│ │ └── C6
│ └── B3
│ ├── C7
│ ├── C8
│ └── C9
└── A2
├── B4
│ ├── C10
│ └── C11
└── B5
├── C12
└── C13
从C4入口点,探索顺序为:
>>> traverse(C4)
C5, C6, B3, C7, C8, C9, A2, B4, C10, C11, B5, C12, C13
【问题讨论】:
-
你事先知道html结构吗?
-
预期响应?
-
@NagaSaiA 给定示例的预期响应在我的问题中
-
鉴于答案(以及您对已删除答案的评论),您可能需要澄清标记深度是未知的。
-
@HereticMonkey 简单来说,OP 不知道从哪个ascendent 找到next。
标签: javascript jquery dom jquery-traversing