2

私は大まかに次のことを行っています。

var i;
var k = 5;
$('document').ready(function () {
    $('#someElement').click(function (e) {
        e.stopImmediatePropagation();
        i++;
        if (i >= k) {
            my_function();
        });
    }
});
my_function() {
    alert(i);
    $('#myDisplay').text("You have clicked on '#someElement' " + i + "times");
}

「#someElement」をクリックすると、予想どおり「my_function()」が起動しますが、アラート ボックスが 5 回表示されます!!!.

迅速かつ明白な解決策は、my_function() の内容を配置し、それらを '#someElement' に接続された if 制御ステートメントに配置することですが、私は概説した構造を維持することに非常に熱心であり、単純なそうする方法。

何か案は?

アップデート

私は当初、「クリック」イベント内からの関数呼び出しに問題があると想定していました。そうではありませんでした。問題は、ネストされた「ajaxComplete」呼び出しと関係があると思います。

var i = 0;

$('document').ready(function () {

    $('<div id="someElement">Click me</div>').appendTo('body');
    $('<div id="myDisplay"></div>').appendTo('body');
    $('#someElement').click(function (e) {
        i++;
        $.get("test.html", function(html)
        {       
            $(html).ajaxComplete(function()
            {
                my_function(i);
            });
        });

    });

});

function my_function(n)
{

    switch (n)
    {

    case 1:
        alert(n);
        $('#myDisplay').text("this is case " + n);
        break
    case 2:
        alert(n);
        $('#myDisplay').text("this is case " + n);
        break
    case 3:
        alert(n);
        $('#myDisplay').text("this is case " + n);
        break

    default:
        alert('A great detective always breaks the case. :)');
        break

    }

}

case ステートメントが前の例の 'if' ステートメントを役に立たなくするので、定数 'k' を省略しました。上記のコードは、私が遭遇した問題をよりよく表しています。

どんな助けでも大歓迎です。:)

4

1 に答える 1

3

更新された質問に基づいて編集:

問題は$.ajaxComplete()、コールバックで呼び出していることです。あなたはそれを取り除くべきです。必要なのは匿名のコールバック関数だけです。

の目的は、任意のajax リクエストが完了し$.ajaxComplete()たときに実行するデフォルト関数をセットアップすることです。これが必要な場合は、現在のコールバックから取り出して、1 回だけ実行されるように呼び出しに配置する必要があります。.ready()

現在行っている方法では、クリック (および成功した応答) ごとに、別の同一のハンドラーを追加しています。したがって、5 回クリックすると、同じクリック ハンドラーが 5 つあります。

ドキュメントから: http://api.jquery.com/ajaxComplete/

Ajax リクエストが完了するたびに、jQuery は ajaxComplete イベントをトリガーします。この時点で、.ajaxComplete() メソッドで登録されたすべてのハンドラーが実行されます。


元の答え

これは実際のコードであってはなりません。

function関数の宣言がありません。iのような値で初期化する必要があり、ハンドラー0の閉じ括弧が間違っています。click

とはいえ、修正すると、あなたのコードはうまく機能します。

試してみてください: http://jsfiddle.net/sGWjL/1/

アラートが 5 回ポップアップする場合は、使用されているコード (または実際のコード) をさらに貼り付ける必要があります。

var i = 0;
var k = 5;

$('document').ready(function () {
    $('#someElement').click(function (e) {
        e.stopImmediatePropagation();
        i++;
        if (i >= k) {
            my_function();
        }
    });
});

function my_function() {
    alert(i);
    $('#myDisplay').text("You have clicked on '#someElement' " + i + "times");
}​
于 2010-08-02T00:01:25.407 に答える