Salve a tutti, sono nuovo del Forum e ho un problema con ajax che non riesco a risolvere. In pratica io eseguo una funzione javascript che fa una chiamata ajax di tipo sincrono, la quale interroga una servlet e al success mette dentro un div una tabella HTML. Però, prima
di fare questa chiamata, nello stesso div devo caricare un'immagine animata di loading che indica all'utente che la richiesta è in fase di elaborazione.
Qui sotto c'è il codice
<script>
function loadLista()
{
/* immagine di loading nel div con id = lista*/
document.getElementById('lista').innerHTML = '[img]images/ajax-loader.gif[/img]</img>';
/*imposto il timeout prima di chiamare la funzione load(), che è la funzione che effettua la
chiamata ajax; poi faccio il clearTimeout*/
var t = setTimeout("load();", 1);
clearTimeout(t);
}
function load()
{
/*chiamata ajax sincrona col prototype*/
var url = servletUrl;
new Ajax.Request(url, {
asynchronous: false,
method: 'post',
onSuccess: success,
onFailure: failure,
parameters: some parameters });
function success(xhr)
{ /*terminata l'elaborazione, metto nel div lista la tabella che mi faccio restituire
dalla servletUrl*/
document.getElementById('lista').innerHTML = xhr.responseText;
}
function failure()
{
alert("Request Failure");
}
}
</script>
Sostanzialmente il problema è questo:
se faccio la chiamata asincrona, tutto funziona a dovere e non ho bisogno di impostare alcun timeout prima della chiamata ajax, sicchè mi mostra prima l'immagine animata e alla fine la lista.
Se invece faccio una chiamata sincrona, il dilemma è il seguente:
-se non imposto il timeout, alla fine dell'elaborazione mi mostra la lista ma non mi fa vedere
l'immagine, ovvero non mi mostra quello che io gli chiedo prima della chiamata.
-se invece imposto il timeout, mi mostra prima l'immagine e successivamente la lista, ma
l'immagine viene mostrata come statica, perdendo la sua natura dinamica. In altre parole, il
setTimeout interferisce con l'animazione e tratta tutto come testo statico, ma senza il timeout, ovvero senza un'interruzione forzata del codice, non riesco a visualizzare la parte
prima della chiamata.
Ribadisco che questo accade con la chiamata sincrona e con IE e Chrome, mentre con FF
non serve li timeout. Io devo per forza usare la chiamata sincrona e mettere l'immagine
animata, e per quanto abbia provato non ho trovato una soluzione. Qualcuno mi sa dare
dei suggerimenti? Grazie anticipatamente