• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

jQuery stopPropagation nie działa w divie który posiada event click

Object Storage Arubacloud
0 głosów
207 wizyt
pytanie zadane 29 czerwca 2019 w JavaScript przez BlvckFox Gaduła (4,240 p.)

Witam, mam diva który po kliknięciu wyświetla tekst, w tym divie mam też przycisk i chciałbym, żeby po kliknięciu checkboxa pojawiał się też tekst w konosli. Problem jest taki, że po kliknięciu w checkbox "odpalają" się dwa eventy kliknięcia - ten z diva oraz ten z checkboxa. Jak można naprawić ten błąd? e.stopPropagation() nie działa.
https://codepen.io/FoxCode/pen/ZdrzVV

2 odpowiedzi

+4 głosów
odpowiedź 29 czerwca 2019 przez Comandeer Guru (600,730 p.)
edycja 29 czerwca 2019 przez Comandeer
 
Najlepsza

Fajny edge case w sumie. stopPropagation nie działa, bo w rzeczywistości klikasz w ostylowany label. A to, zgodnie ze specyfikacją, odpala dodatkowy click dla pola formularza, a następnie kontynuuje click dla samego label:

  1. Klikasz label.
  2. Odpala się zdarzenie click dla label.
  3. Odpala się domyślne zachowanie kliku dla label
  4. click dla label leci dalej, bąbelkując do li.
  5. Odpalane jest input.click();
  6. click dla label leci dalej, bąbelkując do li.

Innymi słowy: musisz dodać e.stopPropagation także do label a nie tylko input.

komentarz 29 czerwca 2019 przez BlvckFox Gaduła (4,240 p.)

Ok, a dlaczego nawet jak zamiast inputa dam sam label:
https://codepen.io/FoxCode/pen/ZdrzVV
 

$('label').on('click',(e)=>{e.stopPropagation()})


a problem występuje i tak, jak mogę dodać stopPropagation do label?

1
komentarz 29 czerwca 2019 przez Comandeer Guru (600,730 p.)
Edytowałem odpowiedź. Trzeba dodać do obydwu. Wówczas zablokowane zostanie bąbelkowanie z obydwu elementów. Sorry za wprowadzenie w błąd.
komentarz 29 czerwca 2019 przez BlvckFox Gaduła (4,240 p.)

Ok, dzięki. Jak mogę uzystać event elementu label gdy mam onclick na inpucie? 
 

$('input').on("click", (e)=>{
  e.stopPropagation();
  $('label').event.stopPropagation(); /// ?
	console.log("You clicked button");
});

Jak powinienem dodać stopPropagation do dwóch elementów?

1
komentarz 29 czerwca 2019 przez Comandeer Guru (600,730 p.)

Normalnie:

$( 'input' ).on( 'click', ( e ) => {
    e.stopPropagation();
} );

$( 'label' ).on( 'click', ( e ) => {
    e.stopPropagation();
} );

Tak będzie chyba najładniej.

komentarz 29 czerwca 2019 przez Comandeer Guru (600,730 p.)

BTW jakby ktoś chciał sobie to lepiej prześledzić, przygotowałem mały playground: https://jsfiddle.net/Comandeer/s13g84va/

komentarz 29 czerwca 2019 przez ScriptyChris Mędrzec (190,190 p.)

Czy nie lepiej umieścić <input> w <label> i odnieść się do <label> przez e.target.parentNode, zamiast podpinać osobny listener dla <label>?


@Comandeer, a propos kolejności obsługi zdarzeń - czy jesteś w stanie podać źródło, gdzie opisana jest kolejność dla przypadku z tej odpowiedzi na SO (mousedown, focus, mouseup, click -> podczas kliku na focusowalny element)? Nie udało mi się znaleźć na W3 ani MDN, ani quirksmode.

1
komentarz 29 czerwca 2019 przez Comandeer Guru (600,730 p.)

O ile się nie mylę, nie ma standardowej kolejności zdarzeń dla różnych typów zdarzeń. Wiadomo, jak to działa dla samego focusu, dla samej myszki, ale nie spotkałem się dotąd ze standardem definiującym, jak mają się mieszać te zdarzenia. Niemniej kolejność w SO jest najbardziej logiczna. mousedown przenosi focus na dany element, więc pomiędzy mousedown a mouseup powinien zajść cały cykl focusowania (blur poprzedniego elementu i focus nowego).

+2 głosów
odpowiedź 29 czerwca 2019 przez adrian17 Ekspert (344,860 p.)

po kliknięciu w checkbox "odpalają" się dwa eventy kliknięcia

To nie dwa eventy kliknięcia - sam napisałeś w obsłudze drugiego eventu, że łapiesz "change", nie "click".

Dlatego też stopPropagation() "nie działa" - bo to nie jest jeden event propagujący się, tylko dwa różne eventy.

komentarz 29 czerwca 2019 przez BlvckFox Gaduła (4,240 p.)

A co zrobić w takiej sytuacji?
https://codepen.io/FoxCode/pen/ZdrzVV?

komentarz 29 czerwca 2019 przez adrian17 Ekspert (344,860 p.)

A co zrobić w takiej sytuacji? 

Nie rozumiem pytania... a co chcesz zrobić?

komentarz 29 czerwca 2019 przez BlvckFox Gaduła (4,240 p.)
Zmieniłem "change" na "click", wszystko działało, ale po dodaniu CSSa gdzie ten checkbox jest zmieniany przy pomocy "label" problem "dwóch kliknięć" nadal występuje
1
komentarz 29 czerwca 2019 przez adrian17 Ekspert (344,860 p.)
Hmm... to tutaj już za bardzo nie wiem niestety, przepraszam. Może ktoś inny będzie wiedział.

Podobne pytania

0 głosów
1 odpowiedź 179 wizyt
pytanie zadane 5 sierpnia 2018 w JavaScript przez Mateusz Pijanowski Bywalec (2,130 p.)
0 głosów
1 odpowiedź 309 wizyt
pytanie zadane 18 lutego 2018 w JavaScript przez Ubermade Bywalec (2,020 p.)

92,539 zapytań

141,382 odpowiedzi

319,476 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...