2011-08-16 15 views
0

に解雇された私は、このコードではjQueryを使って昨日の潜在的なバグを発見:可能なjQueryのバグ - イベントがまだ変更クラス要素

$(document).ready(function() { 

    $('.likedLink').click(function(){ 
     return false; 
    }); 


    $('.likes').click(function(){ 

     var id = $(this).attr('id'); 
     var currentLike = id; 
     id = id.replace('p',''); 


     $.ajax({ 
      type: "POST", 
      url: "/posts/like", 
      data: "id=" + id, 
      success: function(like){ 
       $('#' + currentLike).html(like).removeClass('likes').addClass('likedLink'); 
      } 
     }); 


     return false; 

    }); 

}); 

をポストバックナンバーを受信して​​、現在のクリックしたリンクのHTMLを設定し、新しい値私はそれから、さらにクリックすることを避けるために、要素のクラスを変更します/ AJAX-ing。

コードが機能し、新しいHTMLを受け取り、クラスを正しく変更しましたが、ユーザー/私がクリックしたときにAJAXイベントがまだ起動されましたが、別のクラスだったので解雇してはいけませんでした。

これはjQueryのバグですか? (ちなみに

は、私は.replaceWith("<p>" + like + "</p>").html()を変更することで、コードを固定しますが、私は、これはあなたがライブ(使用する必要が

答えて

2

これはバグではありません!

セレクタは作成時にのみ評価されます。後でクラス名を変更しても、イベントはバインド解除されません。

あなたはそれをアンバインドする必要があります:

$.ajax({ 
    type: "POST", 
    url: "/posts/like", 
    data: "id=" + id, 
    success: function(like){ 
     $('#' + currentLike).html(like).unbind('click'); 
    } 
}); 

も、クラス名を変更する必要はありませんが。

+0

+1。バインドを解除する理由はありますか? – naveen

+0

1つの要素からバインドを解除しますか?ユーザーが安心すれば、リバインドする必要がありますか?私はそれが好きか分からない。 –

0

が起こったか非常に興味があった)、または代理人)の代わりにクリックします()。 click()関数はイベントを一度割り当て、変更されたかどうかをチェックしません。

1

click(ショートカットはbind("click", handler);)を使用すると、ハンドラが要素自体に接続されるため、クラスまたは親の変更はハンドラに影響しません。要素がまだそのクラスを持っている場合にのみ、そのコールバックを実行する$(".likes").live("click, handler);を試すことができます

+1

この場合、 'live'を使用するのは本当に不要です。その場合、要素がクラスを失った後でも、jQueryはクリックされるたびにテストしなければなりません(*他の要素*がクリックされるたびに)。後でイベントをバインド解除するほうがずっと良いでしょう。私の答えを見てください。 –

関連する問題