2

現在、私のプロジェクトにフラグ機能を追加していますが、jQuery の$(this)セレクターを動作させることができません。

これの目的は、ユーザーがクリックしたときに from のテキストを to に変更し、ajax クエリが正常に実行されるようにすることdivです。私のHTML/PHPは次のとおりです。flagflagged

<div class="flag" post_to_flag='".$post_to_flag."'>Flag</div>

そして、を扱う私のjavascriptdivは次のとおりです。

$('.flag').live('click', function () {
    $.post('../php/core.inc.php', {
        action: 'flag',
        post_to_flag: $(this).attr('post_to_flag')
    }, function (flag_return) {
        if (flag_return == 'query_success') {
            $(this).text('flagged');
        } else {
            alert(flag_return);
        }
    });
});

テキストをflaggedに置き換えることはできませんが、thisセレクターを.flagセレクターに置き換えると、すべてがページ上のフラグのクラスに置き換えられます。

チェックしたところ、$(this)セレクターは「post_to_flag」の属性をうまく取得しています。なぜこれが起こっているのですか? どうすれば修正できますか?

4

2 に答える 2

8

コンテキスト変数を追加する必要があります。

$('.flag').live('click', function () {
    var $context = $(this);
    $.post('../php/core.inc.php', {
        action: 'flag',
        post_to_flag: $context.attr('post_to_flag')
    }, function (flag_return) {
        if (flag_return == 'query_success') {
            $context.text('flagged');
        } else {
            alert(flag_return);
        }
    });
});

jQuery選択呼び出し内で複数の関数を呼び出しています。その$.post()機能に入ると、スコープが変わります。thisは、内部にいたときとは異なるスコープを参照するようになりましたone()

@Moak の提案では、変数を jQuery オブジェクトに設定する場合は、$将来の読者や自分自身にとって明確になるように、変数を先頭で示すのがおそらく最善です。

于 2013-05-10T03:39:51.100 に答える