jquery没有运行

时间:2011-03-08 20:34:59

标签: jquery

我正在调用一个在头文件中加载自定义js文件的函数。

<head>

<script type="text/javascript" src="/js/jquery-1.5.min.js"></script> 
<script type="text/javascript" src="/js/my.js"></script>

my.js有

$(document).ready(function(){
    function testFunction(){ 
        alert("inside testfunction");
    }
});

点击几下后,就会加载到<body>

$("#someid").live($.myapp.event.play, function(event) {
    alert("this works");
    testFunction();
});

警报“这个有效”,开火,但没有任何反应,我做错了什么?

2 个答案:

答案 0 :(得分:3)

这是一个范围问题。在$(document).ready函数中定义变量(或对象,如函数)时,它们是临时的。

var x = 1;
var y;
$(document).ready(function() {
    var x= 'a billiondy'; //does not affect the global variable
    y=2;
    z=3;
    window.a = 4;
});

此时window有3个变量,xya分别等于1,2和4。

因为xvar重新声明,所以它不会被覆盖(它只是一个局部变量)。

由于y中定义了window,因此范围链会找到y并假设您的意思是window.y

因为znull(从未声明),ready函数现在声明了一个局部变量。当ready函数关闭时,z未在任何活动范围中引用,因此它是垃圾回收的。

同样的事情发生在a,但它不是垃圾收集,因为你明确地说“这是一个窗口变量”。因此a在全局范围内定义。知道了吗?

编辑:这比你想要的更多,但理解这一点很重要。在某些时候,你会问“为什么这样的变量被覆盖/未定义”。答案在范围链中。

第二次编辑:

要回答Andre的问题(请参阅注释),以下代码无效:

function testFunction(){ mySecondFunction(); }  //ran first
$(document).ready(function(){ // ran third;
        window.mySecondFunction = function(){alert("this will work");}
    });
testFunction(); // ran second

原因是ready函数内的代码在加载其他所有内容后运行。因此,当运行testFunction(最后一行)时,未定义mySecondFunction。如果你尝试的话,这基本上就是你犯的错误:

function test() { test2() };
function test2() {alert('wtf?')};

任何不在ready函数中的代码都会在ready函数中的任何代码之前执行。但是,在文档加载之后执行的任何代码(以及就绪函数已被触发)都可以访问mySecondFunction,因为它现在已在窗口范围中定义。请考虑以下事项。

function testFunction(){ mySecondFunction(); }
$(document).ready(function(){
        window.mySecondFunction = function(){alert("this will work");}
    });
//testFunction(); erroneous do not uncomment!
$(document).click(function() {testFunction();}); //works fine
//$("body").click(function() {testFunction();}); //does nothing

如果单击文档,则在执行ready函数后单击,因此未注释的行正常工作。它之后没有任何内容(如果它在<head>标记中),因为此时没有正文,所以$("body")返回一个空的jquery列表。 javascript的年表几乎和范围一样令人困惑。

答案 1 :(得分:2)

试试这个。

function testFunction(){ alert("inside testfunction"); }
$(document).ready(function(){

    testFunction();

});