2012-01-15 23 views
8

Per qualche motivo jQuery.off ('click') non sembra funzionare qui. Quando si fa clic sul pulsante "Sì" nel modello, viene visualizzato un altro modello. Che cosa sto facendo di sbagliato?jQuery.off() non rimuove il binding

codice:

$(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 
     }); 
     }); 
    })(); 
    } 
}); 

risposta

10

Abbastanza sicuro che si sta andando ad avere bisogno di fornire lo stesso elemento, così come lo stesso selettore.

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

Nel gestore .on(), this è l'elemento '.renewal-warning' che è stato cliccato, non l'elemento #signRentalContainer.


Se ci sono parecchi di questi '.renewal-warning' elementi, e si desidera solo per disattivare uno alla volta, il modo più semplice è quello di cambiare la sua classe in modo che essa non corrisponde più il selettore.

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

Perché non è la maniglia che lavorano in questo caso, però? Pensavo che jQuery avesse cambiato lo scope per abbinare l'evento? – Steven

+0

@Steven: Oh, è per questo che stai facendo il '.off()'? Immagino che l'evento stia bollendo. Invece di 'off()', prova ad aggiungere 'e.stopPropagation()' al gestore. –

+0

... o forse a causa del '.click()' che stai facendo sull'elemento che era già stato cliccato. Perché è lì? Prova a rimuoverlo. –

3

Poiché il this riferiscono al contesto della funzione maniglia, non la funzione stessa.

provare a fare è una funzione denominata, quindi fare riferimento ad esso quando si chiama off:

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

BTW, qualsiasi motivo non possiamo usare unbind direttamente qui?

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

+2

motivo per non usare unbind: provaci attenersi a ciò che il team di jQuery consiglia. "A partire da jQuery 1.7, .on() e.i metodi off() sono preferiti per collegare e rimuovere i gestori di eventi sugli elementi. "[Source] (http://api.jquery.com/unbind/) – Steven

+0

@Steven lo ha ottenuto :) – satoru

+1

@Steven" preferito ".. questo è un parola che non voglio sentire sulla documentazione: è il modo di fare o meno il modo di farlo .. "preferito" sembra pazzesco –

Problemi correlati