JavaScript - "Uncaught TypeError: Cannot set property 'value' of undefined at cerrando" dentro de setTimeout

   
Vista:

"Uncaught TypeError: Cannot set property 'value' of undefined at cerrando" dentro de setTimeout

Publicado por Alberto (7 intervenciones) el 11/02/2018 00:13:20
Buenas tardes amigo, ando haciendo un ejercicio con setTimeout.
Consiste en hacer que aparezca una ventana y luego de un tiempo desaparezca (listo y probado).
El punto es que quiero que el boton cambie de texto cada vez que ocurran estos eventos y me bota un error al final cuando intenta cambiar el nombre nuevamente:

"Uncaught TypeError: Cannot set property 'value' of undefined at cerrando"

Les comparto el código a ver si pueden ayudarme.

HTML--------------------------------------------------------------------------------------------

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Cerrar ventana</title>
</head>
<body>
	<input type="button" id="activador" value="Haz click para abrir ventana">
	<script src="Cerrar ventana automaticamente.js"></script>
</body>
</html>

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
27
28
29
30
31
32
33
34
35
36
37
38
39
const botonqueaccionatodo = document.getElementById("activador");
var ventana;
const tiempo = 4000; // tiempo dado en milisegundos
 
class accion
{
	constructor(elemento)
	{
		this.elemento = elemento;
		this.elemento.value = "Haz click para abrir ventana";
		this.avisaQuePasa = false;
		this.elemento.addEventListener("click", this.DandoClick.bind(this));
	}
 
	DandoClick(e)
	{
		ventana = window.open("", "", "width=500, height=500");
		this.avisaQuePasa = !this.avisaQuePasa;//cambia el estado y avisa si la ventana está abierta. El signo ! es para cambiar de estado
		this.cambiaTextoApareceYQuitaVentana();
	}
 
	cambiaTextoApareceYQuitaVentana()
	{
		this.elemento.value = "Abriste la ventana";
		if(this.avisaQuePasa == true)
		{
			this.avisaQuePasa = !this.avisaQuePasa;
 
			setTimeout(function cerrando(){// establecemos el tiempo de duración en el que la ventana estará abierta
			this.elemento.value = "Haz click para volver a abrir ventana";
			ventana.close();//cerrando ventana
			}, tiempo);
		}
		//this.elemento.value = "Haz click para volver a abrir ventana";
 
	}
}
 
const intercambia = new accion(botonqueaccionatodo);
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

"Uncaught TypeError: Cannot set property 'value' of undefined at cerrando" dentro de setTimeout

Publicado por xve (2046 intervenciones) el 11/02/2018 13:32:09
Hola Alberto, ese problema, es porque cuando se ejecuta el setTimeout(), el this ya no existe...

Cambia tu función:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cambiaTextoApareceYQuitaVentana()
{
	this.elemento.value = "Abriste la ventana";
	if(this.avisaQuePasa == true)
	{
		this.avisaQuePasa = !this.avisaQuePasa;
 
		setTimeout(function cerrando(){// establecemos el tiempo de duración en el que la ventana estará abierta
		this.elemento.value = "Haz click para volver a abrir ventana";
		ventana.close();//cerrando ventana
		}, tiempo);
	}
	//this.elemento.value = "Haz click para volver a abrir ventana";
 
}

por esta (fijate en las negritas):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cambiaTextoApareceYQuitaVentana()
{
	var that=this;
	this.elemento.value = "Abriste la ventana";
	if(this.avisaQuePasa == true)
	{
		this.avisaQuePasa = !this.avisaQuePasa;
 
		setTimeout(function cerrando(){// establecemos el tiempo de duración en el que la ventana estará abierta
			that.elemento.value = "Haz click para volver a abrir ventana";
			ventana.close();//cerrando ventana
		}, tiempo);
	}
	//this.elemento.value = "Haz click para volver a abrir ventana";
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

"Uncaught TypeError: Cannot set property 'value' of undefined at cerrando" dentro de setTimeout

Publicado por Alberto (7 intervenciones) el 11/02/2018 16:05:41
Amigo, muchas gracias.
Tenías razón. Ahora si trabaja como debe ser.

Muchas gracias de ante mano ...

Posdata: No sé como calificar las preguntas
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
Revisar política de publicidad