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 zdarzenia | Uwagi | |
---|---|---|
1. | compositionstart | |
2. | compositionupdate | Wielokrotne 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 zdarzenia | Uwagi | |
---|---|---|
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 zdarzenia | Uwagi | |
---|---|---|
1. | keydown | Przerywamy 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 zdarzenia | Uwagi | |
---|---|---|
1. | keydown | |
2. | compositionstart | Przerywamy 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 | .isComposing | Uwagi | |
---|---|---|---|
1. | keydown | false | Zdarzenie to rozpoczyna kompozycję. |
2. | compositionstart | ||
3. | compositionupdate | ||
4. | keyup | true | |
Każde zdarzenie klawiatury wysłane w czasie sesji kompozycji musi mieć ustawioną właściwość KeyboardEvent.isComposing na boolowskie true . | |||
5. | keydown | true | Zdarzenie to zamyka kompozycję. |
6. | compositionend | ||
7. | keyup | false |
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 | .isComposing | Uwagi | |
---|---|---|---|
1. | keydown | false | Zdarzenie to rozpoczyna kompozycję. |
2. | compositionstart | ||
3. | compositionupdate | ||
4. | keyup | true | W 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 | .isComposing | Uwagi | |
---|---|---|---|
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 | .isComposing | Uwagi | |
---|---|---|---|
Zdarzenie keydown dla klawisza, który wychodzi z IME zostaje stłumione w trakcie sesji kompozycji. | |||
1. | compositionend | ||
2. | keydown | false | Zdarzenie to zostało stłumione wcześniej, ale jest wysyłane ponownie w celu dopasowani do nadchodzącego zdarzenia keyup . |
3. | keyup | false |
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 zdarzenia | Uwagi | |
---|---|---|
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 zdarzenia | Uwagi | |
---|---|---|
1. | compositionend | |
2. | beforeinput | Wysył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. | input | Wysył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).