Является ли порядок сортировки jQuery $(). Each() гарантирован?

На одной странице моего сайта у меня есть список записей, созданных пользователем - стандартный HTML <ul> с <li> элементами внутри него.

Я хочу перебирать список, но порядок элементов важен.

Используя jQuery $('.myList li').each(), могу ли я гарантировать, что я получу элементы li в порядке их появления в DOM?

Из моих тестов до сих пор кажется, что они действительно повторяются в правильном порядке, но я не могу найти ничего, что подсказывает мне, что это гарантировано.

Если это не гарантировано, каким будет следующий лучший альтернативный метод для итерации через них в порядке?

Ответ 1

Итак, после прочтения документов и отхода еще не совсем уверен, я закончил погружение, фактически прочитав исходный код jQuery (спасибо @RoryMcCrossan ответ за подсказку).

Фактически (в отличие от того, что сказал @RoryMcCrossan), $().each() использует либо for...in, либо for, в зависимости от того, является ли вход объектом или массивом.

Для "массива" достаточно быть "подобным массиву" объекту, который имеет место для объекта jQuery, поскольку он содержит нумерованный список элементов и свойство length.

Следовательно, вызов $().each() будет использовать for, а не for...each, поскольку он выполняет итерацию по объекту jQuery. И поскольку мы используем for, мы знаем, что мы можем гарантировать, что порядок итераций для $().each() будет соответствовать порядку элементов, которые он задает.

Итак, это заставляет меня задавать следующий вопрос о том, гарантирован ли порядок элементов, заданный исходным запросом, таким же, как и в DOM. Если да, тогда я должен быть в порядке.

Ответ на этот вопрос можно найти в вопросе связанном с комментариями @Mritunjay, и ответ "да", они возвращаются в том порядке, в котором они отображаются в DOM.

Итак, окончательный ответ: да, я могу использовать $('.myList li').each() и перебирать элементы списка в порядке их появления в DOM.

Спасибо за помощь и подсказки ребята. Очень ценится.

Ответ 2

Вы не можете гарантировать порядок, в котором each будет перебирать события. Как правило, это будет до тех пор, пока они не появятся в DOM, но это не в спецификации для оператора for...in (это то, что $.each использует внутренне).

Если вам нужно гарантировать порядок итератора each, sort элементов перед тем, как вы их закроете.