2

我正在尝试在我的页面中加载不同的内容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,我想使用这种方式,因为它可以让我回收许多公共方法。我哪里错了?

4

4 回答 4

3

该函数在事件 ( )sayHello的 scpoe 中声明。它在该范围之外将不可用。但是无需在该范围内声明函数。即使使用了很多 DOM 对象(在您的示例中它没有),它也不会在被调用之前执行,因此您唯一需要确保的是在 DOMReady 之后才调用这样的函数。DOMReady$(document).readysayHello

因此,您可以简单地删除 shared_functions.js 中的第一行和最后一行,即分别删除$(document).ready(function() {和,您的代码将正常工作。});

于 2010-02-13T16:31:18.350 回答
2

尝试在sayHellocall 之外定义函数$(document).ready

于 2010-02-13T16:29:36.423 回答
2

当你在“ready”函数中声明“sayHello”(有人记得 Charlotte Church 的歌曲吗?天哪,回忆......)时,它是该函数的本地函数。如果您愿意,可以通过以下方式使其全球化:

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

(最好给函数一个“本地”名称——在“function”关键字之后的名称——因为这样该函数就不会在 Firebug 中显示为“匿名”。)

我鼓励你研究将你的全局函数变成一个 jQuery 插件,或者至少是一个 jQuery“全局”,方法是将它放在 jQuery 对象而不是“窗口”上。

于 2010-02-13T16:32:24.000 回答
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 文件。那里有更优雅的解决方案,但这是一个相当简单和直接的解决方案。

这种方法的一个优点是不会污染全局命名空间。

于 2010-02-13T16:30:48.510 回答