1

jQueryを再確認しようとしていますが、開始するのに問題があります。

以下のコードでは、「DOMの準備ができたら、アラートを「choice」divの変更イベントにバインドします。これは実際にはフォームのselect要素です。アラートが表示されているのにフォームをリロードするとすぐに表示され、新しい選択を行っても表示されません。

コードは次のとおりです。

$(document).ready(doBind());

function doBind() {
    $('#choice').change(myAlert('Choice has been changed!'));    
}

function myAlert($msg) {
    alert($msg);
}
4

4 に答える 4

4

関数参照と呼び出し(呼び出し)を区別する必要があります。イベントハンドラーまたはコールバックを関連付ける場合、適切なタイミングで呼び出される関数参照が必要です。引数を渡して関数参照に追加(..)(またはnullary )すると、それが呼び出されます。バインド中にこれを行うと、関数はバインド時に呼び出され、参照をバインドするのではなく、関数の出力がバインドされます(これにより、通常予想される後の呼び出しが可能になります)。()

次のように両方のバインディングを変更する必要があります。

   $(document).ready(doBind); //Now a reference to that function

    function doBind() {
        $('#choice').change(function() { myAlert('Choice has been changed!');});    
       //New anonymous function reference which allows for arguments and is conventionally used
    }

    function myAlert($msg) {
        alert($msg);
    }

構文との使用法の違いを強調するためのいくつかの簡単な例()

以下の関数は関数参照を取ります。引数として、それを内部で実行します(基本的にハンドラーとコールバックの仕組み)。

functionWrapper = function(funk) {
  //Do something else
  funk()
}

現在人気のある無名関数宣言とそれに続く即時呼び出し:関数が書き込まれることが多くfunction() {...}()、新しく作成された関数への参照が、提供された引数を使用して即座に呼び出されます(JavaScriptでスコープを強制するのに役立ちます)。どちらの場合も引数は関数のパラメーターとして使用できるため、呼び出しに含まれるものはすべて(..)、で宣言されるものにマップされますfunction(..)が、参照と呼び出しに焦点を当てることが質問の主な問題です。

于 2012-09-30T01:32:41.477 に答える
2

機能私のアラートは次のようにする必要があります:

function myAlert($msg) {
    return function() {
        alert($msg);
    }
} 

これは、関数をに渡す必要があるためですchange。を実行する場合myAlert('Choice has been changed!')、渡すのは関数ではなく、myAlert実行後の結果です。

于 2012-09-30T01:06:00.427 に答える
2
$(document).ready(doBind);

function doBind() {
    $('#choice').on('change', function(){alert('Choice has been changed!')});
}
  1. 関数をオブジェクトとして渡します。()は関数を実行し、それをオフのままにすると、関数はオブジェクトとして扱われます。コールバックを示すときは、関数をオブジェクトとして渡します(実行している関数が関数オブジェクトを返さない限り、これはカリー化と呼ばれます)。

  2. $.on最新のjqueryでイベントをバインドするための推奨される方法です。あなたはそれのドキュメントをここで見つけることができます。

  3. 通常、次のように関数を作成します。var doBind = function() { //doBind stuff }これは、関数をオブジェクトとして渡していることを認識するのに役立ち、グローバル名前空間が乱雑になるのを防ぎます。

お役に立てれば :)

于 2012-09-30T01:30:46.100 に答える
1

これまでに与えられたすべての答えはとても良いです。しかし、彼らが言及していないのは、これは一般的にjQueryコードを書く方法ではないということです。通常、ドキュメントがロードされるときに初期化することがたくさんあります。したがって、物事が実際に常に記述される方法は、本体がすべてのローカル変数、関数、および初期化である無名関数を使用することです。したがって、個別のdoBind()関数を使用するのではなく、次のように記述します。

$(document).ready(function () {
    $('#choice').change(myAlert);
    function myAlert($msg) {
        alert($msg);
    }
});

これは非常に一般的であるため、jQueryはその簡略表記を提供します。

$(function () {
    $('#choice').change(myAlert);
    function myAlert($msg) {
        alert($msg);
    }
});

別の名前付き関数を使い続けたい場合は、次のように記述できます。

$(doBind);
于 2012-09-30T02:21:07.090 に答える