Ver Mensaje Individual
  #19 (permalink)  
Antiguo 14/06/2008, 08:58
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 2 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.