2011-03-08 74 views
1

我正在調用一個函數,它被加載到頭文件中的自定義js文件中。jquery沒有運行<body>

<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(); 
}); 

警報 「這部作品」,火災,但後來什麼也沒有發生, 我究竟做錯了什麼?

+0

在調試javascript時,確保你有什麼東西可以顯示任何JS錯誤。 Firebug是一個不錯的選擇(只適合全面的Web開發)。我很肯定你會得到一個testFunction不是一個函數類型的錯誤,它可能幫助你縮小了問題的範圍。 – nzifnab 2011-03-08 20:47:38

+0

是的,我做了,不知道如何解決它。 – Andre 2011-03-08 22:16:49

回答

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個變量,xy,並a其是等於1,2和4分別。

因爲x被重新聲明爲var,所以不會被覆蓋(它只是一個局部變量)。

由於ywindow中定義,範圍鏈找到y並假定您的意思是window.y

因爲znull(從未聲明)ready函數現在聲明瞭一個局部變量。當就緒功能關閉時,z不在任何活動範圍內引用,因此它被垃圾收集。

同樣的事情發生在a,但它不是垃圾收集,因爲你明確地說「這是一個窗口變量」。因此a在全球範圍內定義。得到它了?

編輯:這是更多的答案比你想要的,但瞭解這一點很重要。在某些時候,你會問「爲什麼這樣和那樣的變量被覆蓋/未定義」。答案在範圍鏈中。

第二個編輯:

要回答安德烈的問題(見註釋),下面的代碼是無效的:

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

的原因是,準備函數內部的代碼運行後,其他的一切都是裝。所以當testFunction運行時(最後一行),mySecondFunction沒有定義。它基本上,如果你試過你會犯同樣的錯誤:

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

未就緒功能的任何代碼獲取就緒功能的任何代碼之前執行。但是,在文檔加載後(以及已啓動的就緒函數)執行的任何代碼都可以訪問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的年代表與範圍幾乎一樣令人困惑。

+0

我怎麼調用的函數裏面$(文件)。就緒(函數(){});?功能,從外面例如功能testFunction(){mySecondFunction();} $(文件)。就緒(函數(){ 功能mySecondFunction(){警報( 「這不會工作」);} }); testFunction(); – Andre 2011-03-08 22:19:12

+0

這是不可能的,我會在我的答案解釋爲什麼。需要的空間。 – chriscauley 2011-03-08 23:19:24

+0

@Andre那裏,希望這足夠 – chriscauley 2011-03-08 23:33:08

2

試試這個。

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

    testFunction(); 

}); 
+0

完美,你能告訴我爲什麼會發生這種情況嗎?這是一些範圍問題? – Andre 2011-03-08 20:41:35

+0

你不應該在那裏調用函數。這隻會發出警報。只需在ready handler中刪除testFunction()即可。 – Groovetrain 2011-03-08 20:42:58

+0

@這絕對是一個範圍問題。 – Groovetrain 2011-03-08 20:43:48