2012-01-15 5 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

Довольно уверен, что вы будете нуждаться, чтобы обеспечить ему тот же элемент, а также один и тот же селектор.

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

В .on() обработчике this является '.renewal-warning' элементом, была нажата, а не #signRentalContainer элемент.


Если есть несколько из этих '.renewal-warning' элементов, и вы хотите отключить только один, в то время, самый простой способ, чтобы изменить свой класс так, чтобы он больше не соответствует селектору.

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

Почему в этом случае ручка не работает? Я думал, что jQuery изменил область действия в соответствии с событием? – Steven

+0

@Steven: О, почему вы делаете '.off()'? Я предполагаю, что событие бурлит. Вместо 'off()', попробуйте добавить 'e.stopPropagation()' к обработчику. –

+0

... или возможно из-за '.click()', который вы делаете над элементом, который уже был нажат. Почему это? Попробуйте удалить его. –

3

Поскольку this относятся к контексту функции ручки, а не сама функция.

Try делает его именем функции, то обратитесь к нему, когда вы звоните off:

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

Кстати, какой-либо причине мы не можем использовать unbind прямо здесь?

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

+2

причина не использовать unbind: просто попробуйте придерживаться того, что рекомендует команда jQuery. «С jQuery 1.7, .on() и.off() предпочтительнее прикреплять и удалять обработчики событий по элементам. "[Источник] (http://api.jquery.com/unbind/) – Steven

+0

@Steven получил это :) – satoru

+1

@Steven« предпочитал ».. это слово, которое я не хочу слышать по документации. Это либо способ делать, либо не делать. «Предпочтительные» звуки сумасшедшие –

Смежные вопросы