从另一个包含的JavaScript调用包含的JavaScript代码的函数
我试图在我的页面中使用不同的加载的从另一个包含的JavaScript调用包含的JavaScript代码的函数,javascript,jquery,function-calls,Javascript,Jquery,Function Calls,我试图在我的页面中使用不同的加载的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_func
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!");
});
});
//共享函数.js
$(文档).ready(函数(){
函数sayHello(什么){
警惕(什么);
}
});
//page_function_callers.js
$(文档).ready(函数(){
$(“div.my_按钮”)。单击(函数(){
说你好(“你好,世界!”);
});
});
我使用jQuery,我希望使用这种方式,因为它应该允许我重新命名许多公共方法。我错在哪里?尝试在调用
$(文档)之外定义函数sayHello
。ready
在上面的代码中,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文件。还有更优雅的解决方案,但这是一个相当简单和直接的解决方案
这种方法的一个优点是不会污染全局名称空间。函数
sayHello
在DOMReady
事件($(document).ready
的scpoe中声明。在该范围之外,它将不可用。但不需要在该范围内声明函数。即使sayHello
使用了很多DOM对象(在您的示例中没有),它也不会在被调用之前被执行,因此您需要确保的唯一一件事是直到DOMReady之后才调用这样的函数
因此,您只需删除shared_functions.js中的第一行和最后一行,即$(document).ready(function(){
和})当你在“ready”函数中声明“sayHello”(有人记得Charlotte Church的那首歌吗?天哪,记忆…)时,它是该函数的本地函数。如果您愿意,您可以通过以下方式实现全球化:
window['sayHello'] = function sayHello(what) {
alert(what);
};
(最好给函数一个“本地”名称——“函数”关键字后面的名称,因为这样函数就不会在Firebug中显示为“匿名”)
我鼓励您研究将全局函数变成jQuery插件,或者至少是一个jQuery“全局”函数,方法是将其放在jQuery对象而不是“窗口”上。您的代码可以工作,但有什么意义呢?为什么要将声明推迟到DOMReady,然后从该范围中提取它,而不是在DOMReady上下文之外声明它呢?您是否知道名称空间在这里是多余的;只需键入window.sayHello=…
同样有效…修改代码以反映您的评论。如果可能的话,我仍然建议将此代码放在名称空间下。