Hola de nuevo
anac:
Cita:
Iniciado por anac ¿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 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.