2010-02-09 25 views
36

¿Es posible impedir que los usuarios cierren la ventana con el botón de salida [X]? De hecho, estoy proporcionando un botón de cierre en la página para que los usuarios cierren la ventana. Básicamente, lo que trato de hacer es obligar a los usuarios a completar el formulario y enviarlo. No quiero que cierren la ventana hasta que lo hayan enviado. .cómo bloquear a los usuarios para que no cierren una ventana en javascript?

chicos, realmente aprecio tus comentarios, no estoy pensando en alojar en ningún sitio web comercial. Es algo interno, en realidad estamos consiguiendo que todo el personal participe en esta encuesta que hemos diseñado .... sé que no de la manera correcta, pero me preguntaba si había una solución al problema que tenemos aquí ...

+42

gracias a Dios la respuesta es no. –

+13

Querido Dios, espero que eso no sea posible. – FrustratedWithFormsDesigner

+6

No quiero que mi ventana intente forzarme a enviar algún formulario. Asesinar el proceso del navegador es una manera que no podrá evitar con javascript – Natrium

Respuesta

69

Eche un vistazo a onBeforeUnload.

No obligará a alguien a quedarse pero les pedirá que pregunten si realmente quieren irse, que es probablemente la mejor solución de navegador cruzado que puede administrar. (Similar a este sitio si intenta salir de mediados de respuesta.)

<script language="JavaScript"> 
    window.onbeforeunload = confirmExit; 
    function confirmExit() { 
     return "You have attempted to leave this page. Are you sure?"; 
    } 
</script> 

Editar: La mayoría de los navegadores ya no permiten un mensaje personalizado para onbeforeunload.

ver este bug report desde el 18 de febrero de 2016.

diálogos onbeforeunload se usan para dos cosas en la Web moderna:
1. La prevención de los usuarios a partir de datos sin querer perder.
2. Estafadores de usuarios.

En un intento de restringir su uso para este último sin detener el primero, no vamos a mostrar la cadena proporcionada por la página web.En cambio, vamos a usar una cadena genérica.

Firefox ya lo hace [...]

+6

¡Ahora esto no es tan malo! – FrustratedWithFormsDesigner

+1

Esto no funcionará en Opera, ya que no se activa antes de descargar eventos. –

+14

* sacude el puño * en Opera. – Pool

0

Bueno, puede usar el evento window.onclose y devolver false en el controlador de eventos.

function closedWin() { 
    confirm("close ?"); 
    return false; /* which will not allow to close the window */ 
} 
if(window.addEventListener) { 
    window.addEventListener("close", closedWin, false); 
} 

window.onclose = closedWin; 

El código fue tomado desde this site.

Por otro lado, si fuerzan el cierre (mediante el uso del administrador de tareas o algo así) no puede hacer nada al respecto.

+0

No creo que esto funcione con muchos navegadores. –

+2

Si funciona * lo llamaría un error en el navegador. –

8

qué vas a hacer cuando un usuario pulsa ALT + F4 o cierra desde el Administrador de tareas

¿Por qué no llevar un registro si no se completan en una galleta o la base de datos y cuando visitar la próxima vez solo devuelva la misma pantalla ...: BTW ... no ha terminado de llenar este formulario ... "

Por supuesto, si estuviera cerca antes del busto de las puntocom, recordaría las tormentas porno, donde si cerraba 1 ventana 15 se abrirán otros ... así que sí, hay un código que detectará un cierre de ventana, pero si presiona ALT + F4 dos veces, cerrará el elemento secundario y el principal (si fuera una ventana emergente)

+1

En primer lugar, por supuesto, este tipo de "característica" no se debe abusar. Siempre existe la posibilidad de que la acción que necesita confirmarse/posponerse sea crítica y/o sensible al tiempo. Por ejemplo, banca en línea. Presento una transacción de "pago de facturas" para un pago que debe iniciarse hoy. Me muestran una página de revisión/confirmación donde puedo 'Editar',' Confirmar', o 'Cancelar'. Paso a otra pestaña del navegador y cierro inadvertidamente el navegador. Necesito que se muestre la página bancaria y avisarme que se requiere confirmación. Esperar hasta la próxima semana cuando abra billpay nuevamente no es ideal. –

1

No es una buena práctica forzar al usuario a hacer algo que no necesariamente quiere hacer. Nunca puedes evitar que cierren el navegador.

Puede lograr un efecto similar, sin embargo, haciendo un div en su página web actual para sobreponer el resto de sus controles para que su formulario sea lo único accesible.

+4

Ugh eso también es extremadamente molesto. Es una excelente manera de garantizar que no vuelvo a un sitio. – FrustratedWithFormsDesigner

+1

Es molesto, estoy de acuerdo. Pero es mejor que forzarme a cerrar mi navegador con un administrador de tareas. Acabo de cerrar la pestaña molesta, en su lugar. –

2

Esto hará que aparezca un cuadro de diálogo preguntando al usuario si realmente quiere cerrar o quedarse, con un mensaje.

var message = "You have not filled out the form."; 
window.onbeforeunload = function(event) { 
    var e = e || window.event; 
    if (e) { 
     e.returnValue = message; 
    } 
    return message; 
}; 

A continuación, puede desarmar antes de que el formulario se presentó o algo más con

window.onbeforeunload = null; 

Tenga en cuenta que esto es extremadamente molesto. Si intenta obligar a sus usuarios a completar un formulario que no desean completar, fracasará: encontrarán la manera de cerrar la ventana y nunca volverán a su sitio web malo.

2

Si envía una encuesta interna que requiere el 100% de participación de los empleados de su compañía, entonces una mejor ruta sería simplemente mantener el formulario de seguimiento del ID/nombre de usuario/correo electrónico etc. Cada pocos días más o menos solo envíe un pequeño y agradable recordatorio por correo electrónico a los miembros de su organización para completar la encuesta ... incluso podría automatizarlo.

+0

Estoy bastante seguro de que hay muchos sistemas de levantamiento preconstruidos que ya son capaces de esto (no estoy seguro si son muchos $$, pero ese es otro tema). – FrustratedWithFormsDesigner

+0

en realidad estábamos dependiendo de este sistema de levantamiento preconstruido, pero ha demostrado ser inútil ... así que estaba pensando en una forma más fácil de hacerlo, pero de todos modos gracias por sus comentarios .... – manraj82

1

¿Qué tal eso?

function internalHandler(e) { 
    return "Please don't leave our page ever!"; 
} 

if (window.addEventListener) { 
    window.addEventListener('beforeunload', internalHandler, true); 
} else if (window.attachEvent) { 
    window.attachEvent('onbeforeunload', internalHandler); 
} 
6

Si no desea mostrar emergente para todo evento puede agregar condiciones como

window.onbeforeunload = confirmExit; 
    function confirmExit() { 
     if (isAnyTaskInProgress) { 
      return "Some task is in progress. Are you sure, you want to close?"; 
     } 
    } 

Esto funciona muy bien para mí

+1

Lo he probado en IE8, Firefox y Chrome, está funcionando bien. – Imam

Cuestiones relacionadas