ventanas - La ventana emergente Vaadin JavaScript solo funciona la primera vez en cada sesión
ventana pop up html5 (2)
Ahora he encontrado la respuesta a mi problema. Esencialmente, estaba llamando al método JavaScript.exectute () de Vaadin desde un ScheduledExecutorService. A JavaScript no le gusta que lo llamen de forma asíncrona, por lo que hice que se llamaran los métodos necesarios dentro de un bloque UI.getCurrent (). Access (). Tenía la impresión de que esto causaría que el código de JavaScript necesitase ejecutarse sincrónicamente en el hilo de la interfaz de usuario. Aparentemente este no fue el caso.
Moviendo mis llamadas a javascript.execute () fuera del ejecutor y al hilo principal he resuelto mi problema , ya que en mi caso es aceptable que mi JavaScript se ejecute sincrónicamente. Buscaré más en el método UI.access () para ver si el comportamiento que esperaba funcionaba y, de no ser así, si hay alguna alternativa mejor para ejecutar el JavaScript en un entorno asíncrono. Espero agregar esta información a mi respuesta si encuentro algo útil.
Tengo una aplicación que requiere que se limpie un proceso independientemente de cómo el usuario salga de la página. Estoy usando JavaScript para detectar cuando el usuario sale de la página a través de la pestaña o el cierre del navegador, y muestra una ventana emergente para asegurarse de que se detendrá el proceso actual. Esta pregunta se refiere solo a la ventana emergente, ¡solo quería aclarar por qué necesitaba una!
Cuando el usuario presiona un botón para iniciar el proceso, se llama al siguiente código:
JavaScript.getCurrent().execute(
"var beforeCloseListener = function (e) { var e = e || window.event; var message = " + LEAVE_PAGE_MESSAGE + "; if(e) e.returnValue = message; return message; } " +
"window.addEventListener(''beforeunload'', beforeCloseListener);"
);
Este código crea una ventana emergente cuando el usuario intenta cerrar el navegador. ¡Excelente! La siguiente captura de pantalla muestra que puedo encontrar el método en las herramientas de desarrollo de Chrome.
Herramientas de desarrollo de Chrome javascript search 1st try
Sin embargo, si el usuario decide volver a iniciar el navegador y navegar a la misma página, y hacer clic en el botón otra vez, cuando intenta cerrar el navegador, no se le presenta con la ventana emergente.
Este código definitivamente se llama nuevamente, pero el javascript no parece estar realmente conectado. En las herramientas para desarrolladores de Chrome, ya no puedo ver el método cuando realizo la búsqueda.
Herramientas de desarrollo de Chrome javascript search 2nd try
Mi conocimiento de Vaadin y JavaScript es bastante principiante, así que podría perder algo en el ciclo de vida de cualquiera de los dos, pero mi pregunta es, ¿por qué el JavaScript no se compilaría en mi aplicación la segunda vez, pero funcionaría perfectamente la primera vez? Siento que hay alguna característica de Vaadin que me falta aquí.
Este comportamiento parece ser el mismo si llamo o no al método removeEventListener apropiado. Aunque como en mi otra pregunta relacionada , no creo que mi removeEventListener se dispare correctamente.
Nota: este comportamiento es el mismo en todos los navegadores en los que he probado; Firefox, Chrome, Safari y Opera.
Esta podría ser una sesión larga, sin embargo tuve el mismo problema con Vaadin hace unos meses. Lo que funcionó para mí fue asignar función a la variable y luego pasarla a la otra función. Cambie su código a este y pruebe:
JavaScript.getCurrent().execute(
"someGlobal = function beforeCloseListener(e) { var e = e || window.event; var message = " + LEAVE_PAGE_MESSAGE + "; if(e) e.returnValue = message; return message; } " +
"window.addEventListener(''beforeunload'', someGlobal);"
);