Newsgroup: it.comp.lang.javascript
Titolo: style.display="block" non funziona all'istante

Ho uno script la cui elaborazione impiega diversi secondi. Sulla pagina 
ho inserito un elemento (prima un'immagine, poi ho provato anche con un 
div) che avverte dell'elaborazione in corso. Nel codice html l'elemento 
è nascosto (display:none); all'inizio dello script ho iserito 
elem.style.display="block" e alla fine elem.style.display="none" ma 
l'elemento non ne vuole sapere di apparire. Ho provato a eliminare la 
regola display:none nel codice html, e l'elemento, che all'inizio è 
visibile nella pagina, scompare al termine dello script come dovrebbe 
scomparire; ma non riappare quando richiamo lo script una seconda volta. 
In pratica è come se (o forse E' che) style.display="block" non 
funzioni. Perché?

 Ho uno script la cui elaborazione impiega diversi secondi. Sulla pagina ...
 
hai provato con "inline-block"?
 
 
J.


Errori in console?
 
Un esempio di codice minimale che riproduca il problema?
 

 div) che avverte dell'elaborazione in corso. 
 
Ma intendi proprio un qualcosa del tipo:
 ...display:block
 ...codice
 ...display-none
?
 
Perché se hai fatto così non ti è chiaro come funziona: javascript (e non 
solo, praticamente tutti i linguaggi) non dà "tempo" al browser di 
aggiornarsi ... per dargli tempo devi per forza settare il display-block 
in una function, e poi richiamare la tua function con setTimeout (basta 1 
ms, giusto per dar tempo al browser di aggiornarsi prima che venga 
eseguita la tua function). In questo modo, dato che è mono-threading, 
eseguirà la tua display-block, poi aggiornerà quello che vedi nel 
browser, poi eseguirà la tua function.
 

 browser, poi eseguirà la tua function.
 
Niente, non riesco a venirne a capo. In base al tuo consiglio ho fatto così:
 
function chiamacerca() {
var wait=document.getElementById("wait");
wait.style.display="block";
//alert("!");
setTimeout(cerca(),1);
}
 
function cerca() {
...
var wait=document.getElementById("wait");
wait.style.display="none";
}
 
Però se non inserisco esplicitamente nel codice la riga con alert il 
refresh della pagina viene effettuato solo *dopo* il termine 
dell'esecuzione della funzione cerca(). Cioè l'elemento "wait" non viene 
mai visualizzato.
 

 mai visualizzato.
 
Perché in pratica era come se non avessi messo la chiamata a
`setTimeout`, continuando ad avere lo stesso problema di prima.

      setTimeout(cerca, 1);
 
Così sembra funzionare una volta su due, e la gif animata che ho 
inserito nel div praticamente è fissa. Non so se dipende dal fatto che 
il mio pc è molto vecchio e lento...

 il mio pc è molto vecchio e lento...
 
Può darsi. Se le operazioni che fai in quella funzione mettono a dura
prova le risorse della tua macchina, non ha sicuramente modo di
aggiornare a modo l'animazione della GIF (specialmente su certi Sistemi
Operativi e browser).
Considera inoltre che vi sono operazioni, specialmente in browser
vetusti – onestamente ignoro i browser moderni, credo di non usare più
una gif animata da sei anni – che interrompono eventuali gif animate e/o
suoni nella pagina (es. se clicchi su un link o fai il submit di una form).
 
Senza sapere che cosa fai in quella funzione è dura dirti di più, ma gli
scenari sopra elencati sono più o meno tutti validi.
 
 

 Operativi e browser).
 
Grazie delle informazioni. Dici che non usi più da tempo gif animate. 
Cosa proponi in alternativa? Io banalmente mi sono affidato a questo:
http://ajaxload.info/