Основная проблема с вашим кодом состоит в том, что ваш HTML недействителен; ul
не может быть ребенком другого ul
. Может только li
или ol
. Этот недействительный HTML приводит к тому, что li
будет отображаться не так, как вы ожидаете, поэтому на сортировку влияет. Чтобы исправить это, исправьте HTML, чтобы вложенный «торт» ul
находился в пределах li
.
Поскольку вы пометили вопрос с помощью jQuery, вот очень простая реализация того, что вы изначально было:
jQuery($ => {
let $ul = $('#list');
$('#test').on('click', function() {
let sort = $(this).data('sortasc');
let dir = sort ? [1, -1] : [-1, 1];
$ul.children('li').sort((a, b) => a.innerText.trim() < b.innerText.trim() ? dir[0] : dir[1]).appendTo($ul);
$(this).data('sortasc', !sort);
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="test">Toggle sort</button>
<ul id="list">
<li>banana</li>
<li>
cake
<ul>
<li>egg</li>
<li>doughnut</li>
<li>burger</li>
</ul>
</li>
<li>rice</li>
<li>apple</li>
</ul>