Гарри, извините, но вы ошиблись.
Ваше решение $(".email").after("<ul>").nextAll("li").appendTo($(".email").next());
создает недействительную разметку :
<ul>
<li class="textbox email">This is the email list item</li>
<ul>
<li class="textbox address">This is the address list item</li>
<li class="textbox aboutme">This is the aboutme list item</li>
</ul>
</ul>
, поскольку элементы ul
могут толькосодержат дочерние li
элементы.В этом случае внешний ul
имеет одного li
и одного ul
дочернего элемента, что семантически недопустимо.
То, что вы хотите, это:
<ul>
<li class="textbox email">This is the email list item
<ul>
<li class="textbox address">This is the address list item</li>
<li class="textbox aboutme">This is the aboutme list item</li>
</ul>
</li>
</ul>
Это допустимая разметка , поскольку оба элемента ul
имеют только li
дочерних элементов, а li
может содержать другие ul
внутри.Другими словами, у внешнего ul
есть только один дочерний элемент (электронное письмо), который содержит в себе еще один список ul
.
Итак, код для генерации правильной разметки выше:
// get the .address and .aboutme and wrap a UL around these two LIs
$(".email").nextAll("li").wrapAll("<ul class='open'>");
// move the recently created UL.open to the .email
$(".email").append($(".open"));
или, если вы предпочитаете все в одном акте, что-то вроде этого:
$(".email").nextAll("li").wrapAll("<ul class='open'>").parent().prev(".email").append($(".open"));