У меня есть массив URL-адресов для загрузки асинхронно, например.jQuery: добавить асинхронно загруженное содержимое, поддерживая порядок
var toLoad = ['snippet1.html', 'snippet2.html', ... ];
Я пытаюсь загрузить каждый фрагмент кода с помощью AJAX и добавить его к родителю <div>
, сохраняя порядок содержания в массиве. Из-за того, как настроен остальная часть моего кода (и по соображениям производительности), I не хотите загрузить синхронно, либо с async:false
, либо путем цепочки вызовов .ajax()
, как предложено в ответах на this similar question. Вместо этого я хотел бы поместить логику в функцию обратного вызова AJAX, чтобы правильно загрузить загруженные фрагменты, основываясь на индексе.
Следующий код работает:
var $parent = $('#mydiv');
toLoad.forEach(function(url, i) {
// load snippet
$.get(url, function(snippet) {
// attach order to DOM element
snippet = $(snippet).data('order', i);
// find the sibling with the next lowest order number
var $prev = $parent
.children()
.filter(function() {
return $(this).data('order') < i
})
.last();
if ($prev[0]) snippet.insertAfter($prev);
else $parent.prepend(snippet);
});
});
... но я не люблю его. В частности, мне не нравится прикреплять заказ к элементу DOM с помощью .data()
; это кажется уродливым, и я бы предпочел не вставлять это в DOM, если я могу ему помочь.
Есть ли лучший способ достичь цели асинхронной загрузки содержимого в div с предопределенным порядком?
было бы приемлемо, чтобы отложить всю нагрузку до тех пор, после того, как все значения были извлечены? Затем вы можете построить массив, отслеживающий результаты каждого запроса, и добавьте его в DOM только после того, как будут получены все URL-адреса. – DCoder
@DCoder - Это может сработать - но это не идеально, потому что мне пришлось бы добавить дополнительную логику для отслеживания завершения всех вызовов. – nrabinowitz