(Так как вы попросили меня опубликовать его. :-))
Вы сказали, что хотите, чтобы родительские элементы были дочерними в массиве, но ваш код
domElements.sort(function (a, b) {
return $(a).find(b).length ? 1 :
$(b).find(a).length ? -1 :
0;
});
... возвращает 1
, если a
является родителем b
, что приведет к a
позже в массиве, чем b
.
Итак, я думаю:
domElements.sort(function (a, b) {
return $(a).find(b).length ? -1 :
$(b).find(a).length ? 1 :
0;
});
Но проверить, является ли элемент потомком другого элемента, так просто, интересно, действительно ли вам нужен allocate-a-jQuery-object-and-then-call-find:
domElements.sort(function (a, b) {
return isParentOf(a, b) ? -1 :
isParentOf(b, a) ? 1 :
0;
});
function isParentOf(parent, elm) {
while (elm) {
elm = elm.parentNode;
if (elm === parent) {
return true;
}
}
return false;
}
Рабочий пример Но обратите внимание Ответ Тиммивиля & mdash; даже если он выполняет небольшую ненужную работу (приводя в порядок братьев и сестер, когда все, что вам нужно, это родитель / ребенок), для этого есть предварительно запеченная функция jQuery!