投稿: 2022/08/10
更新: 2023/02/15
IME変換確定のEnterかどうかを判定する
方法1. compositionstart, compositionend
以下のイベントを使う方法。IE 11でも使える。
- Element: compositionstart イベント - Web API | MDN
- Element: compositionupdate イベント - Web API | MDN
- Element: compositionend イベント - Web API | MDN
1let lastQuery = '';
2let isComposing = false;
3const inputElm = document.getElementById('input');
4
5inputElm.addEventListener('compositionstart', (e) => {
6 isComposing = true;
7});
8
9inputElm.addEventListener('compositionend', (e) => {
10 lastQuery = inputElm.value.trim();
11
12 // do someting
13
14 isComposing = false;
15});
16
17inputElm.addEventListener('input', (e) => {
18 if (isComposing) {
19 return;
20 }
21
22 if (e.target.value.trim() == lastQuery) {
23 return;
24 }
25
26 lastQuery = e.target.value.trim();
27
28 // do someting
29});方法2. InputEvent.inputType
InputEvent.inputType - Web API | MDN
insertText, insertFromPaste, insertFromComposition, insertCompositionText, deleteContentBackward, deleteCompositionText などの多くの値を取ります。
変換確定前の入力を無視したいということであればinsertCompositionText, deleteCompositionText の場合に処理を中断すればいいことになります。
IE 11では使えないことに注意。
1document.getElementById('input').addEventListener('input', (e) => {
2 if (e.inputType == 'insertCompositionText' || e.inputType == 'deleteCompositionText') {
3 console.log('inputType:', e.inputType);
4 return;
5 }
6 console.log('inputType:', e.inputType, e.data, e.target.value);
7 });