2011-12-07 70 views
11

我遇到了全局变量问题。Javascript:在.js文件之间共享全局变量

考虑到我有以下文件:init.html,main.html中,init.js,main.js和help.js:

其中,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> 

在init.js:

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

在main.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>"); 
} 

而且在help.js:

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

当我点击链接,将显示 “全局变量”,但我需要显示 “参数”。

简而言之,我需要一个.js文件读取另一个js文件中的全局变量,其中此变量被馈送到用户事件调用的函数中。

谢谢。

编辑 - 导入文件之前进行初始化的全局变量。 JS和使用顶部。在IE和Firefox中工作,但铬显示“未定义”

+0

考虑最小化全局属性(全局变量和全局函数)的使用。全局名称空间已经包含了数百个名称 - 您不想将自己的名称推入该名称空间。 –

+0

是的,我同意 - 我知道你可能已经知道这一点,但全局变量几乎总是一种可怕的做事方式。抽象逻辑转换为函数并传递参数。签名,那个有一天必须维护你的意大利面代码的人:) –

回答

16

到这里看看: Global variables in Javascript across multiple files 最主要的是,你可能需要声明实际的文件之前,全局变量 ,所以试下你列入前插入这help.js

所以尽量给这一枪。

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

所以你的代码应该是:

<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> 

尝试,看看它是否工作。 另外,从main.js中删除你的全局变量声明。

+0

tks for your answer。 使用top并在实际文件在IE和firefox中工作之前声明全局变量,但是需要在chrome = /中运行任何想法? – vctlzac

+0

不,也不能:( – Annabelle

+0

谢谢你的回答。 –

7

没有跨越窗口(框架)的全局上下文,真的。 “家族”中的所有框架都可以访问称为“top”的变量,它指向最上面的窗口,因此您可以使用它。

top.glob = "global variable"; 

,并在您的iframe代码:

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

编辑Here is a a slightly simplified version of your code,这对我来说工作正常。

+0

当更改为top.glob时,警告显示“undefined” – vctlzac

+0

那么这一切都取决于代码执行的时间等。我将设置一个jsfiddle 。 – Pointy

+0

@vctlzac我已经更新了我的答案,并提供了一个链接到示例页面的链接。它基于您发布的代码(稍微简化)。 – Pointy

1

当你在一个框架内并想从父窗口获得一个窗口变量时,你必须引用它。使用topwindow.top

相关问题