2010-05-28 153 views
98

我的一些JavaScript代码位于名为helpers.js的外部文件中。在调用此JavaScript代码的HTML内部,我发现自己需要知道helpers.js中的某个函数是否已被调用。跨多个文件的Javascript中的全局变量

我试图通过定义来创建一个全局变量:

var myFunctionTag = true; 

在全球范围内都在我的HTML代码和helpers.js。

继承人什么我的HTML代码如下所示:

<html> 
... 
<script type='text/javascript' src='js/helpers.js'></script>  
... 
<script> 
    var myFunctionTag = false; 
    ... 
    //I try to use myFunctionTag here but it is always false, even though it has been se t to 'true' in helpers.js 
</script> 

是什么,我试图做甚至是可行的?

+0

嗯,你刚才*设置*它在第二个'

15

变量可以在.js文件中声明,并且只在HTML文件中引用。 我的helpers.js版本:

var myFunctionWasCalled = false; 

function doFoo() 
{ 
    if (!myFunctionWasCalled) { 
     alert("doFoo called for the very first time!"); 
     myFunctionWasCalled = true; 
    } 
    else { 
     alert("doFoo called again"); 
    } 
} 

和页面来测试它:

<html> 
<head> 
<title>Test Page</title> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
<script type="text/javascript" src="helpers.js"></script> 
</head> 

<body> 


<p>myFunctionWasCalled is 
<script type="text/javascript">document.write(myFunctionWasCalled);</script> 
</p> 

<script type="text/javascript">doFoo();</script> 

<p>Some stuff in between</p> 

<script type="text/javascript">doFoo();</script> 

<p>myFunctionWasCalled is 
<script type="text/javascript">document.write(myFunctionWasCalled);</script> 
</p> 

</body> 
</html> 

你会看到测试alert()会显示两个不同的东西,并写入到页面的值会有所不同第二次。

13

好的,伙计们,这也是我的小测试。我有一个类似的问题,所以我决定测试3种情况:

  1. 一个HTML文件,一个外部JS文件......它可以工作吗 - 可以通过全局var函数进行通信吗?
  2. 两个HTML文件,一个外部JS文件,一个浏览器,两个选项卡:它们是否会通过全局变量进行干涉?
  3. 一个HTML文件,由2个浏览器打开,它会工作,他们会干预?

所有结果都符合预期。

  1. 它的工作原理。函数f1()和f2()通过全局var(var在外部JS文件中,而不是在HTML文件中)进行通信。
  2. 他们不干涉。对于每个浏览器选项卡,每个HTML页面都有明显不同的JS文件副本。
  3. 所有工作都按预期独立进行。

与其浏览教程,我发现它更容易试用,所以我做了。我的结论是:无论何时在HTML页面中包含外部JS文件,外部JS的内容在呈现页面之前都会“复制/粘贴”到HTML页面中。或者如果你愿意的话进入你的PHP页面。 如果我在这里错了,请纠正我。 Thanx。

我的示例文件如下:

外部JS:

var global = 0; 

function f1() 
{ 
    alert('fired: f1'); 
    global = 1; 
    alert('global changed to 1'); 
} 

function f2() 
{ 
    alert('fired f2'); 
    alert('value of global: '+global); 
} 

HTML 1:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<script type="text/javascript" src="external.js"></script> 
<title>External JS Globals - index.php</title> 
</head> 
<body> 
<button type="button" id="button1" onclick="f1();"> fire f1 </button> 
<br /> 
<button type="button" id="button2" onclick="f2();"> fire f2 </button> 
<br /> 
</body> 
</html> 

HTML 2

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<script type="text/javascript" src="external.js"></script> 
<title>External JS Globals - index2.php</title> 
</head> 
<body> 
<button type="button" id="button1" onclick="f1();"> fire f1 </button> 
<br /> 
<button type="button" id="button2" onclick="f2();"> fire f2 </button> 
<br /> 
</body> 
</html> 
+1

HTML 1和HTML 2是相同的(页面标题除外)...但是,我做了两个文件,只是为了让它们在物理上分开。 – Martin 2013-01-02 21:55:57

1

我想你应该使用“本地存储“而不是globa升变量。

如果您担心在很旧的浏览器中可能不支持“本地存储”,请考虑使用现有的插件来检查“本地存储”的可用性,并在其他方法不可用时使用其他方法。我使用http://www.jstorage.info/,到目前为止我很满意。

0

你可以像一个JSON对象:

globalVariable={example_attribute:"SomeValue"}; 
在fileA.js

而且从像fileB.js访问它

globalVariable.example_attribute