2013-08-09 15 views
16

Kann jemand erklären, was ist der Unterschied zwischen event.preventDefault() und event.stopPropagation()?event.preventDefault vs event.stopPropagation

Ich habe eine Tabelle und innerhalb dieser Tabelle habe ich ein IMG-Tag.

Wenn ich auf das IMG-Tag klicke, möchte ich ein Popup sehen.

Aber ich möchte auch die Auswahl mehrerer Zeilen stoppen, so verwende ich:

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

Wenn ich die JS-Code verwenden, wird das Popup nicht angezeigt;

Wenn ich den Js-Code lösche, funktioniert das Popup.

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

Warum?

+2

Dies hilft Ihnen http://davidwalsh.name/javascript-events – L10

+1

Bitte zeigen Sie Ihre HTML-Struktur, so dass wir wissen, wo das Bild in Bezug auf die Struktur der Tabelle ist – Huangism

+0

Es ist zu spät, um die Auswahl auf "Klick" zu stoppen; benutze 'mousedown'. – canon

Antwort

35

Ich bin kein Experte Javascript, aber soweit ich weiß:

stopPropagation verwendet wird, das Ereignis, um sicherzustellen, um die Kette nicht sprudeln. z.B. Ein Klick auf ein <td> Tag würde auch Klickereignisse auf seine Eltern <tr> auslösen, und dann sein Elternteil <table>, etc. stopPropagation verhindert, dass dies geschieht.

preventDefault wird verwendet, um die normale Aktion eines Elements, z. preventDefault in einem Klick-Handler auf einen Link würde den Link zu stoppen aufhören, oder auf eine Schaltfläche zum Senden würde das Formular gestoppt werden.

+0

@CrisimIlNumenoreano Ihr Kommentar macht keinen Sinn. Die Antwort von sevenseacat sieht für mich zu 100% korrekt aus und kann mit den Antworten auf die [dup question] (http://stackoverflow.com/questions/5963669/whats-the-difference- between- even- stoppropagation-and-event- preventdefault) sowie mit der jQuery-Dokumentation für [event.preventDefault()] (http://api.jquery.com/event.preventdefault/) und [event.stopPropagation()] (https: //api.jquery. com/event.stoppropagation /). – Trisped

+0

stoppt StopPropagation auch die Capture-Phase? –

+0

Ich denke, die Verwirrung um diese beiden Funktionen (drei, wenn Sie 'stopImmediatePropagation' zählen) ist ein Zweifel darüber, ob das Stoppen der Weitergabe automatisch verhindert auch Standard. Es scheint, als könnte es. – doug65536

6

Ereignis preventDefault From W3C:

Die Event.preventDefault() Methode stoppt die Standardaktion eines Element aus geschieht. Zum Beispiel:

Prevent einer Schaltfläche zum Senden von einem Formular stopPropagation From W3C einen Link von nach der URL

Ereignis verhindern einreichen:

Die event.stopPropagation() -Methode das Sprudeln aufhört Ein Ereignis an Elternelemente, wodurch verhindert wird, dass alle übergeordneten Ereignishandler ausgeführt werden.

7
  • stopPropagation auf ein Kind wird dieses Ereignis stoppen geschieht auf den Eltern (die gesamten Vorfahren)
  • preventDefault auf ein Kind wird die Veranstaltung auf dem Kind stoppen, aber es wird passieren, es ist Elternteil (und die Vorfahren auch!)

Jetzt in Ihrem Code, der die Eltern ist? Welches ist das Kind?img ist Kind tr ist Elternteil (gut Großeltern um ehrlich zu sein), also raten Sie, wo der stopPropagation Code sein sollte.

+0

Ich habe den Eindruck, das ist falsch. Ich denke, stopPropagation stoppt nicht die Aktion des Kindes vor dem Geschehenen? – user1884155

+0

Sie sprechen wahrscheinlich von preventDefault, aber mein Kommentar war auf die stopPropagation-Erklärung ausgerichtet. User rps hat seine Antwort nach meinem Kommentar korrigiert. – user1884155

+0

@Trisped, @ user1884155 ist richtig, das Beispiel, das Sie sagen, scheint von 'preventDefault' zu sein. Und anfangs habe ich den Fehler gemacht zu sagen, dass die 'stopPropagation' auch die Ereignisse eines Kindes stoppt, was später von @ user1884155 korrigiert wurde. – rps