2010-02-13 44 views
2

我想在我的頁面加載不同JavaScript工作,但我不能讓他們說話。呼叫功能包含的JavaScript

<html> 
<script type="text/javascript" src="jquery144.js"></script> 
<script type="text/javascript" src="shared_functions.js"></script> 
<script type="text/javascript" src="page_function_callers.js"></script> 
</html> 


// shared_functions.js 
$(document).ready (function() { 
    function sayHello (what) { 
     alert (what); 
    } 
}); 

// page_function_callers.js 
$(document).ready (function() { 
    $("div.my_button").click (function() { 
     sayHello ("Hello world!"); 
    }); 
}); 

我使用jQuery,我想使用這種方式,因爲它應該讓我recyle許多公共方法。我哪裏錯了?

回答

2

當你聲明「的sayHello」(有誰記得夏洛特·丘奇首歌嗎?天哪,記憶...)「準備就緒」功能裏面,它是局部的功能。你可以把它的全球,如果你這樣做此想:

window['sayHello'] = function sayHello(what) { 
    alert(what); 
}; 

(這是很好的「功能」關鍵字—後得到功能的「本地」名—的名字,因爲這樣的功能將不會出現在Firebug的「匿名」。)

我會鼓勵你去調查使您的全局函數成一個jQuery插件,或者至少一個jQuery的「全局」,將其置於jQuery對象,而不是「窗口」上。

+0

這是一個很好的暗示,以避免螢火蟲'匿名'那裏... –

+0

是的,謝謝你的幫助,這是非常有用的 – vitto

2

嘗試定義函數sayHello您的通話$(document).ready之外。

0

在上面的代碼中,sayHello()方法僅在匿名功能的範圍內限定。

此代碼可能會工作更好地爲您:

// shared_functions.js 
window.MyNamespace = window.MyNamespace || {}; 
MyNamespace.sayHello = function(what) 
{ 
    alert(what);  
}; 

// page_function_callers.js 
$(document).ready (function() 
{ 
    $("div.my_button").click (function() 
    { 
     MyNamespace.sayHello('hello world');  
    }); 
}); 

確保您加載正確的順序壽你的JS文件。有更優雅的解決方案,但這是一個相當簡單和直接的解決方案。

一個優點這種做法是不污染全局命名空間。

+0

你的代碼可以工作,但有什麼意義?爲什麼推遲聲明直到DOMReady,然後從該範圍中提取它,而不是在DOMReady上下文之外聲明它?你是否知道命名空間在這裏是多餘的;只需輸入'window.sayHello = ...'就可以很好地工作...... –

+0

修改代碼以反映您的意見。如果可能的話,我仍然建議將該代碼放在名稱空間下。 –

3

函數sayHelloDOMReady事件($(document).ready)的scpoe內聲明。它不在該範圍之外。但是沒有需要在該範圍內聲明一個函數。即使sayHello使用了大量的DOM對象(在你的例子事實並非如此),它不會被執行,直到它被調用,所以你唯一需要的,以確保的是,這樣的功能是不是直到DOMReady之後。

所以,你可以簡單地刪除第一個和shared_functions.js最後一行,即$(document).ready(function() {});分別與你的代碼將工作。