Hoy escribo sobre un tema bastante común que se tiene cuando se planea un sistema el cual tendrá algunas operaciones que ocupan realizarse con peticiones ajax y estas duraran bastante tiempo, y en ese tiempo debemos evitar que el usuario de nuevamente clic al botón que comenzó la petición ajax, para ello les mostrare como hacer rápidamente una ventana que bloquea la pantalla web.
En el siguiente código podemos observar dos funciones una de nombre jsRemoveWindowLoad() que solo sirve para quitar el div bloqueador que vamos a crear y la función jsShowWindowLoad() que prácticamente es la que abrirá el div el cual bloqueara nuestra pantalla.
function jsRemoveWindowLoad() { // eliminamos el div que bloquea pantalla $("#WindowLoad").remove(); } function jsShowWindowLoad(mensaje) { //eliminamos si existe un div ya bloqueando jsRemoveWindowLoad(); //si no enviamos mensaje se pondra este por defecto if (mensaje === undefined) mensaje = "Procesando la información&lt;br&gt;Espere por favor"; //centrar imagen gif height = 20;//El div del titulo, para que se vea mas arriba (H) var ancho = 0; var alto = 0; //obtenemos el ancho y alto de la ventana de nuestro navegador, compatible con todos los navegadores if (window.innerWidth == undefined) ancho = window.screen.width; else ancho = window.innerWidth; if (window.innerHeight == undefined) alto = window.screen.height; else alto = window.innerHeight; //operación necesaria para centrar el div que muestra el mensaje var heightdivsito = alto/2 - parseInt(height)/2;//Se utiliza en el margen superior, para centrar //imagen que aparece mientras nuestro div es mostrado y da apariencia de cargando imgCentro = "<div style='text-align:center;height:" + alto + "px;'><div style='color:#000;margin-top:" + heightdivsito + "px; font-size:20px;font-weight:bold'>" + mensaje + "</div><img src='img/load.gif'></div>"; //creamos el div que bloquea grande------------------------------------------ div = document.createElement("div"); div.id = "WindowLoad" div.style.width = ancho + "px"; div.style.height = alto + "px"; $("body").append(div); //creamos un input text para que el foco se plasme en este y el usuario no pueda escribir en nada de atras input = document.createElement("input"); input.id = "focusInput"; input.type = "text" //asignamos el div que bloquea $("#WindowLoad").append(input); //asignamos el foco y ocultamos el input text $("#focusInput").focus(); $("#focusInput").hide(); //centramos el div del texto $("#WindowLoad").html(imgCentro); }
La funcionalidad de jsShowWindowLoad() sirve para mostrar un div encima de todos los controles en pantalla, este div aparece al momento de ejecutar dicha función, y este div puede desaparecer al invocar la otra función de nombre jsRemoveWindowLoad(). Para entender la funcionalidad de jsShowWindowLoad() anexe comentarios explicando parte por parte. Esto es lo que hace el javascript pero en cuanto a css ocuparemos el siguiente código para que nuestro div aparesca encima y con un estilo más estético:
#WindowLoad { position:fixed; top:0px; left:0px; z-index:3200; filter:alpha(opacity=65); -moz-opacity:65; opacity:0.65; background:#999; }
Este código lo que hace es poner el div encima de todos los controles, además de dar una opacidad para así aun se vea lo que está detrás.
Para ver un ejemplo funcionando dar clic aqui.
Espero les sea de ayuda.