2014-02-13 34 views
0

我不能得到以下问题。 我定义变量是这样的:加载时未定义JavaScript变量;

<script type="text/javascript">var myVar;</script> 
<script type="text/javascript" src="/myScript.js"></script> 

myScript.js看起来是这样的:

$(document).ready(function() { 
    myVar = new myClass(); 
    myVar.init(); 
}); 

,如果我尝试访问这样的变量:

<div onclick="myVar.activate(x);">some content</div> 

一切工作正常,但如果我做

<img src="path" onload="myVar.activate(x);"/> 

我收到一条错误“myVar未定义”。我不明白。

<script type="text/javascript">var myVar;</script> 
    some DOM Elements 
<script type="text/javascript" src="/myScript.js"></script> 
<script type="text/javascript">myVar.activate(x);</script> 

不工作吗?!?!!奇怪,不是吗?

* X生成服务器端*

+0

这是错误的一段代码,调用onload myVar.activate(x),但该函数是DOM内准备..不可能 –

+0

顺便说一句onload主要用于像window.onload – shubendrak

+3

@Liam - 它可能。它可能不会。这取决于图像加载的速度。 – Quentin

回答

1
$(document).ready(function(){ 
    // this function is executed after the entire document is ready, 
    // and it will fire after window.onload 
    myVar = new myClass(); 
    myVar.init(); 
}); 

在这里,你正在尝试同要访问myVar的方法,但是您的.ready()函数尚未开启,因此myVar尚未设置为new myClass()。它仍然是一个undefined可变

<script type="text/javascript"> 
    myVar.activate(x); 
    // this script executes *before* the code inside your document ready function, 
    // so this is *before* you have set myVar = new myClass(); 
    var_dump(myVar); 
    // above should output 'undefined' 
</script> 

如果你真的需要/想调用这个方法在一个onload属性,那么你应该在你的内联脚本设置myVarnew myClass(),像这样:

<script type="text/javascript"> 
    var myVar = new myClass(); 
    myVar.init(); 
    myVar.activate(x); 
</script> 
+0

感谢提示与 Viktor

+0

@Viktor这有助于你解决你的问题吗? – Bill

+0

还没有。我必须找到另一种方式来读取服务器端生成的var x jQuery – Viktor

0

没有什么可怕在这里,你只是没有在一个良好的时间声明变量。在使用在线脚本时,必须在浏览器读取DOM节点之前分配变量。

在您的代码中,您已将DOM分配为myVar,因此浏览器已经完成读取DOM并抛出错误。

我现在的问题是,为什么在创建对象之前需要等待DOM准备好?肯定有一个解决办法。

+2

没有问题的是*声明*的变量( 'var myVar')。问题是它有一个值赋给它的时间。 – Quentin

+0

@Quentin我的不好,我错误地解释,谢谢! –

0

当你的HTML被完全呈现

$(document).ready(function() { 
    myVar = new myClass(); 
    myVar.init(); 
}); 

而且因为它的下载和浏览器在HTML中添加下列尽可能快而被呈现,执行以下功能:

<img src="path" onload="myVar.activate(x);"/> 

所以myVar不能被定义,因为当页面呈现<img>时,ready()尚未被调用。 您的第二个示例的原因相同。 myVar是空

您应该删除:

$(document).ready(function() ... 

,然后再试一次。

+0

我确实需要$(document).ready(function()来引起一些依赖于外部加载的脚本 – Viktor

+0

因此,您必须在这些外部加载的脚本之后加载/显示HTML。 – alexmngn

0

为什么不能简单地说,这取决于x是何宣布,明明:

$(document).ready(function() { 
    myVar = new myClass(); 
    myVar.init(); 
    myVar.activate(x); 
}); 

的净结果应该是没有错误

+0

x由服务器端函数生成 – Viktor

1

如果您的代码在文档中准备好分配值myVar是绝对必要的,那么处理此问题的更好方法是这样的:

$(document).ready(function() { 
    myVar = new myClass(); 
    myVar.init(); 

    $("#idOfMyImage").load(function() { myVar.activate(x); }); 
}); 

这里发生的情况是,只有在启动了dom就绪事件并且myVar具有分配给它的值后,才会附加load处理程序。如果图像在文档准备好触发时已经加载,那么这将立即执行,它没有,它将在图像加载时触发。现在你已经消除了竞争条件,你的代码依赖于这两个事件触发的顺序(如果提供图像的服务器速度足够慢,提供数据,你的原始代码可能已经工作 - 可能发生的事情是,你的图像正在加载缓存由您的浏览器)。

作为奖励,您现在已经摆脱了内联事件处理程序,它可以更好地将HTML与Javascript分离。

0

感谢比利马修斯,我知道为什么它不工作。非常感谢你!

这是现在我是如何做到的(不干净,但工作!)

<script type="text/javascript" src="/myScript.js"></script> 

myScript.js看起来是这样的:

$(document).ready(function() { 
var ServerGeneratedValue = $('myID').html(); 

var myVar = new myClass(); 
myVar.init(); 

myVar.activate($ServerGeneratedValue); 
}); 

非常感谢所有的答案!