Foros del Web » Programando para Internet » Javascript »

Darle valor a variables globales desde una función

Estas en el tema de Darle valor a variables globales desde una función en el foro de Javascript en Foros del Web. Buenas tardes, Mi problema es el siguiente, quiero tener la hora a la que se ha entrado en la aplicación, para ello tengo 3 variables ...
  #1 (permalink)  
Antiguo 11/06/2008, 11:18
 
Fecha de Ingreso: noviembre-2006
Mensajes: 46
Antigüedad: 17 años, 5 meses
Puntos: 0
Darle valor a variables globales desde una función

Buenas tardes,

Mi problema es el siguiente, quiero tener la hora a la que se ha entrado en la aplicación, para ello tengo 3 variables globales definidas al principio del archivo javascript:

var hora_global;
var minuto_global;
var segundo_global;

Las inicializo dentro de la primera función que se va a usar:
Código:
var fecha = new Date();
hora_global =fecha.getHours();
minuto_global = fecha.getMinutes();
segundo_global = fecha.getSeconds();
El problema es que cuando quiero usarlas en una función al final de la aplicación, el valor que tienen las variables globales es "undefined".


Si las variables la inicializo al principio del fichero cuando las declaro, entonces cuando al final de la aplicación quiero recuperar la hora en la que ha entrado, no me da la hora inicial, me da la hora actual, porque las variables al no estar dentro de ninguna función, pues cada vez que llamas a este fichero.js se actualiza...

¿Como puedo darle a unas variables globales un valor desde dentro de una función?

Gracias!
  #2 (permalink)  
Antiguo 11/06/2008, 11:29
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Darle valor a variables globales desde una función

Hola:

La inicialización solo deberías hacerla una vez... y sus valores no deberían variar... y para obtener esos valores desde una función, la única condición es que no exista una variable con el mismo nombre dentro de la función. Si existieran esas variables (si tú mismo programas en tu página, deberías controlarlo), puedes obtener/modificar las variables globales considerándola como un atributo del objeto window:

var hola = "pepe";
function distinto() {
var hola = "caricatos";
alert(hola + " != " + window.hola);
}

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 11/06/2008, 12:49
 
Fecha de Ingreso: noviembre-2006
Mensajes: 46
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Darle valor a variables globales desde una función

En la función donde los inicializo no hay más variables con ese nombre.

Te explico lo que quiero con tu ejemplo:

var hola;
function distinto() {
hola = "caricatos";
}

function final(){
//¿Qué puedo para que aquí, dentro de esta función, el valor de hola sea "caricatos"?
Porque a mí me dice que hola = "undefined" dentro de esta función...
}

Muchas gracias!
  #4 (permalink)  
Antiguo 12/06/2008, 00:34
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Darle valor a variables globales desde una función

Hola:

Tu ejemplo es correcto, y si llamas a la función distinto() antes de final(), el valor que tendrá esa variable será la asignada en distinto... Asegúrate de que ejecutas las funciones en el orden correcto. y dentro de final no tengas otra variable del mismo nombre.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #5 (permalink)  
Antiguo 12/06/2008, 03:17
 
Fecha de Ingreso: noviembre-2006
Mensajes: 46
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Darle valor a variables globales desde una función

Hola,

Pues no funciona...

El valor de esas variable en la función final es "undefined"...

Hay alguna otra manera de crear variable globales?

Muchas gracias,

Un saludo
  #6 (permalink)  
Antiguo 12/06/2008, 03:29
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Darle valor a variables globales desde una función

Hola:

Tal como lo has puesto y te he comentado te puedo asegurar que funciona:
Código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>
	http://www.caricatos.net/probador
</title>
<script type="text/javascript">
var hola;
function distinto()	{
	hola = "caricatos";
}
function final()	{
	alert(hola);
}
distinto();
final();
</script>
</head>
<body>
	<p>
		Ejemplo chequeado en el faluloso
		<a href="http://www.caricatos.net/probador/index.php">probador</a>
		de caricatos.
	</p>
</body>
</html>
Copia el texto del recuadro y pégalo en el textarea de la pestaña "Editar" de esta página: Probador de scripts, y luego pincha en la pestaña "Resultado", y dime que alerta muestra...

Si lo haces de otra manera podría dar otro resultado.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #7 (permalink)  
Antiguo 12/06/2008, 04:39
 
Fecha de Ingreso: noviembre-2006
Mensajes: 46
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Darle valor a variables globales desde una función

Ah vale vale,

Es que yo tengo las funciones dentro de un archivo .js y este archivo .js no tiene nada de etiquetas de HTML...

Es decir, yo en mi archivo .js tengo directamente las variables globales y las funciones, sin tener ninguna etiqueta HTML... y así me funcionaba perfectamente todas las funciones hasta que he querido poner variables globales, que claro, no las leía...

Voy a meterlo todo dentro de un HTML y a ver si así funciona...

Muchas muchas gracias!

Un saludo
  #8 (permalink)  
Antiguo 12/06/2008, 13:25
 
Fecha de Ingreso: noviembre-2006
Mensajes: 46
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Darle valor a variables globales desde una función

Hola,

No funciona, pero a ver... mi archivo es .js, y los archivos .js no pueden llevar etiquetas HTML...

Resumiendo esto es un ejemplo de mi archivo.js:

var hora_global;
var minuto_global;
var segundo_global;

function inicializa_hora()
{
var fecha = new Date();
hora_global =fecha.getHours();
minuto_global = fecha.getMinutes();
segundo_global = fecha.getSeconds();
}


function mostrar_hora()
{
//Las variables hora_global, minuto_global y segundo_global me dice que su valor es "undefined"
}



A las funciones se les llama desde otros archivos HTML,y funcionaba todo perfectamente hasta que he querido declarar esas 3 variables como globales para saber la hora a la que se inicia la aplicación.

Qué puedo hacer para que en la función mostrar_hora() las variables tengan el valor que se le ha dado en inicializa_hora() ? la única solución es meterlo dentro de un HTML, no?

Muchas gracias!

Saludos

Última edición por anac; 12/06/2008 a las 13:34
  #9 (permalink)  
Antiguo 12/06/2008, 23:12
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Darle valor a variables globales desde una función

Hola:

Dentro de cualquier página (si no hay página no hay javascript), puedes poner en la cabecera algo así:

<head>
<!-- detrás de las definiciones existentes... -->
<script type="text/javascript" >
window.onload = inicializa_hora;
</script>
</head>

Y si ya está definido el evento load, añadirlo en la función que ya ejecute.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #10 (permalink)  
Antiguo 13/06/2008, 04:42
 
Fecha de Ingreso: noviembre-2006
Mensajes: 46
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Darle valor a variables globales desde una función

Hola,

A la función Inicializa_hora() la llamo desde un HTML y funciona (lo he comprobado, me muestra la hora correctamente, por ejemplo las 12:35), (a esa función no la tengo que llamar desde dentro del .js, ese no es el problema)

El problema es que después cuando llamo a la función "mostrar_hora()" me dice que la hora inicial es undefined! cuando SÍ ha sido inicializada... porque un rato antes desde la función inicializa_hora() me ha dicho correctamente que eran las 12:35.


Sobre lo que tu me dices tengo una pregunta, tal y como tu me estás diciendo que lo haga, que es con etiquetas HTML, ¿tengo que guardar ese archivo como .html o como .js?

Yo ahora lo tengo como .js y al principio cuando solo tenia funciones, me iba todo correctamente, al poner esas variables globales y querer inicializarlas en una función y mostrarlas en otra es cuando no va...


Muchas gracias,

Un saludo,
  #11 (permalink)  
Antiguo 13/06/2008, 06:04
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Darle valor a variables globales desde una función

Hola anac:

Como te dice caricatos (), su script funciona.


Tienes que cerciorarte de que llamas a inicializar_hora() antes que mostrar_hora(), sino es lógico y normal que las variables no tengan valor aún:

Código PHP:
var hora_global;
var 
minuto_global;
var 
segundo_global;

function 
inicializa_hora() {
    var 
fecha = new Date();
    
hora_global =fecha.getHours();
    
minuto_global fecha.getMinutes();
    
segundo_global fecha.getSeconds();
}


function 
mostrar_hora() {
    
alert("hora_global = "+hora_global+"\rminuto_global = "+minuto_global+"\rsegundo_global = "+segundo_global);
}

mostrar_hora();     // no tienen valor
inicializa_hora();     // inicializamos su valor
mostrar_hora();     // deben tener valor 
Da igual que tus archivos estén dentro de un documento html o uno js, pero sólo has de fijarte en eso: Haberles dado a tus variables valor antes de leerlas (esto incluye tener cuidado con cuándo se ejecutan tus funciones: si es cuando se está cargando la página, o en el window.onload o en algún evento disparado).


También por si acaso revisa que no tocas esas variables de nuevo en el script, no vaya a ser que las vuelvas a inicializar dentro de la función desde la que la llamas o... Este ejemplo devolverá las dos veces undefined:

Código PHP:
var yo;
function 
ini() {
    
yo "paco";
}
function 
lee() {
    var 
yo;
    
alert(yo);
}
lee();
ini();
lee(); 
Ya que dentro de lee() estamos declarando de nuevo como variable local la variable global yo, luego lo que alertamos es la variable local, a la global no tendremos acceso (únicamente con window.yo).



No se me ocurre qué más decirte, debería funcionar...
Saludos.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #12 (permalink)  
Antiguo 13/06/2008, 07:33
 
Fecha de Ingreso: noviembre-2006
Mensajes: 46
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Darle valor a variables globales desde una función

Sí sí, he probado lo que caricatos puso y funciona, pero lo mio no. Y lo hago tal y como dices.

A ver...sabiendo que así debería de funcionar y que el archivo .js está bien, os voy a explicar como llamo a las funciones iniciar_hora() y mostrar_hora(), a ver si el problema viene de ahí:


Yo tengo un HTML en el que tengo lo siguiente(en archivo.js tengo lo que ya puse anteriormente):
Código HTML:
<html>
<head>
<SCRIPT type="text/javascript" src="archivo.js"></SCRIPT>

<style  type="text/css">
......
.......

</style>
</head>

<body onload="iniciar_hora()">
<form>
<a href="#" onclick="javascript:mostrar_hora()">Mostrar hora</a>
</form>

</body>
</html> 
Es posible que al llamar a archivo.js en 2 veces distintas(primero para llamar a iniciar_hora() y luego para llamar a mostrar_hora() ), el valor de las variables globales no se guarde y por eso me diga cuando llamo a mostrar_hora() que es "undefined"?

Muchas gracias!

Saludos

Última edición por anac; 13/06/2008 a las 07:43
  #13 (permalink)  
Antiguo 13/06/2008, 07:58
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Darle valor a variables globales desde una función

Pues no sé por qué será, tendrás que aislar esas dos funciones (ir borrando elementos en tu archivo js) hasta que logres que funcione, para delimitar el posible error.

He probado este ejemplo y funciona, tanto en IE6 como en FF2:

1 - ARCHIVO.JS
Código PHP:
var hora_global;
var 
minuto_global;
var 
segundo_global;

function 
inicializa_hora() {
    var 
fecha = new Date();
    
hora_global =fecha.getHours();
    
minuto_global fecha.getMinutes();
    
segundo_global fecha.getSeconds();
}


function 
mostrar_hora() {
    
alert("hora_global = "+hora_global+"\r\nminuto_global = "+minuto_global+"\r\nsegundo_global = "+segundo_global);

2 - PAGINA.HTML
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<
head>
<
meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<
meta name="Author" content="derkeNuke" />
<
title>Página nueva</title>
<
script type="text/javascript" src="archivo.js"></script>
</head>


<body>

<a href="#" onclick="mostrar_hora()">Mostrar hora</a>

<script type="text/javascript">
<!--
window.onload = inicializa_hora;
// -->
</script>


</body>
</html> 

No ha habido ningún problema en llamar a la función cuando hacemos click en el enlace. Por cierto, no hay que poner el 'javascript:' en el evento onclick



Tendrás que probar ese ejemplo, verificar que te funciona, e ir quitando elementos de tu documento... no se me ocurre otra opción, el tema es tan sencillo que no tiene más vueltas de hoja.


Saludos.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #14 (permalink)  
Antiguo 13/06/2008, 10:31
 
Fecha de Ingreso: noviembre-2006
Mensajes: 46
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Ya he averiguado donde está el problema

Muchas gracias derkenuke y caricatos por vuestras respuestas.

Derkenuke, he probado tu último ejemplo y a mi también me funciona.

Ya he averiguado cual es el problema en mi programa, yo os había puesto solamente el código de las funciones implicadas por no liar la cosa, pero claro tengo más funciones en mi programa, y al haber entre medias más funciones el valor de las variables globales se pierde por el camino, por eso al final del programa la variable hora_global y otras variables que también tenia declaradas tenían valor undefined...

No explico aquí como se pierden por el camino porque es un poco largo, pero el hecho es que tal y como tengo las funciones no puedo tener variables globales en el .js. Por lo que he decidido que voy a meterlas en un xml e ir leyéndolas y modificándolas desde el XML... más que nada porque no quiero perder más tiempo en averiguar como podría tener variables globales para no llegar a ninguna parte...

Muchas gracias por todo.

Un saludo!
  #15 (permalink)  
Antiguo 13/06/2008, 12:36
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Ya he averiguado donde está el problema

Cita:
Iniciado por anac Ver Mensaje
al haber entre medias más funciones el valor de las variables globales se pierde por el camino, por eso al final del programa la variable hora_global y otras variables que también tenia declaradas tenían valor undefined...

No explico aquí como se pierden por el camino porque es un poco largo, pero el hecho es que tal y como tengo las funciones no puedo tener variables globales en el .js.
Hola de nuevo:

No entiendo muy bien cómo se pueden perder por el camino unas variables globales. Las globales se mantienen en toda la ejecución del script, no hay manera de darles valor undefined una vez ya tengan valor si no es explicitamente, ni siquiera se puede con delete si esta declarada con var:

Código PHP:
var global;
function 
alerta() {
    
document.write("global = "+global+"<br/>");
}

alerta();
global = 
"hola";
alerta();
var global;
alerta();
delete global;
alerta();
global = 
undefined;
alerta(); 
¿Puede que hayas encontrado otra manera? Estoy intrigado...
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #16 (permalink)  
Antiguo 13/06/2008, 15:10
 
Fecha de Ingreso: noviembre-2006
Mensajes: 46
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Darle valor a variables globales desde una función

Te explico lo que yo creo que sucede.... yo diría que las funciones se comportan como si estuvieran en .js distintos, como básicamente cada función lo único que tiene es una variable C que contiene código HTML, este código HTML se muestra por pantalla, el usuario selecciona un enlace de este código HTML y se vuelve a llamar al archivo.js que contiene la función....pero al llamar otra vez al archivo.js las varibles globales ya no tienen el valor que se le ha dado antes, por lo que valen undefined...


Te pongo un pequeño ejemplo de como es mi archivo.js para que lo entiendas mejor, porque no se si habrás entendido mi explicación... Este código simplemente es un resumen, si lo pruebas no creo que funcione porque le he quitado un montón de instrucciones, si quieres puedo mandarte mi código entero por si tienes curiosidad o quieres probarlo... yo de todas maneras tenía que guardar al final los resultados en un XML, así que voy a ir haciéndolo desde el principio y no tengo que darle más vueltas a esto de las variables globales...



ESTO ES INICIO.HTML
Código HTML:
<html>
<head>
<SCRIPT type="text/javascript" src="archivo.js"></SCRIPT>
</head>
<body onload="iniciar_hora()">

<a href="#" onclick="javascript:comenzar()">Inicio</a>
</body>
</html> 


ESTO ES ARCHIVO.JS
Código:
var hora_global;
var minuto_global;
var segundo_global ;

function iniciar_hora()
{
//extraemos del objeto la hora, minuto y segundo actuales
var fecha = new Date();
hora_global = fecha.getHours();
minuto_global = fecha.getMinutes();
segundo_global = fecha.getSeconds();
return true;
}


function comenzar()
{

var C;
C='<html>';
C+='<head>';
C+='<SCRIPT LANGUAGE="Javascript" SRC="archivo.js"charset="utf-8"></SCRIPT>';
C+='</head>';
C+='<body >';
C+='Incio de la experiencia.';
C+='<a href="#" onclick="javascript:comenzar2()"> COMENZAR</a> ';
C+='</body>';
C+='</html>';
parent.central.document.write(C); //Muestro el contenido de C por pantalla, en el 
                                    //frame C que es mi frame principal

return true;
}


function comenzar2()
{
var C;

C='<html>';
C+='<head>';
C+='<SCRIPT LANGUAGE="Javascript" SRC="archivo.js" charset="utf-8"></SCRIPT>';
C+='</head>';
C+='<body>';
C+='<a href="#" onclick="javascript:funcion1()">ENUNCIADO 1 </a>';
C+='<a href="#" onclick="javascript:funcion2()">ENUNCIADO 2</a>';
C+='<a href="#" onclick="javascript:funcion3()">ENUNCIADO 3</a>';

parent.central.document.write(C); 

mostrar_hora();   // He probado que si por ejemplo aquí llamo a esa función
                             // dirá que las variablea globales tienen valor undefined...
return true;
}



function mostrar_hora()
{
alert("hora_global = "+hora_global+"\r\nminuto_global = "+minuto_global+"\r\nsegundo_global = "+segundo_global); 
}

Última edición por anac; 13/06/2008 a las 15:22
  #17 (permalink)  
Antiguo 13/06/2008, 17:20
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Darle valor a variables globales desde una función

Bueno, lo que tenemos aquí es un popurrí de funciones, frames y ámbitos de variable. Aunque está claro que el problema son los frames, que es por donde tendríamos que haber empezado.

Lo que está ocurriendo es que miras a ver qué valor tienen las variables hora, minuto y segundo en un frame donde no están definidas, por eso te da undefined.

Las variables esas ya están definidas dentro de tu frame (dentro de archivo.js están declaradas), pero en tu frame no has llamado a iniciar_hora(), luego no tienen valor.

De todas maneras en firefox no me ha funcionado para nada como se espera, no creo que se puedan escribir etiquetas como <html> y <script> en un frame...


Creo que lo más óptimo sería llamar a funciones entre frames: Puedes llamar a una función en la página padre con parent.tuFuncion(), así no necesitarías tags fuera de body.

Mi consejo es que te libres de los frames cuanto antes... pero prueba este ejemplo:

Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<
head>
<
meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<
title>Página nueva</title>
</
head>

<
body>

<
iframe name="central"></iframe>

<
script type="text/javascript">
<!--

var 
hora;
var 
minuto;
var 
segundo ;

function 
iniciar_hora() {
    
alert("inicio hora!");
    
//extraemos del objeto la hora, minuto y segundo actuales
    
var fecha = new Date();
    
hora fecha.getHours();
    
minuto fecha.getMinutes();
    
segundo fecha.getSeconds();
    return 
true;
}

function 
mostrar_hora() {
    
alert("hora_global = "+hora+"\r\nminuto_global = "+minuto+"\r\nsegundo_global = "+segundo); 
}


function 
comenzar() {
    var 
C;
    
C='Incio de la experiencia.';
    
C+='<a href="#" onclick="alert(\'click\'); parent.comenzar2(); return false;"> COMENZAR</a> ';
    
parent.central.document.write(C); //Muestro el contenido de C por pantalla, en el frame C que es mi frame principal
    
return true;
}

function 
comenzar2() {
    
alert("comenzar2!");
    var 
C;
    
C='<a href="#" onclick="parent.iniciar_hora(); return false;">iniciar hora </a><br/>';
    
C+='<a href="#" onclick="parent.mostrar_hora(); return false;">mostrar hora</a>';
    
parent.central.document.write(C); 
    
parent.iniciar_hora();    // iniciamos
    
parent.mostrar_hora();  // miramos
    
return true;
}


comenzar();

// -->
</script>


</body>
</html> 

Todo en un mismo documento funciona muy bien (además lo he hecho pensando también en firefox). Así no tienes que preocuparte de ámbitos, todo estará en parent, ya ya está.



Saludos.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #18 (permalink)  
Antiguo 14/06/2008, 04:41
 
Fecha de Ingreso: noviembre-2006
Mensajes: 46
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Darle valor a variables globales desde una función

Hola,

De verdad te agradezco mucho la ayuda, pero no consigo hacerlo funcionar... Tu ejemplo funciona y lo entiendo, pero en mi aplicación es lo que tu dices, tengo un lío de funciones, frames y ámbitos...

De todas maneras te voy a hacer unas preguntas sobre el código que me has puesto.

¿Por qué usas "parent.mostrar_hora()" y no "parent.central.mostrar_hora()"? ¿Se supone que poniendo parent.mostrar_hora(), lo que inicialices en esta función será global para todos los frames? ¿ o es que tu partes de que sólo tienes un frame?


Tu me recomiendas que no use frames, pero a ver, yo tengo la pantalla dividida en frames, si no lo divido con frames, ¿con qué la puedo dividir? Si dividiera la pantalla con iframes seguiría teniendo el mismo problema con las variables globales,no? seguirán siendo locales al iframe,no?

Ah,y sí, lo que estoy haciendo sólo funciona en el explorer.

Muchas gracias,

Un saludo,

Última edición por anac; 14/06/2008 a las 04:57
  #19 (permalink)  
Antiguo 14/06/2008, 08:58
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Darle valor a variables globales desde una función

Hola de nuevo anac:

Cita:
Iniciado por anac Ver Mensaje
¿Por qué usas "parent.mostrar_hora()" y no "parent.central.mostrar_hora()"? ¿Se supone que poniendo parent.mostrar_hora(), lo que inicialices en esta función será global para todos los frames? ¿ o es que tu partes de que sólo tienes un frame?
Creo que nos falla el concepto de global: Una variable de javascript es global para un documento, no para un conjunto de frames. Si una variable es global en un documento (un frame) los otros frames no pueden tomarla directamente, no es global en ese sentido, es global sólo para ese documento (sólo para ese frame).

Es decir, en mi ejemplo tengo un frame (o un iframe, lo mismo da) que no contiene nunca funciones javascript, sólo tiene llamadas a funciones javascript que están en su parent. Todas las funciones y variables están en el parent, por eso a la hora de llamar a una función en el onclick de un vínculo en el iframe tengo que llamarla con parent.

De hecho, una vez llamada a una función con el parent (parent.comenzar2()) sabemos que se ejecuta en el ámbito de la ventana padre, y que todas las variables globales y funciones que utilicemos ahí estarán declaradas en el padre (luego he puesto parent's de más, no harían falta).


Te voy a pasar un ejemplo de cómo lo haría yo: Dos frames (o los que quieras), uno llamado menu y el otro llamado central. En el frame menu tenemos todo lo que no va a variar (registro de la hora de entrada a la aplicación), ya que el documento menu.html no se destruirá, permanecerá en ese frame hasta que se cierre la ventana.
El frame central contendrá todo lo volátil, pero puede acceder al frame menu, a sus funciones y a sus variables cuando quiera:

1.- PÁGINA DE FRAMES:
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/2002/REC-xhtml1-20020801/DTD/xhtml1-frameset.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<
head>
<
meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<
title>Página nueva</title>
</
head>

<
frameset cols="300,*">
    <
frame name="menu" src="menu.html" />
    <
frame name="central" src="central.html" />
</
frameset>


</
html
2.- PÁGINA MENU.HTML
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<
head>
<
meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<
title>Página nueva</title>
</
head>

<
body>

<
h1>Mi menu!!</h1>

<
a href="#" onclick="mostrar_hora(); return false;">¿A qué hora he entrado?</a>

<
script type="text/javascript">
<!--

// Aqui arrancamos todo lo que quieras que esté siempre disponible e invariable, ya que el menú no cambiara de localización.
// No se destruirá si cambiamos de localización en el frame central, ya que son independientes.

var hora_global;
var 
minuto_global;
var 
segundo_global;

function 
inicializa_hora(){
    var 
fecha = new Date();
    
hora_global =fecha.getHours();
    
minuto_global fecha.getMinutes();
    
segundo_global fecha.getSeconds();
}

window.onload inicializa_hora;

function 
mostrar_hora() {
    
alert("hora_global = "+hora_global+"\r\nminuto_global = "+minuto_global+"\r\nsegundo_global = "+segundo_global);
}

// -->
</script>

</body>
</html> 
3.- PÁGINA CENTRAL.HTML
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<
head>
<
meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<
title>Página nueva</title>
</
head>

<
body>

<
h2>Mi central</h2>
<
a href="#" onclick="parent.frames.menu.mostrar_hora(); return false;">¿A qué hora he entrado?</a>

<
script type="text/javascript">
<!--

// todo lo que definas aqui sólo estará disponible AQUI, para este frame. Y se destruirá si cargamos un nuevo documento en este frame.



// -->
</script>

</body>
</html> 

Espero que el concepto de variable global te haya quedado claro: Sólo es global para el documento, no para toda la ventana (no para todos los frames).

No hay manera de incluir un tag <script> dentro del documento que define los marcos para que todos los marcos dispongan de funciones y variables comunes. La única manera que he encontrado en la especificación es Compartir datos entre marcos, con un tag Object, pero nunca he experimentado con ello.

Cita:
Iniciado por anac Ver Mensaje
Tu me recomiendas que no use frames, pero a ver, yo tengo la pantalla dividida en frames, si no lo divido con frames, ¿con qué la puedo dividir? Si dividiera la pantalla con iframes seguiría teniendo el mismo problema con las variables globales,no? seguirán siendo locales al iframe,no?

Ah,y sí, lo que estoy haciendo sólo funciona en el explorer.

Muchas gracias,

Un saludo,

Te recomiendo que no uses frames porque ya casi nadie los utiliza, están muy en desuso (¿has visto páginas de marcos?) y con la versión 5 de HTML los frames van a desaparecer. En su lugar los include()'s de PHP han hecho maravillas.



Bueno, menudo post

Un saludo, espero haberte aclarado.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #20 (permalink)  
Antiguo 14/06/2008, 10:48
 
Fecha de Ingreso: noviembre-2006
Mensajes: 46
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Darle valor a variables globales desde una función

Hola derkenuke!

Por fin! ya he conseguido poder leer variables globales desde cualquier función, a partir de uno de los enlaces que me has pasado, en concreto el de "compartir variables entre frames", ya me he puesto a buscar como se puede hacer esto, y la verdad es que es lo más sencillo del mundo... claro, que sencillas son las cosas cuando las sabes, porque cuando no... te puedes volver loc@! Y yo que tiendo a agobiarme todavía pienso con menos claridad...

Para compartir variables entre frames lo que hay que hacer es definirlas en el HTML donde tienes definidos los <frames> y luego desde la función de dentro de algún frame las llamas así: parent.hora_global

Pongo un ejemplo:
Código HTML:
<html>
<head>
<script language="JavaScript">
var fecha = new Date();
var hora_global = fecha.getHours();
var minuto_global=fecha.getMinutes();
var segundo_global=fecha.getSeconds();

</script>
</head>
<frameset rows="60,*">
    <frame src="frames1.html" name="frame0" marginwidth="10" marginheight="10">
    <frame src="frame2.html" name="frame1" marginwidth="10" marginheight="10">
</frameset>
</html> 

No sabía que los frames estaban en desuso, la próxima vez no los usaré, he leído un poco sobre los include's de PHP, la próxima vez intentaré usarlos...

Mil gracias por la ayuda,

Saludos!
  #21 (permalink)  
Antiguo 14/06/2008, 13:01
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Respuesta: Darle valor a variables globales desde una función

Huy, pues es lo primero que he probado, pero como me daba inválido en el validador por eso he dicho que no he encontrado manera.


¡Buen apunte! Así podrían cambiar todos los frames de localización.


Bueno, supongo que el tema esta solucionado.

Saludos
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #22 (permalink)  
Antiguo 14/06/2008, 14:55
 
Fecha de Ingreso: octubre-2003
Ubicación: Cerca de una wifi o 3G
Mensajes: 328
Antigüedad: 20 años, 6 meses
Puntos: 4
Respuesta: Darle valor a variables globales desde una función

Interesante, los frames e iframes son todo un problema, tambien se puede ejecutar un javascritp desde un iframe a otro, desde un flash a un iframe, incluso flash puede ejecutar eventos en otra ventana de flash desde Firefox hacia IE eso si que lo encuentro rarisimo, pero al fin y al cabo se puede :)

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:10.