Я создал функцию сортировки для сортировки элементов li в ul на основе идентификатора.
function noFilterForElements(){
/* Check where to append */
var listofelems = $('#ul-to-sort > li');
if (listofelems.length>0){
$('#ul-to-sort').html('');
$.each(listofelems,function(datakey,dataval){
/* Write out the elements without parents first */
console.info(dataval);
if ($(dataval).data('parent') == 0){
$('#ul-to-sort').append(dataval);
}
});
$.each(listofelems,function(datakey,dataval){
/* Write out the elements without parents first */
if ($(dataval).data('parent') != 0){
$('.parent-title[data-actid = "'+$(dataval).data('parent')+'"]').after(dataval);
}
});
}
}
Проблема заключается в том, что в FF и Chrome и т. д. Данные автоматически содержат все узлы содержимого / дочерние элементы для элемента li. В IE, с другой стороны, берется только элемент li. Все дочерние элементы элемента li не содержатся в переменной dataval.
Протестировано на IE 8, 9, 10 и Edge (стандарты)
Любые идеи о том, почему это происходит и как я могу решить эту проблему, пожалуйста?
PS: Я пробовал повторять с listofelems.each () - результат тот же; работает в FF и Chrome, но не в IE.
<ul id = "ul-to-sort">
<li class = "parent-title" data-actid = "world-1" data-parent = "0">Parent</li>
<li class = "parent-title" data-actid = "world-2" data-parent = "world-1">Child 1 of World 1</li>
<li class = "parent-title" data-actid = "world-3" data-parent = "world-1">Child 2 of world 1</li>
<li class = "parent-title" data-actid = "world-4" data-parent = "world-2">Child 1 of world 2</li>
<li class = "parent-title" data-actid = "world-5" data-parent = "world-2">Child 2 of world 2</li>
<li class = "parent-title" data-actid = "world-6" data-parent = "world-1">Child 3 of world 1</li>
<li class = "parent-title" data-actid = "world-7" data-parent = "world-1">Child 4 of world 1</li>
<li class = "parent-title" data-actid = "world-8" data-parent = "world-4">Child 1 of world 4</li>
</ul>
Протестировано с помощью JsFiddle, и он переупорядочивает дочерние элементы.
Пожалуйста, включите весь соответствующий код, необходимый для воспроизведения вашей проблемы (в данном случае это будет небольшой образец HTML). См. минимальный воспроизводимый пример.
Вы пробовали использовать $(dataval).html()?
@MohsinMehmood - Спасибо за подсказку. Да, у меня есть - все еще не получаются дочерние элементы (или что-либо, в том числе, если это простой текст) li в IE. С другой стороны, FF и Chrome все еще в порядке.
@alpharomeo А что насчет $(this).html()? $(this) должен относиться к текущему элементу <li>
@MohsinMehmood - тоже пробовал. Все еще не подбирает дочерние элементы. - Есть идеи, почему FF забирает это? Могу я спросить, что происходит на уровне браузера, когда один браузер работает, а другой игнорирует?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я решил проблему, НЕ установив элемент ul пустым. То есть $('#ul-to-sort').html('');
После того, как я удалил это и по совету @muuvmuuv & @Moshin, я переписал функцию следующим образом:
function noFilterForElements(){
/* Check where to append */
var listofelems = $('#ul-to-sort > li');
$(listofelems).each(function(elemkey,elemval){
if ($(elemval).data('parent') == 0){
$('#ul-to-sort').append(elemval);
} else {
$('.parent-title[data-actid = "'+$(elemval).data('parent')+'"]').after(elemval);
}
});
}
Ul не строится на себе - поэтому даже при обновлении он создает новые элементы - вот почему я изначально установил element.html('') на пустой. Теоретически, когда я добавляю новый элемент, он должен создавать дубликат, но это не так - и это хорошо. Я подозреваю, что, поскольку детали элемента совпадают (без изменений исходного элемента - просто переупорядочивают его), новый элемент с теми же параметрами не создается. (Это предположение - если кто-нибудь может помочь нам понять, почему это так, пожалуйста, отредактируйте этот ответ).
Спасибо за вашу помощь.
Вам не нужны два цикла, человек ... используйте один и используйте предложение else.