В следующем примере.Я хотел бы найти первые .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