Quando le funzioni di completamento di sempre o callback vengono annidati troppo in profondità o il codice sta ottenendo ripetuto più e più volte, ho tendono a pensare a una soluzione di tabella di dati con una funzione comune:
function fadeSequence(list) {
var index = 0;
function next() {
if (index < list.length) {
$(list[index++]).fadeOut(next);
}
next();
}
var fades = ["div1", "div2", "div3", "div4", "div5"];
fadeSequence(fades);
E, se si desidera un diverso tipo di animazione per alcuni elementi, è possibile creare una serie di oggetti che descrivono ciò che ogni animazione successiva dovrebbe essere. È possibile inserire tutti i dettagli nell'array di oggetti necessari. Si può anche animazioni Uso combinato con altro metodo di jQuery sincrono chiamate in questo modo:
function runSequence(list) {
var index = 0;
function next() {
var item, obj, args;
if (index < list.length) {
item = list[index++];
obj = $(item.sel);
args = item.args.slice(0);
if (item.sync) {
obj[item.type].apply(obj, args);
setTimeout(next, 1);
} else {
args.push(next);
obj[item.type].apply(obj, args);
}
}
}
next();
}
// sequence of animation commands to run, one after the other
var commands = [
{sel: "#div2", type: "animate", args: [{ width: 300}, 1000]},
{sel: "#div2", type: "animate", args: [{ width: 25}, 1000]},
{sel: "#div2", type: "fadeOut", args: ["slow"]},
{sel: "#div3", type: "animate", args: [{ height: 300}, 1000]},
{sel: "#div3", type: "animate", args: [{ height: 25}, 1000]},
{sel: "#div3", type: "fadeOut", args: ["slow"]},
{sel: "#div4", type: "fadeOut", args: ["slow"]},
{sel: "#div1", type: "fadeOut", args: ["slow"]},
{sel: "#div5", type: "css", args: ["position", "absolute"], sync: true},
{sel: "#div5", type: "animate", args: [{ top: 500}, 1000]}
];
runSequence(commands);
Ed, ecco una demo funzionante di questa seconda opzione: http://jsfiddle.net/jfriend00/PEVEh/
http://cdmckay.org/blog/2010/06/22/how-to-use-custom-jquery-animation-queues/ – Brad