Esto podría manejarse con solo una variable booleana, lo llamamos manipulación de bits sucios. Si ha observado, generalmente en páginas web, una vez que el usuario realiza alguna acción de edición en cualquiera de los campos, el formulario se considera sucio (editado) (incluso si los datos permanecen sin cambios después de la edición). Cuando el usuario intenta navegar fuera de la página, se le solicita al usuario si desea guardar los cambios.
Según la práctica estándar, no hay verificación si después de editar algún campo si el valor realmente se cambió o no. Por ejemplo: si el usuario edita y agrega 'xyz' a un campo de texto y luego borra 'xyz' esencialmente los datos del formulario siguen siendo los mismos que antes, pero el formulario todavía se considera 'sucio' y el usuario recibe un mensaje de advertencia cuando intenta alejarse
Por lo tanto, si desea implementar esto, las cosas se vuelven bastante simples. Simplemente necesitaría agregar los manejadores de eventos change() a los controles y establecer la variable booleana global algo así como "dirty" en "true" dentro de esos eventhandlers.
Una vez que el usuario desea navegar, puede mostrar un mensaje "Es posible que haya cambios no guardados en la página actual. ¿Desea guardarlos?". El usuario no se decepcionará, incluso si nota que su edición no cambió los datos iniciales.
Las respuestas dadas anteriormente implementan este mismo comportamiento. Y escribí esto porque parecía tener una idea para verificar cada campo por su valor inicial para ver si realmente se modificó después de la edición. Solo quería decirte que revisar todos los campos no es necesario en absoluto.
+1, Puede elaborar este para eliminar el caso de datos no cambia realmente - puede guardar el estado inicial y comparar a ella (caso onfocus uso para eso) y sólo a continuación, establecer la forma de "sucio" – Dror
Puede mejorar la primera línea: 'var $ inps = $ ('# myForm: input'), formAltered = false;' – ANeves