2012-01-15 10 views
8

Por alguna razón, jQuery.off ('clic') no parece estar funcionando aquí. Cuando se hace clic en el botón "Sí" en el modelo, aparece otro modelo. ¿Qué estoy haciendo mal?jQuery.off() no está eliminando el enlace

código:

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

Respuesta

10

bastante seguro de que va a necesitar que le proporcione el mismo elemento, así como el mismo selector.

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

En el controlador .on(), this es el elemento '.renewal-warning' que se hizo clic, no el elemento #signRentalContainer.


Si hay varios de estos elementos '.renewal-warning', y sólo desea desactivar uno a la vez, la forma más sencilla es cambiar su clase de manera que ya no pega con el selector.

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

¿Por qué no funciona el mango en este caso? Pensé que jQuery cambió el alcance para que coincida con el evento? – Steven

+0

@Steven: Oh, ¿es por eso que estás haciendo el '.off()'? Supongo que el evento está burbujeante. En lugar de 'off()', intente agregar 'e.stopPropagation()' al manejador. –

+0

... o tal vez sea por el '.click()' que estás haciendo en el elemento que ya ha sido cliqueado. ¿Por qué está ahí? Intenta eliminarlo –

3

Debido a que el this se refieren al contexto de la función de mango, no la propia función.

trate de hacer que una función llamada, a continuación, se refieren a ella cuando se llama off:

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

Por cierto, ninguna razón por la que no se puede utilizar directamente unbind aquí?

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

+2

razón por la que no se usa la opción de deshacer la unión: solo lo intento seguir con lo que recomienda el equipo de jQuery. "A partir de jQuery 1.7, el .on() y.Se prefieren los métodos off() para adjuntar y eliminar controladores de eventos en elementos. "[Fuente] (http://api.jquery.com/unbind/) – Steven

+0

@Steven lo tengo :) – satoru

+1

@Steven" preferido "... eso es un palabra que no quiero escuchar en la documentación. Es la forma de hacer o no la manera de hacerlo. "Preferido" suena loco –

Cuestiones relacionadas