Techniquement, vous ne pouvez pas le faire comme vous l'avez modélisé dans votre code, car JavaScript est un thread unique et s'exécute généralement sur le thread de l'interface utilisateur du navigateur (ou de l'onglet) - toute mise en veille ou tout retard empêchera le navigateur de redessiner la page et empêchera également l'interaction de l'utilisateur avec la page.
Vous devez faire en sorte que le navigateur invoque périodiquement votre code. Quelque chose comme ceci fera l'affaire :
var objects = $.makeArray($( '.someClass' ));
var callback;
callback = function() {
var item = objects.shift();
// Do something with item.
if (objects.length != 0) {
setTimeout(callback, 5000);
}
}
setTimeout(callback, 5000);
Voir un exemple .
Cette solution suppose que vous souhaitez que chaque élément soit traité 5 secondes à partir du moment où le dernier élément a terminé son traitement. Cela signifie que :
- Si vous le faites
confirm()
ou autre pendant le traitement de chaque élément, l'élément suivant sera traité 5 secondes après la fermeture de la boîte de dialogue par l'utilisateur.
- Le temps d'exécution total sera de (5000N + T) où N est le nombre d'éléments de la liste initiale, et T le temps total nécessaire pour traiter chaque élément.
Voici une fonction que vous pouvez utiliser qui encapsule cette fonctionnalité :
jQuery.eachWithDelay = function(sequence, delay, callback) {
var objects = jQuery.makeArray(sequence);
if (objects.length == 0) {
return;
}
var f;
f = function() {
var item = objects.shift();
if (callback(item) && objects.length != 0) {
setTimeout(f, delay);
}
};
setTimeout(f, delay);
};
Appelé comme ça :
$.eachWithDelay($('.someClass'), 5000, function(item) {
// Do something with item
return true; // Return true to continue iterating, or false to stop.
});
Voir le mise à jour du violon .