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

Tworzenie i wywołanie custom eventu

Object Storage Arubacloud
+1 głos
448 wizyt
pytanie zadane 8 kwietnia 2016 w JavaScript przez ScriptyChris Mędrzec (190,190 p.)

Chcę wymusić wywołanie zdarzenia change na radio buttonie i nie rozumiem, dlaczego EventListener, który łapie to zdarzenie inaczej je widzi, niż ja je utworzyłem oraz, oczywiście, nie reaguje na nie, tylko pokazuje błąd (poniżej screen z konsoli):

HTML:

<form id="manage-accounts">
            <label class="options"><input type="radio" name="choose-option" value="chooseAccount" checked>Wybierz konto</label>
            <label class="options"><input type="radio" name="choose-option" value="createAccount">Stwórz konto</label>

            <button type="button" id="submit-account" class="only">Zatwierdź</button>
</form>

 

JavaScript:

document.getElementById('manage-accounts').addEventListener('change', switchRadios, false);
document.getElementById('manage-accounts').addEventListener('click', submitNewCustomer, false);


 function switchRadios(ev, triggered)
 {
        console.log('RADIO change?', ev);

        if (ev.target.type === 'radio' || triggered) // w konsoli pojawia sie blad "Cannot read property 'type' of null"
        {
             if (ev.target.value === 'createAccount')
             {
                  /* kod */
             }
             else
             {
                  /* kod */
             }
        }
}

function submitNewCustomer(ev)
{
        var event = new CustomEvent('change', {
              isTrusted: true,
              target: ev.target.querySelector('input'),
              currentTarget: ev.target.parentNode
        });

       switchRadios(event, true); // chce wywolac funkcje programowo
}

 

Konsola (na czerwono wymuszony event, który nie działa; na zielono, gdy ja klikam i jest ok): http://imgur.com/ECPVmgO

Czy źle robię podając w CustomEvent dane, których de facto oczekuje EventListener? Bo nie wiem jak w inny sposób uruchomić funkcję switchRadios(), która sprawdza ev.target.type. Próbowałem wykonać (zamiast wywołania funkcji switchRadios(event, true)

ev.target.parentNode.dispatchEvent(event);

, ale to nie przynosi żadnego efektu. Chcę po prostu programowo wywołać zdarzenie zmiany stanu radio buttona - tak jakbym kliknął w niego i zmienił na inny. Bo gdy sam klikam i zmieniam, to wszystko działa.

1 odpowiedź

+1 głos
odpowiedź 8 kwietnia 2016 przez Comandeer Guru (601,590 p.)
wybrane 8 kwietnia 2016 przez ScriptyChris
 
Najlepsza

CustomEvent to nie to samo, co Event! Jeśli chcesz symulować natywne zdarzenia, nie wykorzystuj CustomEvent (bo – jak sama nazwa wskazuje – to obiekt określający jakieś niestandardowe zdarzenie) tylko konkretny konstruktor zdarzenia → https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events#Triggering_built-in_events

komentarz 8 kwietnia 2016 przez ScriptyChris Mędrzec (190,190 p.)

Co oznacza 

var canceled = !cb.dispatchEvent(event);

bo zostało użyte w przykładzie i w dokumentacji dispatchEvent też jest

https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent

Tzn., dlaczego jest tam wykrzyknik (negacja) wywołania tego eventu i jest to przypisane do canceled? Po co, później, sprawdzać anulowanie eventu, jeśli dobrze to rozumiem?

komentarz 8 kwietnia 2016 przez Comandeer Guru (601,590 p.)
Bo jeśli ktoś anulował klik, to nie ma sensu odpalać np. rzeczy związanych z klikniętym elementem.
komentarz 8 kwietnia 2016 przez ScriptyChris Mędrzec (190,190 p.)
Jak można anulować klik? Można coś odznaczyć, ale nie można odkliknąć klikniętego już przycisku. Chyba, że wziąć pod uwagę kliknięcie (wciśnięcie) przycisku, ale zamiast puścić przycisk myszki (tak jak to się dzieje podczas "normalnego" kliku), to przesunąć myszkę na bok i wtedy puścić przycisk (przeciągnięcia anulują klik, tzn. wtedy kliknięcie nie jest traktowane jak kliknięcie - to zaobserwowałem, ale jako użytkownik) - nie znam innego sposobu na anulowanie kliku.
1
komentarz 9 kwietnia 2016 przez Comandeer Guru (601,590 p.)

Hm, może powinienem to ściślej powiedzieć: anulować domyślną akcję przy kliku → event.preventDefault.

Podobne pytania

0 głosów
0 odpowiedzi 99 wizyt
pytanie zadane 26 sierpnia 2019 w JavaScript przez MAXIM7 Obywatel (1,990 p.)
0 głosów
2 odpowiedzi 184 wizyt
pytanie zadane 9 lutego 2020 w Java przez reaktywny Nałogowiec (41,050 p.)
0 głosów
1 odpowiedź 130 wizyt
pytanie zadane 23 kwietnia 2017 w JavaScript przez 001greg001 Bywalec (2,030 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 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!

...