2011-12-07 24 views
11

Tengo problemas con las variables globales.Javascript: Variables globales compartidas entre archivos .js

Teniendo en cuenta que tengo los siguientes archivos: init.html, principal.html, Init.js., main.js y help.js:

Cuando, init.html:

<HTML> 
    <HEAD> 
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.6.3.min.js"></script> 
    <script type="text/javascript" charset="UTF-8" src="init.js" ></script> 
    <script type="text/javascript" charset="UTF-8" src="main.js" ></script> 
    <script type="text/javascript" charset="UTF-8" src="help.js" ></script> 

    </HEAD> 
    <BODY> 
     <script> 
      $(document).ready(function() { 
      test(); 
     }); 
     </script> 
    </BODY> 
</HTML> 

En Init.js.:

function test(){ 
alert(window.glob); 
} 

En principal.html:

<HTML> 
    <HEAD> 
     <script type="text/javascript" src="http://code.jquery.com/jquery-1.6.3.min.js"> </script> 
     <script type='text/javascript' > 
      top.glob = "global variable"; 
     </script> 
     <script type="text/javascript" charset="UTF-8" src="help.js" ></script> 
     <script type="text/javascript" charset="UTF-8" src="main.js" ></script> 
    </HEAD> 
    <BODY>  
    <div id="divtest"></div> 
    <form> 
     <input type="button" value="button" onClick="callTest()" /> 
    </form> 
    </BODY> 
</HTML> 

main.js:

function change(p){ 
    window.glob = p; 

    $('#divtest').html("<iframe id='IFRAMEtest' width='720' height='400' frameborder='0' src='init.html'></iframe>"); 
} 

Y en help.js:

function callTest(){ 
change('param'); 
} 

Cuando hago clic en el botón, se muestra "variable global", pero necesito mostrar "parámetro".

En resumen, necesito que un archivo .js lea una variable global en otro archivo js donde esta variable se alimenta a una función llamada por un evento de un usuario.

Gracias.

editar - variable global inicializada antes de importar archivos. js y usando la parte superior. Funciona en IE y Firefox, pero Chrome muestra "indefinido"

+0

Considere la posibilidad de minimizar el uso de propiedades globales (variables globales y funciones globales). El espacio de nombres global ya contiene cientos de nombres; no desea insertar sus propios nombres en ese espacio de nombres. –

+0

Sí, estoy de acuerdo. Sé que tal vez ya sepan esto, pero los globales son casi siempre una forma terrible de hacer las cosas. Lógica abstracta en funciones y pasar parámetros en su lugar. Firmado, el chico que tiene que mantener tu código de spaghetti un día :) –

Respuesta

16

Echa un vistazo aquí: Global variables in Javascript across multiple files Lo principal es que puede que tenga que declarar las variables globales antes de que el archivo real, a fin de tratar de insertar esto antes de su incorporación a help.js

a fin de tratar de dar esto un tiro.

<script type='text/javascript' > 
    window.glob = "global variable"; 
</script> 

lo que el código debe ser:

<head> 
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.6.3.min.js" ></script> 

    <script type='text/javascript' > 
     window.glob = "global variable"; 
    </script> 

    <script type="text/javascript" charset="UTF-8" src="help.js" ></script> 
    <script type="text/javascript" charset="UTF-8" src="main.js" ></script> 
</head> 

probar eso y ver si funciona. también, elimine su declaración de variable global de main.js para esto.

+0

tks para su respuesta. Usando la parte superior y declarando las variables globales antes de que el archivo real funcione en IE y firefox, pero necesita trabajos en chrome =/¿Alguna idea? – vctlzac

+0

no, tampoco puedo hacerlo :( – Annabelle

+0

Gracias por esta respuesta. –

7

No existe un contexto global que abarque ventanas (marcos), realmente. Todos los marcos en una "familia" tienen acceso a una variable llamada "superior" que se refiere a la ventana superior, por lo que podría usar eso.

top.glob = "global variable"; 

y en su código iframe:

function test(){ 
    alert(top.glob); 
} 

ediciónHere is a a slightly simplified version of your code, y funciona muy bien para mí.

+0

Cuando cambiaste a top.glob la alerta muestra "indefinido" – vctlzac

+0

Bueno, todo depende de cuándo se ejecuten esas partes de código, etc. Configuraré un jsfiddle . – Pointy

+0

@vctlzac He actualizado mi respuesta con un enlace a una página de muestra, que funciona. Se basa en el código que publicaste (ligeramente simplificado). – Pointy

1

Cuando se encuentra dentro de un marco y desea obtener una ventana variable desde la ventana principal, debe consultarla.

Utilice top o window.top.

Cuestiones relacionadas