2012-12-22 35 views
4

這是我的HTML頁面:從單獨的.js文件調用主頁面中的jquery函數。

<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>Untitled Document</title> 

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

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

<script type="text/javascript"> 

$(document).ready(function() { 
function closecontactform(){ 
alert("closing the form"); 
}; 
}); 
</script> 
</head> 
<body> 
<p id="elementname">Click me to call function</p> 
</body> 

這是myscripts.js文件:

$(document).ready(function() { 
$('#elementname').click(function() { 
alert("click detected"); 
closecontactform(); 
}); 
}); 

我的實際頁面比這更復雜了不少,包括很多jQuery的,但是這是僅顯示必要代碼的基本問題。我希望能夠從一個單獨的.js文件中調用一個函數,而函數是在主頁面中定義的。在這個基本的簡單版本中,我嘗試刪除$(document).ready(function()...並且在這個簡單的例子中,這有助於我在更復雜的頁面中使用這行代碼,因爲刪除它似乎會破壞我所做的一切上。

你會看到「點擊檢測」被調用,但「關閉窗體」不。

您能夠給我任何指針?

感謝,

回答

13

您有範圍問題。您不需要在$(document).ready()中包裝命名函數。

如果包裝在ready中,它的作用域僅在該就緒函數中可用,因爲該函數中的關閉。

例子:

$(document).ready(function() { 
    function doAlert() { 
     alert('foo'); 
    } 
    /* can call function since scope in same parent function*/ 
    doAlert(); 
}); 
/* function not in scope, is undefined here*/ 
doAlert(); 

重構等等功能是全局可用,並且將工作,如果從任何地方調用。在下面兩種情況下工作:

function doAlert() { 
    alert('foo'); 
} 

$(document).ready(function() { 
    doAlert(); 
}); 
doAlert(); 

此外應注意:

很多人擔心使用jQuery選擇和方法的功能必須被包裹在$(document).ready()ready以外的命名函數可以包含所有的jQuery代碼......但是......在DOM準備好確保html存在之後需要調用它們

+0

好的。這是一個像你說的範圍問題,但是我不認爲我能夠刪除我的$(document).ready(),因爲我的實際函數實際上包含了一些變量和jQuery(和css),它們依賴於HTML正在加載。所以我所做的就是將所有代碼從我的單獨的.js文件中取出,並將其放在我的主頁上同一個$(document).ready()中。這解決了問題。 – Maureen

+0

好的..我試着解釋jQuery代碼的一部分......你可能會把功能拉出來。你仍然只能從'ready'中調用許多函數,但是你可以在不同文件中使用'ready'來訪問相同的全局函數 – charlietfl

+0

看看我是如何將$(document).ready包裝在名爲'ready'之外的調用函數中。函數在調用之前不會執行。無論您在何處定義它, – charlietfl

0

您是否嘗試過移動

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

低於<body> -tag?

0

首先,您需要將腳本標記移動到</body>之上標籤。

其次,如果你只是刪除準備好的文件,應該在上面工作。問題是你在一個閉包內定義了你的函數,這超出了範圍。你的函數不需要在文檔中準備好,因爲只有當其他文檔準備就緒時(意味着文檔已準備就緒),它纔會被觸發。

+0

頂部(頭部)或底部(主體)的腳本不會影響範圍問題。這裏沒有問題 – charlietfl

相關問題