JavaScript - Ejecutar script antes de cerrar ventana

 
Vista:
sin imagen de perfil

Ejecutar script antes de cerrar ventana

Publicado por Jose (2 intervenciones) el 17/04/2016 11:37:26
Hola a todos, a ver si alguien me pudiera ayudar que llevo una semana bloqueado con este tema, por favor. Necesito ejecutar un script antes de cerrar la ventana para que me envie un formulario y así guardar los datos.

tengo esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<form name="crono" role="form" method="POST" action="graba_actividad.php">
<input type="hidden" name="id_titulo" id="id_titulo" value="<?php echo $id; ?>">
<input type="hidden" name="id_dist" id="id_dist" value="<?php echo $id_dist; ?>">
<input type="hidden" name="id_usuario" id="id_usuario" value="<?php echo $id_usuario; ?>">
<input type="hidden" name="boton" id="boton" value="00:00:00">
<!-- <INPUT TYPE="button" VALUE="Start" onClick="sigue()"> -->
<!-- <INPUT TYPE="button" VALUE="Stop" onClick="para()"> -->
<button type="hidden" class="btn btn-primary" value="Guardar Datos" name="B1">Guardar</button>
</form>
 
<script>
 /* grabar tiempos antes de salir */
window.onbeforeunload = function() {
    guardar_tiempos();
    return null;
}
 
function guardar_tiempos(){
	document.getElementsByName("crono")[0].submit();
}
</script>
<button onClick="guardar_tiempos();"/>guardarlo</button>
<script>

... el envío del formulario y el procesado en la otra página funciona correctamente siempre que lo haga por botón, pero no consigo que ejecute la función guardar_tiempos antes de cerrar la ventana.

Creo que casi lo tengo, pero me falta algo.

Muchas gracias por adelantado.

Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 3.162
Oro
Ha mantenido su posición en JavaScript (en relación al último mes)
Gráfica de JavaScript

Ejecutar script antes de cerrar ventana

Publicado por xve (2100 intervenciones) el 17/04/2016 19:20:49
Hola Jose, creo que esto no te funcionara, ya que lo que quieres, es que refresque la página enviando los valores del formulario, y creo que ningún navegador lo ara, ya que antes de refrescar la pagina ya se ha cerrado.

La única manera que se me ocurre, es que lo hagas por AJAX sin esperar ninguna contestación del servidor...

Coméntanos si con AJAX te funciona, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ejecutar script antes de cerrar ventana

Publicado por Jose (2 intervenciones) el 17/04/2016 20:19:51
Gracias xve, lo que habia probado con ajax es esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<form name="crono" role="form" method="POST" action="graba_actividad.php">
<input type="hidden" name="id_titulo" id="id_titulo" value="<?php echo $id; ?>">
<input type="hidden" name="id_dist" id="id_dist" value="<?php echo $id_dist; ?>">
<input type="hidden" name="id_usuario" id="id_usuario" value="<?php echo $id_usuario; ?>">
<input type="hidden" name="boton" id="boton" value="00:00:00">
<!-- <INPUT TYPE="button" VALUE="Start" onClick="sigue()"> -->
<!-- <INPUT TYPE="button" VALUE="Stop" onClick="para()"> -->
<button type="hidden" class="btn btn-primary" value="Guardar Datos" name="B1">Guardar</button>
</form>
 
<script>
$(document).ready(function(){
$.ajax({
type: "POST",
url: "graba_actividad.php",
data: "id_titulo=<?php echo $id; ?>&id_dist=<?php echo $id_dist; ?>&id_usuario=<?php echo $id_usuario; ?>&boton=cad",
success: function(datos){
alert("datos enviados"+datos);
}
});
})
</script>

... pero lo aquí los problemas que me da son dos, uno que me envía el cuestionario según carga la página y el segundo que no me manda la variable de js que seria la del tiempo 00:00:00 (solo me manda el texto) que se actualiza de este script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<script>
/* cronometro */
horas=0; minutos=0; segundos=0;
puntos=true;
function Tiempo() {
if(puntos) ++segundos;
if(segundos==60) { segundos=0; ++minutos }
if(minutos==60) { minutos=0; ++horas }
if(horas==24) horas=0;
cad="";
if(horas<10) cad+="0";
cad+=horas;
if(puntos) cad+=":"; else cad+=" ";
if(minutos<10) cad+="0";
cad=cad+minutos;
if(puntos) cad+=":"; else cad+=" ";
if(segundos<10) cad+="0";
cad=cad+segundos;
puntos=!puntos;
document.crono.boton.value=cad;
}
var id;
//function sigue() { id=setInterval("Tiempo()",500) }
//function para() { clearInterval(id) }
 
</script>

... estoy bloqueado, venga un ayudita que casi lo tengo. Muuuuchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 10
Ha aumentado su posición en 10 puestos en JavaScript (en relación al último mes)
Gráfica de JavaScript

Ejecutar script antes de cerrar ventana

Publicado por deo (23 intervenciones) el 18/04/2016 12:20:40
1º) Francamente lo veo un poco lioso, falta de uniformidad. P.Ej:

<input type="hidden" name="id_titulo" id="id_titulo" value="<?php echo $id; ?>">
<input type="hidden" name="id_dist" id="id_dist" value="<?php echo $id_dist; ?>">

- ¿Que es $id, $id_dist? lo uniforme sería algo como: $id_titulo, $id_dist?: ¿seguro que es lo que pretendes?
- ¿Para que enviar value="<?php echo $id; ?>" a un php?
No sería mejor algo como: value=" $id" (o lo que deba ser..) y que sea luego el .php quien gestione los detalles?

En fin, hay muchas formas de hacerlo pero con Js conviene ser muy ordenado que si no las lia...
En todo caso mi sugerencia es la 2º:

2º) Hasta donde sé, puedes enviar varias instrucciones de un tiro (lo he visto en algún sitio aunque no es frecuente):
Seria algo como:
<form name="crono" role="form" method="POST" action="hazlo_Primero();graba_actividad_Despues.php">

<script>
hazlo_Primero = function(){
// Esto deberia hacerlo antes de la segunda instruccion: graba_actividad_Despues.php
}
</script>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar