yo voy para hacer algunas suposiciones pesadas aquí, pero me parece que lo que está sucediendo es que, debido a que está bloqueando directamente el navegador con un procesamiento intenso inmediatamente después de haber configurado el elemento de la cortina, el navegador nunca tiene la oportunidad de sacar la cortina.
El navegador no se vuelve a dibujar cada vez que actualiza el DOM. Puede sentirse mal si está haciendo algo más y luego dibuja lo que necesita (los navegadores varían su método para esto). Por lo tanto, en este caso, puede refrescar la pantalla solo después de haber quitado la cortina, o ha forzado un redibujado desplazándose.
Una advertencia justa: este tipo de procesamiento intenso no es muy amable de su parte, ya que no solo bloquea su página. Debido a que los navegadores generalmente implementan solo una única secuencia de Javascript para TODAS las pestañas, su procesamiento bloqueará todas las pestañas abiertas (= el navegador). Además, se corre el riesgo de que el tiempo de espera de ejecución y el navegador simplemente detengan su script (esto puede ser de tan solo 5 segundos).
Aquí hay una forma de evitarlo.
Si puede dividir el procesamiento en trozos más pequeños, puede ejecutarlo con un tiempo de espera (para permitir que el explorador respire espacio). Algo como esto debería funcionar:
function processLoop(actionFunc, numTimes, doneFunc) {
var i = 0;
var f = function() {
if (i < numTimes) {
actionFunc(i++); // closure on i
setTimeout(f, 10)
}
else if (doneFunc) {
doneFunc();
}
};
f();
}
// add a curtain here
processLoop(function (i){
// loop code goes in here
console.log('number: ', i);
},
10, // how many times to run loop
function(){
// things that happen after the processing is done go here
console.log('done!');
// remove curtain here
});
Se trata esencialmente de un bucle de tiempo, pero cada iteración del bucle se realiza en un intervalo de tiempo para que el navegador tiene un poco de tiempo para respirar en el medio. Sin embargo, ralentizará el procesamiento, y cualquier trabajo posterior deberá pasar a una devolución de llamada ya que el ciclo se ejecuta independientemente de lo que pueda seguir la llamada a processLoop.
Otra variación de esto es configurar la cortina, llamar a su función de procesamiento con un setTimeout para permitir que el navegador abra la cortina, y luego eliminarla una vez que haya terminado.
// add a curtain
var curtain = document.body.appendChild(document.createElement('div'));
curtain.id = "curtain";
curtain.onkeypress = curtain.onclick = function(){ return false; }
// delay running processing
setTimeout(function(){
try {
// here we go...
myHeavyProcessingFunction();
}
finally {
// remove the curtain
curtain.parentNode.removeChild(curtain);
}
}, 40);
Si está utilizando una biblioteca js, es posible que desee ver una solución preparada para crear cortinas. Estos deberían existir para la mayoría de las bibliotecas, here is one for jQuery, y pueden ayudar con el CSS.
en mi caso, el punto 4 no funcionó. A través de jQuery hice que el ancho y el alto del div sean los de los padres, ¡y todo funciona muy bien !. Otros puntos completamente bien! – Neonamu