jQuery: помогите с условием

M
На сайте с 28.05.2013
Offline
1
700

как написать

если внутри тега с классом .main есть тег с классом .main2, то для всех тегов с именами классов .sub расположенных после найденного .main2 и до ближайшего класса .end (их там несколько) задать стиль display:inline

C
На сайте с 04.02.2005
Offline
291
#1

main2list = $('.main').find('.main2');
if (проверяем длину main2list){
main2list.find('.sub, .end').each(

function() {
if ($(this).hasclass('.sub')) $(this).css(....
if ($(this).hasclass('.end')) return;

}
);
}

Не проверял

Ayavryk
На сайте с 11.10.2003
Offline
209
#2

2Chukcha что-то здесь не то. 1) Нет гарантии, что find('.sub, .end') сложит все в том порядке, в котором хотелось бы. 2) цикл each не разрывается.

2manitoba надо бы уточнить .sub, .main2 и .end - это разные теги или одни и те же. на одном уровне или могут быть вложенные?

---------- Добавлено 14.06.2013 в 12:49 ----------

http://learn.javascript.ru/play/UqOCw - правильный код если считать что все на одном уровне

Тынгыр, мынгыр, комсомол (http://erum.ru). Ехари, ехари, (жалобно) аяврик. /народная тунгусская песня/
C
На сайте с 04.02.2005
Offline
291
#3
2Chukcha что-то здесь не то. 1) Нет гарантии, что find('.sub, .end') сложит все в том порядке, в котором хотелось бы. 2) цикл each не разрывается.

1-ое. написал, что не проверял

2-ое. не вижу причин в построении дерева dom, хотя варианты, конечно, возможны.

3. как это цикл не разрываеется? hasClass(end) return

4. см. п.1 :)

---------- Post added 14-06-2013 at 21:57 ----------

а если var e = $('.main:has(.sub)').find('.main2:first'); будет несколько main2?

Ayavryk
На сайте с 11.10.2003
Offline
209
#4
Chukcha:
3. как это цикл не разрываеется? return

Вспомнил. Спасибо. Забыл что это есть. Склероз.

Chukcha:
2-ое. не вижу причин в построении дерева dom, хотя варианты, конечно, возможны.

Надо смотреть в исходниках и то не факт, что порядок отбора не изменится.

find('.sub, .end') - то ли они пройдут по дереву с проверкой обоих критериев одновременно, то ли они сначала отберут .sub а потом вторым проходом по DOM- .end и тогда порядок будет нарушен. А если еще jquery я иногда меняю на zepto, а там свой парсер и тоже могут возникнуть нюансы

Chukcha:
а если var e = $('.main:has(.sub)').find('.main2:first'); будет несколько main2?

Тоды ой. Нужно дополнительный цикл по .main

Chukcha:
var e = $('.main:has(.sub)').find('.main2:first'); будет несколько main2?

Ну да. Для надежности можно прокрутить по всем main

C
На сайте с 04.02.2005
Offline
291
#5

main2list.find('.sub, .end').each(
The order of the DOM elements in the returned jQuery object may not be identical, as they will be in document order

main2list.find('*').each(

Это как вариант использования, возможно здесь порядок выбора будет неизменен.

Но * это не совсем хорошо

:only-child 
- возможно самое то, - будут выбраны дети, но не внуки.
Ayavryk
На сайте с 11.10.2003
Offline
209
#6

По-любому next() гарантированно дает ожидаемый результат. + очевидность кода + в общем случае, возможно, что и более эффективный потому что неизвестно сколько будет элементов после .end

C
На сайте с 04.02.2005
Offline
291
#7


<div class="main">
<div class="sub">A</div>
<div class="main2">0</div>
<div class="sub">B</div>
<div class="nosubnoend">X</div>
<div class="end">1</div>
<div class="sub">C</div>
<div class="sub">D</div>
<div class="nosubnoend">Y</div>

<div class="end">2</div>
<div class="sub">E</div>
<div class="sub">F</div>
<div class="sub">A</div>
</div>

Если использовать next(), то нужнои учесть варианты...

Конечно, не зная структуры dom у ТС, можно напридумывать что угодно.

Ayavryk
На сайте с 11.10.2003
Offline
209
#8

Поговорили Чукча с Аявриком :)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий