2012-10-03 12 views
15

Ecco lo scenario, il mio contenuto viene caricato in modo asincrono in base a una classe. Quindi, se ho un legame con la classe ajaxLink spara come di seguito:Impedire l'attivazione di più eventi click 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'); 
       } 
      }); 
     }); 

    }); 

tutto molto bello. Ora, in un caso voglio visualizzare un messaggio di avviso per l'utente di confirm che vogliono caricare la pagina e sciolto tutte le loro modifiche in modo ho scritto questo:

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

ora ho provato return false, e.preventDefault() e e.stopPropagation(); ma non importa quale sia il primo metodo che viene sempre attivato? Come posso impedire l'attivazione dell'evento di clic in più? È una cosa dell'ordine degli eventi?

Non vedo come questo sia rilevante, ma il mio HTML è:

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

cosa fa il tuo html assomiglia? – Asciiom

+0

Non penso che l'HTML non abbia accennato ma aggiunto comunque – Liam

+1

Non capisco perché lo stai legando 2 eventi diversi a uno stesso elemento. Vorrei solo mostrare/non mostrare il messaggio di conferma a seconda dell'elemento su cui è stato fatto clic, ma tutto all'interno dello stesso evento click (ad esempio usando una hasClass se) – Th0rndike

risposta

27

Hai provato: event.stopImmediatePropagation?

Credo che sia quello che stai cercando:

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

Non funziona. Ha due gestori sullo stesso elemento, questo fermerebbe solo la propagazione agli elementi padre e non lo aiuterà a risolvere questo problema. – Asciiom

+2

Dalla documentazione: "Mantiene il resto degli handler da eseguire e impedisce che l'evento esploda sull'albero DOM." – bstakes

+0

Mi dispiace, hai completamente ragione! – Asciiom

1

stopPropagation avrebbe impedito l'evento da bubbling a elementi padre, non impedire ad altri gestori di clic sullo stesso elemento di sparare. Quindi la tua soluzione non funzionerà.

Si potrebbe fare in questo modo, ad esempio:

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

}); 

Se si avrebbe un sacco di diversi tipi di link si dovrebbe mettere il codice comune in una funzione e si legano i gestori che utilizzano la classe di differenziazione. Questi gestori possono quindi chiamare il codice comune quando appropriato.

+0

+1 Sì, potrei, sarebbe più bello se non dovessi aggiungere il mio generico ajaxLink click con un sacco di if else? – Liam

+0

Dipende, se tu avessi molti diversi tipi di link che hanno bisogno di una gestione diversa questo sarebbe ingombrato, ma per questa eccezione è accettabile, penso. Suggerimento aggiuntivo aggiunto per rispondere. – Asciiom