我正在尝试在我的页面中处理不同的加载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并且我想使用这种方式,因为它应该让我回忆许多公共方法。哪里我错了?
答案 0 :(得分:3)
函数sayHello
在DOMReady
事件($(document).ready
)的scpoe内声明。它不会在该范围之外。但是没有需要来声明该范围内的函数。即使sayHello
使用了很多DOM对象(在你的例子中它没有),它在被调用之前不会被执行,所以你唯一需要确保的是这样的函数不是在DOMReady之后调用。
所以你可以简单地删除shared_functions.js中的第一行和最后一行,分别是$(document).ready(function() {
和});
,你的代码就可以了。
答案 1 :(得分:2)
尝试在通话sayHello
之外定义功能$(document).ready
。
答案 2 :(得分:2)
当你在“准备好”的功能中声明“sayHello”(有人记得夏洛特教会的歌曲吗?Gosh,记忆......)时,它就是那个功能的本地。如果您愿意,可以将其设为全局:
window['sayHello'] = function sayHello(what) {
alert(what);
};
(很高兴为函数提供一个“本地”名称 - “function”关键字后面的名称 - 因为这个函数在Firebug中不会显示为“匿名”。)
我鼓励你研究把你的全局函数变成一个jQuery插件,或者至少把jQuery“global”放在jQuery对象而不是“window”上。
答案 3 :(得分: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文件。有更优雅的解决方案,但这是一个相当简单和直接的解决方案。
这种方法的一个优点是不会污染全局命名空间。