2013-08-09 17 views
16

Czy ktoś może wyjaśnić, jaka jest różnica między event.preventDefault() i event.stopPropagation()?event.preventDefault vs event.stopPropagation

Mam tabelę i wewnątrz tej tabeli Mam tag img.

Po kliknięciu znacznika img, chcę zobaczyć wyskakujące okienko.

Ale chcę, aby zatrzymać wybór wielu wierszy, więc używam:

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

Kiedy użyć kodu JS popup nie pojawia;

Po usunięciu kodu js zostanie wyświetlone okno podręczne.

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

Dlaczego?

+2

To ci pomoże http://davidwalsh.name/javascript-events – L10

+1

Pokaż strukturę html, abyśmy wiedzieli, gdzie znajduje się obraz w stosunku do struktury tabeli. – Huangism

+0

Jest już za późno, aby zatrzymać zaznaczenie przy kliknięciu; użyj 'mousedown'. – canon

Odpowiedz

35

Nie jestem ekspertem Javascript ale o ile wiem:

stopPropagation służy do upewnij się, że zdarzenie nie bańka górę łańcucha. na przykład. kliknięcie znacznika <td> uruchomi także zdarzenia kliknięcia na rodzica <tr>, a następnie jego rodzic <table> itp. stopPropagation zapobiega temu.

preventDefault służy do zatrzymania normalnego działania elementu, np. preventDefault w module obsługi kliknięcia łącza uniemożliwiłoby śledzenie łącza lub przycisk przesyłania powodowałby zatrzymanie wysyłania formularza.

+0

@CrisimIlNumenoreano Twój komentarz nie ma sensu. Odpowiedź sevenseacat wygląda dla mnie w 100% i może być sprawdzona za pomocą odpowiedzi w [dup question] (http://stackoverflow.com/questions/5963669/whats-the-difference-between-event-stoppropagation-and-event- preventdefault), jak również z dokumentacją jQuery dla [event.preventDefault()] (http://api.jquery.com/event.preventdefault/) i [event.stopPropagation()] (https: //api.jquery. com/event.stoppropagation /). – Trisped

+0

czy stopPropagation zatrzymuje również fazę przechwytywania? –

+0

Myślę, że zamieszanie wokół tych dwóch funkcji (trzy, jeśli liczymy "stopImmediatePropagation") jest wątpliwe, czy zatrzymanie propagacji automatycznie uniemożliwia również domyślne. Wygląda na to, że może. – doug65536

6

Event preventDefault From W3C:

event.preventDefault() metoda zatrzymuje domyślne działanie elementu dzieje. Na przykład:

zapobiec przycisk Prześlij od złożenia formą Zapobiegać link z następujący adres URL

Event stopPropagation From W3C:

Sposób Event.stopPropagation() zatrzymuje barbotaż zdarzenie do elementów macierzystych , uniemożliwiające wykonanie jakichkolwiek procedur obsługi zdarzeń nadrzędnych z .

7
  • stopPropagation na dziecka zatrzyma to wydarzenie dzieje na rodzica (cały przodków)
  • preventDefault na dziecka zatrzyma zdarzenie na dziecko, ale stanie się na nim rodzic rodzic (i także przodkowie!)

Teraz w swoim kodzie, który jest rodzicem? którym jest dziecko?img jest dzieckiem tr jest rodzicem (dobrze dziadkiem, szczerze mówiąc), więc zgadnij, gdzie powinien być kod stopPropagation.

+0

Mam wrażenie, że to źle. Uważam, że stopPropagation NIE powstrzymuje działania dziecka? – user1884155

+0

Prawdopodobnie mówisz o preventDefault, ale moja uwaga została skierowana na wyjaśnienie stopPropagation. Użytkownik rps poprawił swoją odpowiedź po moim komentarzu. – user1884155

+0

@ Wywołany, @ user1884155 ma rację, przykład, o którym mówisz, wydaje się być 'preventDefault''s. Początkowo popełniłem błąd, mówiąc, że 'stopPropagation' zatrzyma również wydarzenia dziecka, które zostały później poprawione przez @ user1884155. – rps

Powiązane problemy