Ну, так как вы заявили, что хотите выбрать видимый элемент next
или prev
, я предполагаю, что вам нужен только один из них, и он должен быть ближайшим между ними. Чтобы достичь этого, одним из решений является выбор следующего видимого, предыдущего видимого и сравнение между ними, которое является ближайшим. Итак, с учетом следующего макета:
<div class='atitle'>a</div>
<div class='atitle' hidden>b</div>
<div class='atitle'>c</div>
<div class='atitle'>d</div>
<div class='atitle' hidden>e</div>
<div class='atitle'>f</div>
<div class='atitle' hidden>g</div>
<div class='atitle'>h</div>
Нажатие на каждый элемент должно вернуть:
┌─────────────┬───────────────┐
│ Clicking on │ Should return │
├─────────────┼───────────────┤
│ a │ c │
│ c │ d │
│ d │ c │
│ f │ d or h* │
│ h │ f │
└─────────────┴───────────────┘
* Так как d
и h
совпадаютрасстояние от f
, если щелкнуть по последнему, вы должны решить, какой из первых вы выберете, если хотите только один, в этом примере я выбираю оба.
$('.atitle').on('click', function() {
var $this = $(this);
// Select the closest prev and next visible elements
var $prev = $this.prevAll('.atitle:visible:eq(0)');
var $next = $this.nextAll('.atitle:visible:eq(0)');
// Check the indexes of each one
var prevDiff = $prev.index() < 0 ? NaN : Math.abs($this.index() - $prev.index());
var nextDiff = $next.index() < 0 ? NaN : Math.abs($this.index() - $next.index());
// Decide which one should be selected
if (isNaN(prevDiff) || nextDiff < prevDiff) {
console.log( $next.text() );
} else if (isNaN(nextDiff) || prevDiff < nextDiff) {
console.log( $prev.text() );
} else if (nextDiff === prevDiff) {
console.log($prev.text(), $next.text());
} else {
console.log('no element');
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='atitle'>a</div>
<div class='atitle' hidden>b</div>
<div class='atitle'>c</div>
<div class='atitle'>d</div>
<div class='atitle' hidden>e</div>
<div class='atitle'>f</div>
<div class='atitle' hidden>g</div>
<div class='atitle'>h</div>