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は、DOMReadyイベント ( $(document).ready) のスコープ内で宣言されます。その範囲外では利用できません。ただし、そのスコープ内で関数を宣言する必要はありません。多くのDOMオブジェクトを使用している場合でもsayHello(あなたの例ではそうではありません)、呼び出されるまで実行されないため、確認する必要があるのは、そのような関数がDOMReadyの後まで呼び出されないことだけです.

したがって、shared_functions.js の最初と最後の行、つまり$(document).ready(function() {and を});それぞれ削除するだけで、コードが機能します。

于 2010-02-13T16:31:18.350 に答える
2

sayHellocall の外で関数を定義してみてください$(document).ready

于 2010-02-13T16:29:36.423 に答える
2

「ready」関数内で「sayHello」(シャーロット教会の歌を覚えている人はいますか?まあ、思い出です...)を宣言すると、その関数に対してローカルになります。必要に応じて、次のようにしてグローバルにすることができます。

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

(関数に「ローカル」名 (「関数」キーワードの後の名前) を付けると便利です。これは、関数が 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 ファイルを正しい順序でロードしていることを確認してください。もっと洗練された解決策がありますが、これはかなり単純でわかりやすいものです。

このアプローチの利点の 1 つは、グローバル名前空間を汚染しないことです。

于 2010-02-13T16:30:48.510 に答える