在下面的示例中,我想找到第一个
显然,我对一般情况感兴趣,这就是我为什么编写了一个jQuery原型扩展的原因。
从
.invalid-feedback
和.valid-feedback
,并针对#main
和#secondary
两个元素进行查找。显然,我对一般情况感兴趣,这就是我为什么编写了一个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
closest()
实际上确实会向上移动树形结构。也许不是 OP 想要的方式,但它确实会上升。 - Heretic Monkey