2012-01-15 15 views
8

何らかの理由でjQuery.off( 'click')がここで動作していないようです。モデルで「はい」ボタンをクリックすると、別のモデルがポップアップします。私は間違って何をしていますか?jQuery.off()はバインディングを削除していません

コード:

$(function(){ 

    //If there are warnings on the page bind alert 
    if ($('.renewal-warning').length > 0){ 

    (function(){ 

     $('#signRentalContainer').on('click', '.renewal-warning', function(e){ 

     var buttonHandle = this; 

     //Prevent submission 
     e.preventDefault(); 

     //Show warning model 
     $.modal({ 
      content: $('#renewalWarning').html(), 
      title: "Order Renewal Warning", 
      buttons: { 
      'Yes': function(win) { $(buttonHandle).off('click').click(); }, 
      'No': function(win) { win.closeModal(); } 
      }, 
      maxWidth: 250, 
      closeButton: false 
     }); 
     }); 
    })(); 
    } 
}); 

答えて

10

あなたはそれを同じ要素だけでなく、同じセレクタを提供する必要があるとしているかなり確信して。 .on()ハンドラで

$('#signRentalContainer').off('click', '.renewal-warning'); 

thisがクリックされた'.renewal-warning'要素、ない#signRentalContainer要素です。


がこれら'.renewal-warning'の要素のいくつかはある、とあなたは一度に1を無効にしたい場合は、最も簡単な方法は、それはもはや、セレクタに一致するように、そのクラスを変更しないことです。

$(this).removeClass('renewal-warning') 
     .addClass('renewal-warning-disabled'); 
+0

なぜこの場合ハンドルが機能しないのですか?私はjQueryがイベントにマッチする範囲を変更したと思いましたか? – Steven

+0

@Steven:ああ、なぜあなたは '.off()'をやっているのですか?私はイベントがバブリングしていると思っています。 'off()'の代わりに 'e.stopPropagation()'をハンドラに追加してみてください。 –

+0

...それは、すでにクリックされた要素でやっている '.click()'のためです。それはなぜそこにあるのですか?削除してください。 –

3

thisは、ハンドル関数のコンテキストではなく、関数自体を参照しているため。それをという名前の関数を作る

てみてください、あなたはoffを呼び出すときに、それを参照してください。

$("body").off("click", '#signRentalContainer', buttonHandle);

ところで、どのような理由は、我々は直接ここにunbindを使用することはできませんか?

$("#signRentalContainer").unbind("click");

+2

アンバインドを使用しない理由:ちょうど試してみてくださいjQueryチームが推奨するものに固執する。 "jQuery 1.7以降、.on()と。(ソース:http://api.jquery.com/unbind/) – Steven

+0

@Stevenはそれを持っています:) – satoru

+1

@スティーブン "優先" ..それは私は文書で聴きたいとは思っていません。それはやり方とは別の方法です。 –

関連する問題