2013-08-09 11 views
16

Qualcuno può spiegare qual è la differenza tra event.preventDefault() e event.stopPropagation()?event.preventDefault vs event.stopPropagation

Ho una tabella e all'interno di quella tabella ho un tag img.

Quando faccio clic sul tag img, voglio vedere un popup.

Ma voglio anche per fermare la selezione di più righe, per cui uso:

$("table.items tbody tr").click(function(event) { 
     event.stopPropagation(); 
    }); 

Quando uso il codice js, non appare il popup;

Se elimino il codice js, il popup funziona.

$(".info").live("click",function(e){ 
    //console.log('ok'); 
    e.stopPropagation(); 
    var elem = $(this); 
    var id = $(this).attr("id").replace("image_","container_"); 
    $('#'+id).toggle(100, function() { 
     if($(this).css('display') == 'block') { 
      $.ajax({ 
       url: "$url", 
       data: { document_id:elem.attr('document_id') }, 
       success: function (data) { 
        $('#'+id).html(data); 
       } 
      }); 
      } 
     }); 
}); 

Perché?

+2

Questo ti aiuterà http://davidwalsh.name/javascript-events – L10

+1

Mostra la tua struttura html in modo da sapere dove si trova l'immagine rispetto alla struttura della tabella – Huangism

+0

È troppo tardi per interrompere la selezione su "click"; usa 'mousedown'. – canon

risposta

35

Io non sono un esperto di Javascript, ma per quanto ne so:

stopPropagation è usato per assicurarsi che l'evento non bolla in alto nella catena. per esempio. un clic su un tag <td> potrebbe anche generare eventi di clic sul suo genitore <tr>, quindi il suo genitore <table>, ecc. stopPropagation impedisce che ciò accada.

preventDefault viene utilizzato per interrompere l'azione normale di un elemento, ad es. preventDefault in un gestore di clic su un collegamento interromperà il collegamento seguito o un pulsante di invio interromperà la presentazione del modulo.

+0

@CrisimIlNumenoreano il tuo commento non ha senso. la risposta di sevenseacat sembra corretta al 100% per me e può essere verificata con le risposte sulla [domanda dup] (http://stackoverflow.com/questions/5963669/whats-the-difference- between-event-stoppropagation-and-event- preventdefault) nonché con la documentazione jQuery per [event.preventDefault()] (http://api.jquery.com/event.preventdefault/) e [event.stopPropagation()] (https: //api.jquery. com/Event.stopPropagation /). – Trisped

+0

stopPropagation interrompe anche la fase di acquisizione? –

+0

Penso che la confusione attorno a queste due funzioni (tre se si conta 'stopImmediatePropagation') è un dubbio sul fatto che l'interruzione della propagazione impedisca automaticamente anche il default. Sembra che potrebbe. – doug65536

6

Evento preventDefault From W3C:

L'event.preventDefault() metodo, si interrompe l'azione predefinita di un elemento accada. Per esempio:

impedire a un pulsante di invio di presentare un modulo di prevenire un collegamento dalla seguendo l'URL

evento stopPropagation From W3C:

Il metodo event.stopPropagation() interrompe il gorgogliare di un evento a elementi padre, impedendo l'esecuzione di qualsiasi gestore di eventi genitore da .

7
  • stopPropagation su un bambino smetterà di tale evento accada sul genitore (l'intero antenati)
  • preventDefault su un bambino si fermerà l'evento sul bambino ma accadrà sul suo genitore (e anche sugli antenati!)

Ora nel tuo codice che è il genitore? qual è il bambino?img è figlio tr è genitore (bebé nonno ad essere onesto), quindi indovina dove dovrebbe essere il codice stopPropagation.

+0

Ho l'impressione che sia sbagliato. Penso che stopPropagation NON fermi l'azione del bambino? – user1884155

+0

Probabilmente stai parlando di preventDefault, ma il mio commento era finalizzato alla spiegazione stopPropagation. L'utente rps ha corretto la sua risposta dopo il mio commento. – user1884155

+0

@Trisped, @ user1884155 ha ragione, l'esempio che stai dicendo sembra essere di 'preventDefault'. Inizialmente ho commesso l'errore di dire che "stopPropagation" fermerà anche gli eventi di qualsiasi bambino, che è stato successivamente corretto da @ user1884155. – rps

Problemi correlati