Я должен быть в состоянии управлять порядком пунктов, обрабатываемым в $(document).ready
событие.
Это несколько средств управления, загруженных из нескольких файлов, все просящие быть призванными ready
событие. Они все запускают асинхронный вызов к серверу (Ajax). Только после того, как они все сделаны, я должен сделать некоторую дополнительную работу.
Каково было бы изящное решение для этого?
Асинхронные запросы запускают по порядку, но будут возвращаться в том порядке, в каком они были выполнены первыми. Таким образом, не существует надежного способа принудительно завершить их одновременно, однако вы можете создать правила для запуска кода только после возврата определенных групп.
Например, определите функцию обратного вызова с набором правил и передайте ее каждому успешному
обратному вызову для всех ваших запросов ajax.
var completedObject = {};
function groupSuccessCallback() {
// Test for any combination of requirements
if ( completedObject.ajax1 && completedObject.ajax2 ) {
... // Do something that only requires 1 and 2
}
if ( completedObject.ajax1 && completedObject.ajax2 && completedObject.ajax3) {
... // Do something that requires all 3 being done
// your data is available at completedObject.ajax#
}
// Or test for _all_ entries for a dynamic count
var allComplete = true;
for(var i in completedObject) {
if ( completedObject.hasOwnProperty(i) && !completedObject[i] ) {
allComplete = false;
}
}
// Do whatchya need.
if (allComplete) {
alert("bb-b-bb-b-b-b-bbb... that's all folks!");
}
}
Затем установите флаги внутри ваших функций успеха:
// Ajax1
completedObject['anything'] = false; // instantiate a dynamic entry in the object or use an array if you can't use names.
$.ajax({
...,
...,
success: function(data) {
completedObject['anything'] = data || true;
groupSuccessCallback();
}
});
В зависимости от остальной части страницы выполнение этой «дополнительной работы» в обработчике $. AjaxStop может быть более элегантным вариантом.
Однако было бы неправильно, если бы пользователь мог и / или мог бы запускать последующие вызовы $ .ajax () , пока эти начальные вызовы выполняются. В этом случае их запускаемые вручную вызовы могут продлить событие $ .ajaxStop дольше, чем предполагалось.
Создайте переменную, которая содержит значение 0. При успешной функции каждого вызова Ajax увеличьте это значение на 1 и проверьте, равно ли это значение вашему общему количеству вызывает, если он выполняет вашу функцию завершения.
Джон Ресиг о порядке вычисления функций в $ (document) .ready:
Каждый раз, когда добавляется новая функция в очередь, он просто добавляется в массив - затем снова отключается при выполнении. Сообщите мне, если это не для вас.
$. ReadyList - только в версиях до 1.4
jQuery предоставлял свойство с именем $. ReadyList
, которое является массивом, позволяющим выполнять операции, упорядоченные по функциям, однако $. ReadyList больше не опубликовано в jQuery 1.4.0
Хакерским способом
вы можете попробовать $ (window) .load (function () {});
, он должен выполняться после загрузки всего окна (не когда документ готов, как это было с $ (document) .ready ()