http://api.jquery.com/nextUntil
Получить все последующие элементы каждого элемента вплоть до , но не включая элемент, соответствующий селектору "
В ваших двух случаях:
.nextUntil("fieldset:not(.hide)")
получает все с классом hide
, затем останавливается на том без hide
(последний) и не включает его - но затем attr получает атрибут из first в коллекции.
Попробуйте $('fieldset.active').nextUntil("fieldset:not(.hide)").length
- это не 1.
Во втором случае, с .nextUntil("fieldset")
- это останавливается на 2-м наборе полей (после первого) и, таким образом, .attr
ничего не дает, давая неопределенное, ie:
$('fieldset.active').nextUntil("fieldset").length === 0
Чтобы получить идентификатор первого набора полей, который не является .hide, вы можете использовать .nextAll().first()
, обновленный фрагмент:
console.log($('fieldset.active').nextAll("fieldset:not(.hide)").first().attr('id'));
.hide { display:none; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<fieldset id="a" class="active">MEEEE</fieldset>
<fieldset id="b" class="hide">No</fieldset>
<fieldset id="c" class="hide">No</fieldset>
<fieldset id="d" class="hide">No</fieldset>
<fieldset id="e" class="hide">meee Too</fieldset>
<fieldset id="f"></fieldset>
Обратите внимание, что похоже, что вы можете использовать .next("fieldset:not(.hide)"
, но это не делает то, на что похоже, вместо этого: .next().filter("fieldset:not(.hide)")
- ie получает следующий и возвращает его, если он соответствует фильтру.