0

特定の要素のクリックイベントのバインドを解除するのに問題があります。これは私のJSコードです。

    $(document).on('click','.likecomment', function(e){
        e.preventDefault();
        var commentid = $(this).data('commentid');
        $.ajax({
            type: 'POST',
            url: '?category=likecomment',
            data: {
                "commentid" : commentid
            },
            success: function(){
                $(this).unbind('click');
                var likes = $('#'+commentid+'-likes').text();
                likes++;
                $('#'+commentid+'-likes').html(likes);
            }
        });
    return false;
});

要素の機能は、ワンクリック後も持続します。最初のクリック後にクリックできないようにするにはどうすればよいですか?コードが正しければ、おそらく自分で問題を理解しますが、コードが正しいかどうかを確認したいだけです。

4

3 に答える 3

3

一致する.off構文を使用します。

$(document).off('click','.likecomment');

または、現在の要素を一致させないようにします.likecomment

$(this).removeClass("likecomment");

また

$(this).removeClass("delegated");
// with this change to binding method:
$(document).on('click','.likecomment.delegated', function(e){

ただしthis、成功コールの内部はthis外部と同じではないことに注意してください。このajaxオプションを追加して、ajaxcontext: this,this内部がajaxの外部と同じになるようにする必要があります。

于 2012-10-19T14:36:36.347 に答える
1

これは、サクセスハンドラー内でバインドを解除していることが原因である可能性があります。ajax呼び出しに時間がかかる場合は、バインド解除にも時間がかかります。したがって、$。ajaxを試してから:

$(this).prop({disabled: true});
于 2012-10-19T14:36:01.203 に答える
1

イベントをオブジェクトに委任しているためdocument、ハンドラーはdocument個々の.likecomment要素ではなく、にバインドされます。

委任されたイベントが一致する要素が複数ある場合は、イベントのバインドを解除したくないでしょう。またlikecomment、おそらくスタイルに関連付けられているため、クラスを削除したくないでしょう。

代わりに、別のクラスが追加されたときに不一致を強制するセレクターを使用してください。doneこの例ではが使用されていますがfinished、、、、likedまたはその他の任意のクラス名を使用できます。

$(document).on('click', '.likecomment:not(.done)', function () {...});

また、要素がクリックイベントを発生させないようにする場合は、doneクラスを要素に追加します。

$(this).addClass('done');

新しいクラスを追加すると、likecommentクリックできないように見えるようにのスタイルを変更するためのフックも提供されます。

于 2012-10-19T14:41:20.340 に答える