¿Cómo realizar una llamada ajax en la descarga de la página?
Tengo un tablero donde los usuarios pueden alternar algunos valores de input para configurar el aspecto de la página.
Quiero almacenar esos cambios en una tabla de database, de modo que cuando el usuario regrese, el panel aparece según la configuration de usuario específica recuperada de la database.
- ¿Cómo restablecer / borrar formulario dentro de mi create.js.erb?
- Ajax POST no envía datos cuando se llama a 'request.POST' en la vista de Django
- Formulario de vista parcial enviar a través de ajax para devolver vista parcial
- Largas conexiones AJAX fueron bloqueadas por Anti-Virus
- ¿Ventajas de COMET en encuestas de request largas?
- Varias requestes Ajax (con una callback)
Sé cómo enviar esos valores a DB y cómo recuperarlos
No quiero hacer llamadas ajax cada vez que el usuario cambie una configuration.
En cambio, creo que este senario sería mejor:
- Carga de página (recuperar configuration de DB si existe)
- El usuario alterna los elementos de configuration ui (por ejemplo, casillas de verificación, seleccionar etc.) y se producen los cambios apropiados en el lado del cliente (algunos divs se ocultan, otros se muestran, etc. y los valores de input de configuration se almacenan en un campo oculto), pero no se requiere una llamada ajax. lugar
- Cuando el usuario hace clic en un enlace a otra página, los valores de input de configuration (que se han almacenado en el campo oculto) se envían a la database mediante una llamada ajax.
MI PREGUNTA
Una solución (?) Sería el uso del evento onbeforeunload
como este:
window.onbeforeunload = function(e) { // Perform the ajax call return 'Do you want to save the configuration changes?'; };
Pero, si el browser del usuario previene las windows emergentes, ¿la function no se ejecutará?
¿Hay alguna forma de realizar una llamada ajax en onbeforeunload
evento onbeforeunload
de la onbeforeunload
, sin llamar a un cuadro de dialog?
2 Solutions collect form web for “¿Cómo realizar una llamada ajax en la descarga de la página?”
No. Durante la descarga, el browser matará todas las requestes pendientes. Entonces el AJAX podría o no llegar al server. Tampoco puede hacerlo dentro del controller del evento beforeunload
porque la primera A en AJAX significa: Asincrónico -> Simplemente ponga la request en la stack y eventualmente la ejecute. Por lo tanto, la request se examinará solo después de que el controller regrese. Pero muy pronto después de eso, el browser matará todo lo relacionado con la página.
La solución es enviar siempre actualizaciones al server mientras los usuarios realizan cambios. Ponlos en una table especial "temporal" desde la que puedes restaurar el estado más tarde.
También podría usar algo como localStorage
en el browser pero luego, los datos no se moverían con el usuario. Por ejemplo, si trabajaban en una tableta y se rompían o tenían una pérdida de potencia, podían moverse a su PC para continuar donde lo habían dejado.
No puede garantizar que una llamada Ajax se complete de esta manera, vea la respuesta de Aaron. Mi sugerencia sería usar algo como localStorage
para leer / escribir la configuration del usuario en su lugar.
Si necesita que la apariencia de un usuario persista en varios dispositivos, agregue una request periódica para leer / escribir las actualizaciones recientes de localStorage en la database central.