0

このようにスパンのクリックイベントをつけました。スパンはテーブル内にあります。

 $("#tblImport").find("span").each(function () {
                $(this).click(function () {
                    appendData(this);
                });
            });

このイベント ハンドラ「appendData」は ajax リクエストを作成し、データを取得します。

 function appendData(prntSpan) {
            $(prntSpan).append(createElements());//ajax call.
            updateEvents(prntSpan);
        }

私が望むのは、このクリック イベント ハンドラーをデタッチして、新しいハンドラーをアタッチすることです。だから私はこれを試しました。

function updateEvents(curntSpan) {
        $(curntSpan).off('click');//this works
        $(curntSpan).off('click', appendData);// but this does not work strange
        $(curntSpan).on('click', toggleData(curntSpan));//nor a new click handler is attached
    }

.on が使用されている上記の行が実行されると関数が呼び出されますが、その後スパンをクリックしてもイベントは発生しません。

4

3 に答える 3

2

.on()関数チェックの構文が間違っています。したがって、私の意見では、次のコードを変更する必要があります。

$("#tblImport span").click(function (e) {
                e.stopPropagation();
                appendData(this);
            });

これはよりクリーンな構文です。

function updateEvents(curntSpan) {
        $(curntSpan).off('click');//this works
        $("#tblImport").on('click', curntSpan, function() { toggleData(curntSpan); });
    }
于 2012-07-19T11:20:33.660 に答える
1
function updateEvents(curntSpan) {
    /* ... */
    $(curntSpan).on('click', toggleData(curntSpan));
}

これが行うことは次のとおりです。

  1. を評価$(curntSpan)し、jQuery オブジェクトを生成します
  2. .onその属性にアクセスする
  3. 'click'andを評価しtoggleData(curntSpan)、文字列と何か他のものを生成します
  4. .on文字列と前のステップの何かを引数として属性を呼び出します

代わりに、次のようなものが必要だと思います。

function updateEvents(curntSpan) {
    /* ... */
    $(curntSpan).on('click', function(){ toggleData(curntSpan) });
}

ステップ 3 では、これはfunction(){ toggleData(curntSpan) }代わりに評価されます。結果は、呼び出されたとき (つまり、イベントが発生したとき)に呼び出されるtoggleData(curntSpan)関数です。toggleData(curntSpan)click

一般的な規則:

  1. 関数が呼び出されるたびに、その引数が評価されます
  2. 関数呼び出しを評価するとき、たとえばf(x)、関数を実行して結果を取得します。
  3. たとえば、関数を評価するfunction() { /* f(x) */ }と、結果は単純にその関数になります (ここでは、コメント アウトされているため、引数を取らず、本体が空の関数です)。

同じ論理が、ページが「起動」されたときにコードを実行するのでは$(function() { /* ... */ })なく、実行する理由です。$(f(x))

于 2013-07-07T06:01:03.607 に答える
0
 $(curntSpan).off('click', appendData);

最初にappendDataをハンドラーとして配置しないため、機能しません。ハンドラーに匿名関数を配置すると、appendDataを実行できますが、appendData自体は実行しません

于 2012-07-19T10:47:52.897 に答える