2012-12-31 69 views
1

我在这里看到了这个问题的几个版本,但没有一个与我的问题看起来是一样的,所以我想创建一个新的问题。我必须在这里做一些非常愚蠢的事情,但在我的生活中,我无法发现它。Javascript全局变量不工作

我会与上下文开始,虽然不是特别相关:我jQuery的延迟加载与JS代码,这意味着没有我的代码文件可以包含一个$(document).ready(...)电话,因为“$”将是不确定的第一关。相反,我加入我的准备功能,以“全球”阵列,和jQuery负载异步后,我把所有这些功能有以下几点:

function FireLoadEvents() { 
    while (OnLoadEvents.length > 0) { 
    var item = OnLoadEvents.splice(0,1); 
    item[0].ready(); 
    } 
} 

现在我的任何页面组件,我可以使用以下方法来添加一个事件我想火的时候,jQuery是加载和文件实际上是准备:

<script language="text/javascript"> 
var OnLoadEvents = new Array(); 
</script> 

OnLoadEvents.push({ ready: function() { ... } }); 

我在我的模板在头部的最顶部定义的变量

正如您所看到的,它在任何函数作用域之外,并且在被引用之前也被声明。当自己进行测试时,此设置运行良好,但由于某种原因,当它添加到我的实际页头时,页面后面的脚本标记无法将项添加到OnLoadEvents变量。例如,下面是一个PHP,包括服务器端被拉入我的模板,并增加这些线路到我的网页正文:

<script type='text/javascript'> 
OnLoadEvents.push({ ready: function() { 
    if ($('.sponsor-link').length != 0) { 
    ... 
    } 
} }); 
</script> 

当我打在Chrome页面,它报告在以下异常“推”线上面:

Uncaught ReferenceError: OnLoadEvents is not defined 

任何想法是怎么回事?为什么OnLoadEvent会在我初始化它的几行之后未定义?我会注意到,我也尝试将OnLoadEvents定义为window.OnLoadEvents

在此先感谢!

+0

为什么jQuery会异步加载?脚本通常按顺序加载,因此您可以确保jQuery首先加载使用'.ready()'。你使用'async'或'defer'属性吗?你使用脚本加载器来加载jQuery? – Joseph

+0

样式注释:使用'var OnLoadEvents = [];'而不是'var OnLoadEvents = new Array();'参见:http://yuiblog.com/blog/2006/11/13/javascript-we-hardly-new -ya/ – User

+0

我认为重要的部分是“如何”将这段代码添加到页面中。如果您通过innerHTML添加脚本,它将不会执行脚本。 – epascarello

回答

7

更改此:

<script language="text/javascript"> 

这样:

<script> 

的Web浏览器不能识别language属性的值,因此,不执行代码。

现场演示:http://jsfiddle.net/gyhcM/2/

你不需要language属性,也不是type属性,如网络浏览器在默认情况下承担的JavaScript。

+0

这不会有所作为。 epascarello

+2

@epascarello是的,它的确如此。看到这里:http://jsfiddle.net/gyhcM/ –

+0

@epascarello不会在哪个操作系统上的浏览器版本有所作为? :) –