Zdarzenia#

Kompozycja#

Moduł zdarzeń kompozycji # (composition event module) jest rozwinięciem modułu zdarzeń interfejsu użytkownika. Definiuje on interfejs CompositionEvent oraz powiązane z sesją kompozycji następujące typy zdarzeń:

Zdarzenia kompozycji zapewniają mechanizm dla wprowadzania tekstu w dodatkowy lub alternatywny sposób względem zdarzeń klawiatury, dzięki czemu możliwe jest stosowanie znaków, które nie są powszechnie dostępne na klawiaturze. Dla przykładu, zdarzenia kompozycji można wykorzystać przy dodawaniu akcentów do znaków mimo ich nieobecności w standardowych klawiaturach US, do budowania logogramów z ich podstawowych składników lub kategorii w wielu językach azjatyckich, do wybierania słów za pomocą kombinacji przyciśniętych klawiszy na klawiaturze urządzenia mobilnego, lub do konwersji poleceń głosowych na tekst przy użyciu procesora rozpoznawania mowy. Więcej szczegółowych informacji znajduje się w podrozdziale "Zdarzenia klawiatury i wartości klawiszy", gdzie opisano zależności zdarzeń kompozycji ze zdarzeniami klawiatury.

Koncepcyjnie sesja kompozycji # (composition session) składa się z jednego zdarzenia compositionstart, jednego lub większej liczby zdarzeń compositionupdate, i jednego zdarzenia compositionend, z wartością właściwości CompositionEvent.data, która przechowuje łańcuch znakowy między każdymi "stanami" tych zdarzeń w czasie każdej sesji.

Jeśli sesja kompozycji jest aktywna to zdarzenia klawiatury mogą być wysyłane do DOM w chwili, kiedy klawiatura jest urządzeniem wejściowym używanym z sesją kompozycji. Zobacz szczegóły kolejkowania zdarzeń przy opisie zdarzenia compositionstart oraz w podrozdziale "Edytory metod wejściowych".

Nie wszystkie systemy IME lub urządzenia wstawiają niezbędne dane do DOM, więc aktywny łańcuch znakowy kompozycji ("Reading Window" lub "candidate selection menu option") może nie być dostępny za pośrednictwem tego interfejsu, i w tym przypadku wybór może być reprezentowany przez pusty łańcuch znakowy.

Kolejność zdarzeń kompozycji#

Zdarzenia kompozycji występują w ustalonej kolejności względem siebie:

Nazwa zdarzeniaUwagi
1.compositionstart
2.compositionupdateWielokrotne zdarzenia
3.compositionend

System rozpoznawania pisma ręcznego#

Poniższy przykład opisuje możliwą sekwencję zdarzeń podczas kompozycji przejściowego tekstu "text" z systemem rozpoznawania pisma ręcznego, jak w przypadku tabletowego piórka:

Nazwa zdarzeniaUwagi
1.compositionstart
Użytkownik pisze słowo na powierzchni tabletu.
2.compositionupdate'test'
Użytkownik odrzuca pierwszą pasującą sugestię, wybiera inne dopasowanie.
3.compositionupdate'test'
4.compositionend'test'

Anulowanie zdarzeń kompozycji#

Jeśli zdarzenie keydown zostało anulowane to wszystkie zdarzenia kompozycji odpalane w wyniku tego zdarzenia nie powinny być wysyłane, zgodnie z następującą kolejnością zdarzeń:

Nazwa zdarzeniaUwagi
1.keydownPrzerywamy domyślną akcję, np. metodą Event.preventDefault().
Żadne zdarzenie kompozycji nie zostanie wysłane.
3.keyup

Jeśli zdarzenie compositionstart zostało anulowane to sesja kompozycji tekstu powinna zostać zakończona. Niezależnie od tego, czy sesja kompozycji została zakończona, zdarzenie compositionend musi zostać wysłane:

Nazwa zdarzeniaUwagi
1.keydown
2.compositionstartPrzerywamy domyślną akcję, np. metodą Event.preventDefault().
Żadne zdarzenie kompozycji nie zostanie wysłane.
3.compositionend
4.keyup

Zdarzenia klawiatury w czasie kompozycji#

Podczas sesji kompozycji wszystkie zdarzenia typu keydown i keyup mogą być tłumione.

Uwzględnianie zdarzeń klawiatury w czasie kompozycji#

Jeśli aplikacja kliencka nie tłumi zdarzeń klawiatury w czasie kompozycji to musi ustawić właściwość KeyboardEvent.isComposing na boolowskie true dla każdego takiego zdarzenia, które wystąpiło w trakcie sesji kompozycji, zgodnie z następującą kolejnością zdarzeń:

Nazwa zdarzenia.isComposingUwagi
1.keydownfalseZdarzenie to rozpoczyna kompozycję.
2.compositionstart
3.compositionupdate
4.keyuptrue
Każde zdarzenie klawiatury wysłane w czasie sesji kompozycji musi mieć ustawioną właściwość KeyboardEvent.isComposing na boolowskie true.
5.keydowntrueZdarzenie to zamyka kompozycję.
6.compositionend
7.keyupfalse
Tłumienie zdarzeń klawiatury w czasie kompozycji#

Jeśli zdarzenia klawiatury są tłumione między zdarzeniami compositionstart i compositionend, to pierwsze lub ostatnie wciśnięcie klawisza może wywoływać niepasujące zdarzenia keydown i keyup. Jeśli aplikacja kliencka tłumi zdarzenia klawiatury w czasie kompozycji to musi zapewnić, aby wszystkie zdarzenia keydown i keyup występowały w odpowiednich parach.

Aby zagwarantować, że inicjujące zdarzenie keydown posiada odpowiadające zdarzenie keyup aplikacja kliencka może wygenerować dodatkowe zdarzenie keyup pasujące do inicjującego zdarzenia keydown, zgodnie z następującą kolejnością zdarzeń:

Nazwa zdarzenia.isComposingUwagi
1.keydownfalseZdarzenie to rozpoczyna kompozycję.
2.compositionstart
3.compositionupdate
4.keyuptrueW normalnych okolicznościach zdarzenie to zostałoby stłumione ze względu na trwającą sesję kompozycji, ale wysłane zostaje w celu dopasowania do poprzedniego zdarzenia keydown.
Inne zdarzenia klawiatury, które występują w trakcie sesji kompozycji są tłumione.
5.compositionend

Aby zagwarantować, że sesja kompozycji nie kończy się samodzielnym zdarzeniem keyup aplikacja kliencka może stłumić osamotnione zdarzenie keyup albo wstawić dodatkowe zdarzenie keydown.

Poniższa sekwencja zdarzeń przedstawia sytuację, kiedy obydwa zdarzenia keydown i keyup zostają stłumione:

Nazwa zdarzenia.isComposingUwagi
Zdarzenie keydown dla klawisza, który wychodzi z IME zostaje stłumione w trakcie sesji kompozycji.
1.compositionend
W normalnych okolicznościach zdarzenie keyup zostałoby wysłane, ale w tym wypadku jest ono tłumione, aby uniknąć generowania niepasującego zdarzenia keyup.

Poniższa sekwencja zdarzeń przedstawia sytuację, kiedy zdarzenie keydown zostaje wygenerowane:

Nazwa zdarzenia.isComposingUwagi
Zdarzenie keydown dla klawisza, który wychodzi z IME zostaje stłumione w trakcie sesji kompozycji.
1.compositionend
2.keydownfalseZdarzenie to zostało stłumione wcześniej, ale jest wysyłane ponownie w celu dopasowani do nadchodzącego zdarzenia keyup.
3.keyupfalse

Zdarzenia wejścia w czasie kompozycji#

Podczas sesji kompozycji zdarzenie compositionupdate musi zostać wysłane przed zdarzeniami beforeinput i input, zgodnie z następującą kolejnością zdarzeń:

Nazwa zdarzeniaUwagi
1.compositionupdate
2.beforeinput
Wszelkie uaktualnienia DOM występujące w tym momencie.
3.input

Większość narzędzi IME nie obsługuje anulowania aktualizacji DOM w czasie sesji kompozycji.

Po zakończeniu sesji kompozycji wszelkie zdarzenia beforeinput i input muszą być wysyłane po zdarzeniu compositionend:

Nazwa zdarzeniaUwagi
1.compositionend
2.beforeinputWysyłane tylko wtedy, gdy DOM ma być uaktualniany (tj. kiedy kompozycja nie została anulowana). Anulowanie zapobiegnie uaktualnieniu DOM i wysłaniu zdarzenia input.
Wszelkie uaktualnienia DOM występujące w tym momencie.
3.inputWysyłane tylko wtedy, gdy DOM został uaktualniony.

Niektóre narzędzia IME aktualizują DOM przed wysłaniem zdarzenia compositionend. W takim przypadku anulowanie zdarzenia beforeinput nie będzie miało żadnego efektu (tj. zdarzenie input będzie nadal wysyłane).

Przygotowanie środowiska testowego#

Zaufane zdarzenia kompozycji można wygenerować jedynie przy użyciu jakiegoś edytora metody wejściowej. Są to aplikacje, które najczęściej znajdują się na wyposażeniu danego systemu operacyjnego (desktopowego lub mobilnego). W przypadku systemu Window 7 najlepiej zapoznać się z następującymi materiałami:

Wszelkie próby wprowadzenia znaków należy przeprowadzać przy użyciu edytora metody wejściowej. Ja osobiście uaktywniłem sobie japoński edytor IME firmy Microsoft (zintegrowany z systemem).

Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

Zdarzenia (H1) Kompozycja (H2) Kolejność zdarzeń kompozycji (H3) System rozpoznawania pisma ręcznego (H4) Anulowanie zdarzeń kompozycji (H4) Zdarzenia klawiatury w czasie kompozycji (H4) Uwzględnianie zdarzeń klawiatury w czasie kompozycji (H5) Tłumienie zdarzeń klawiatury w czasie kompozycji (H5) Zdarzenia wejścia w czasie kompozycji (H4) Przygotowanie środowiska testowego (H3)