2011-11-24 12 views
7

Necesito detectar datos no guardados en el formulario cuando el usuario abandona la página sin enviar el formulario. Me gustaría implementar eso sin agregar un oyente de cambio de valor a cada entrada.¿Cómo detectar datos no guardados en el formulario cuando el usuario abandona la página?

Este es el requisito funcional:

"usuario abre una página que haga clic en cualquier enlace si los valores en la página cambiaron un mensaje emergente de alerta para notificar al usuario que necesita para guardar los datos cambiados, pero si lo hizo no cambiar ningún sistema de cosas sin notificar al usuario ".

Traté de comparar el método de matriz para comparar ambos DTO viniendo para DB y el enlace DTO, pero me da muchos problemas en la longitud de la matriz, y la comparación de bytes.

+0

duplicado posible de [Avisar al usuario de los datos no guardados en JSF] (http://stackoverflow.com/questions/5709356/warn-user-of-unsaved-data-in-jsf) –

Respuesta

17

Esto normalmente se implementa en el lado del cliente con la ayuda de JavaScript, porque no es muy posible interceptar el evento beforeunload desde el lado del servidor cuando el usuario final abandona la página.

Aquí está un ejemplo concreto con la ayuda de la biblioteca de JavaScript jQuery (de lo contrario podría terminar con 10 veces más código para hacerlo correctamente crossbrowser compatible y trabajar juntos sin problemas con el Ajax vuelve a renderizar):

<script src="http://code.jquery.com/jquery-latest.min.js"></script> 
<script> 
    $(function() { 
     // Set the unload message whenever any input element get changed. 
     $(':input').on('change', function() { 
      setConfirmUnload(true); 
     }); 

     // Turn off the unload message whenever a form get submitted properly. 
     $('form').on('submit', function() { 
      setConfirmUnload(false); 
     }); 
    }); 

    function setConfirmUnload(on) { 
     var message = "You have unsaved data. Are you sure to leave the page?"; 
     window.onbeforeunload = (on) ? function() { return message; } : null; 
    } 
</script> 

Simplemente pegue esto en su plantilla <h:head> o simplemente póngalo en algún archivo script.js que incluya por <h:outputScript>.

+0

Gracias, por su respuesta, pero el script de Jquery tiene los siguientes problemas ----------- $ (': input'). on ('change', function() ---- no es una función, lo cambié a por lo siguiente --------------- $ (': input'). change (function() en ambos controladores de llamadas, me gustaría preguntar por qué la solución del lado del servidor no es buena Además, ¿cómo puedo cambiar el mensaje para que sea un mensaje personalizado? Muchas gracias –

+2

Está utilizando una versión obsoleta de jQuery. Actualice jQuery a la última, o use '.live()' en lugar de '.on() '.El' .change() 'no funcionará correctamente si está usando JSF ajax para actualizar campos. La solución del lado del servidor es overcom complicada y casi imposible de implementar para cubrir todos los comportamientos posibles del cliente. Cambiar el mensaje es fácil, simplemente edite el 'var message'. – BalusC

+1

¿Cómo podemos internacionalizar el mensaje en su código? – Kayser

0

Esto funcionó para mí.

$(function() { 
      // Set the unload message whenever any input element get changed. 
      $('input').change(function() { 
       setConfirmUnload(true); 
      }); 

      // Turn off the unload message whenever a form get submitted properly. 
      $('form').submit(function() { 
       setConfirmUnload(false); 
      }); 
     }); 

     function setConfirmUnload(on) { 
      var message = "You have unsaved data. Are you sure to leave the page?"; 
      window.onbeforeunload = (on) ? function() { return message; } : null; 
     } 
Cuestiones relacionadas