2012-10-03 18 views
15

Aquí está el escenario, mi contenido se carga de forma asincrónica en función de una clase. Entonces, si tengo un enlace con la clase ajaxLink, se activa de la siguiente manera:Prevenir eventos de clics múltiples activando JQuery

$('a.ajaxLink').click(function (e) { 
     e.preventDefault(); 
     var container = $(this).parents('div.fullBottomContent'); 
     var href = $(this).attr('href'); 
     container.fadeOut('fast', function() { 
      $.ajax({ 
       url: href, 
       dataType: "html", 
       type: "GET", 
       success: function (data) { 
        container.html(data); 
        BindEventHandlers(); 
        container.fadeIn(); 
        $.validator.unobtrusive.parse('form'); 
       }, 
       error: function() { 
        alert('An error has occurred'); 
       } 
      }); 
     }); 

    }); 

Todo encantador. Ahora bien, en un caso, quiero mostrar una advertencia al usuario a confirm que quieren cargar la página y suelta todos sus cambios, así que he escrito esto:

$('a.addANewHotel').click(function (e) { 
     if (!confirm('Adding a new hotel will loose any unsaved changes, continue?')) { 
      e.stopPropagation(); 
     } 
    }); 

Ahora he intentado return false, y e.preventDefault()e.stopPropagation(); pero no importa cuál sea el primer método que se active siempre? ¿Cómo puedo evitar que se active el evento de clic adicional? ¿Es esto una orden de eventos?

no veo cómo esto es relevante, pero mi HTML es:

<a style="" href="/CMS/CreateANewHotel?regionID=3&amp;destinationID=1&amp;countryName=Australia" class="button wideBorderlessButton ajaxLink addANewHotel">Add a new hotel</a> 
+0

¿Cómo es tu html como? – Asciiom

+0

No creo que el HTML tenga nada en él, pero agregó de todos modos – Liam

+1

No entiendo por qué lo haces al vincular 2 eventos diferentes a un mismo elemento. Solo mostraría/no mostraría el mensaje de confirmación dependiendo de qué elemento se hizo clic, pero todo dentro del mismo evento de clic (por ejemplo, usando un hasClass) – Th0rndike

Respuesta

27

¿Has probado: event.stopImmediatePropagation?

creo que es lo que busca:

http://api.jquery.com/event.stopImmediatePropagation/

$('a.addANewHotel').click(function (e) { 
     if (!confirm('Adding a new hotel will loose any unsaved changes, continue?')) { 
      e.stopImmediatePropagation(); 
      e.preventDefault(); 
     } 
    }); 
+0

No funciona. Tiene dos manejadores en el mismo elemento, esto solo detendría la propagación a los elementos principales y no lo ayudaría con este problema. – Asciiom

+2

Desde el documento: "Impide que el resto de los controladores se ejecuten y evita que el evento burbujee en el árbol DOM". – bstakes

+0

Mi error lo siento, ¡tienes toda la razón! – Asciiom

1

stopPropagation detendría el caso de burbujeo a los elementos primarios, no impide que otras personas que manipulan clic en el mismo elemento se dispare. Entonces tu solución no funcionará

Usted puede hacerlo de esta manera, por ejemplo:

$('a.ajaxLink').click(function (e) { 
    e.preventDefault(); 

    if($(this).hasClass("a.addANewHotel") && 
      !confirm('Adding a new hotel will loose any unsaved changes, continue?')){ 
     return false; 
    } 

    var container = $(this).parents('div.fullBottomContent'); 
    var href = $(this).attr('href'); 
    container.fadeOut('fast', function() { 
     $.ajax({ 
      url: href, 
      dataType: "html", 
      type: "GET", 
      success: function (data) { 
       container.html(data); 
       BindEventHandlers(); 
       container.fadeIn(); 
       $.validator.unobtrusive.parse('form'); 
      }, 
      error: function() { 
       alert('An error has occurred'); 
      } 
     }); 
    }); 

}); 

Si desea tener una gran cantidad de diferentes tipos de enlaces que debe poner el código común en una función y se unen los controladores utilizando la clase de diferenciación. Estos manejadores pueden llamar al código común cuando sea apropiado.

+0

+1 Sí, podría ser mejor si no tuviese que clternar mi clic genérico ajaxLink con muchos if if else? – Liam

+0

Depende, si tuviera muchos tipos diferentes de enlaces que necesitan un manejo diferente, esto se llenaría, pero para esta excepción, es aceptable, creo. Sugerencia adicional agregada a la respuesta. – Asciiom

Cuestiones relacionadas