Cela semble idiot, mais je n'arrive pas à trouver comment faire un appel de fonction asynchrone avec jQuery qui n'implique pas une requête côté serveur. J'ai une fonction lente qui itère à travers de nombreux éléments du DOM, et je veux que le navigateur ne se fige pas pendant l'exécution de cette fonction. Je veux afficher un petit indicateur avant que la fonction lente ne soit appelée, puis lorsque la fonction lente revient, je veux masquer l'indicateur. J'ai les éléments suivants :
$('form#filter', parentNode).submit(function() {
var form = $(this);
indicator.show();
var textField = $('input#query', form);
var query = jQuery.trim(textField.val());
var re = new RegExp(query, "i");
slowFunctionCall(); // want this to happen asynchronously; all client-side
indicator.hide();
return false;
});
Actuellement, je soumets le formulaire et l'indicateur ne s'affiche pas, le navigateur se fige, puis slowFunctionCall
est terminé.
Edit : J'ai utilisé La réponse de Vivin et plus particulièrement le Lien vers Sitepoint pour obtenir la solution suivante :
var indicator = $('#tagFilter_loading', parentNode);
indicator.hide();
var spans = $('div#filterResults span', parentNode);
var textField = $('input#query', parentNode);
var timer = undefined, processor = undefined;
var i=0, limit=spans.length, busy=false;
var filterTags = function() {
i = 0;
if (processor) {
clearInterval(processor);
}
indicator.show();
processor = setInterval(function() {
if (!busy) {
busy = true;
var query = jQuery.trim(textField.val()).toLowerCase();
var span = $(spans[i]);
if ('' == query) {
span.show();
} else {
var tagName = span.attr('rel').toLowerCase();
if (tagName.indexOf(query) == -1) {
span.hide();
}
}
if (++i >= limit) {
clearInterval(processor);
indicator.hide();
}
busy = false;
}
}, 1);
};
textField.keyup(function() {
if (timer) {
clearTimeout(timer);
}
/* Only start filtering after the user has finished typing */
timer = setTimeout(filterTags, 2000);
});
textField.blur(filterTags);
Cela permet d'afficher et de masquer l'indicateur et de ne pas geler le navigateur. Vous pouvez voir les éléments du DOM être cachés pendant qu'il fonctionne, ce qui est ce que je voulais.