0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

この記事誰得? 私しか得しないニッチな技術で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

iPhone / iPad で日本語入力の確定キー押下を keydown / up イベントで検知できなかった話

Posted at

ちょっとハマったのでメモしておきます。

バージョン

  • iPad 17.4.1
  • iPhone 15.8.2

やりたいこと

やりたいことは以下の2つです。

  1. iPhone / iPad で、日本語入力時(ローマ字入力モード)の確定キー押下を検知したい
  2. iPhone / iPad で、日本語入力時(ローマ字入力モード)の変換候補の中から何か1つが選択されたことを検知したい

以下、 iPhone のスクリーンショットになります。

ちょっと分かりづらいと思いますが、日本語ローマ字入力モードで「くま」の2文字を入力した直後の、まだ未確定のときのスクリーンショットになります。

このまま「くま」で入力を確定させたい場合は赤枠内の確定ボタンを押下すると思いますが、これがやりたいことの 1 になります。
「熊本」で確定させたい場合は黄色枠内の変換候補の中から「熊本」を選択すると思いますが、これがやりたいことの 2 になります。

image.png

<input type="text" id="hoge">
const inputElement = document.getElementById('hoge');
inputElement.addEventListener('keydown', (event) => {
  // 発火しない
});

単純に、上記のコードのように keydown イベントで検知できるだろうと思っていたのですが検知できませんでした。keyup イベントも検知できませんでした。

Safari 以外だとどうなるかが気になり、iPhone + Chrome でも試してみましたが、Safari の時と同様に検知できませんでした。※ iPad + Chrome は未検証です。

解決方法

compositionend イベントで検知できます。

入力可能な input 要素などは、IME を使って文字入力を行うと、変換開始時に compositionstart イベントが、変換終了(確定)時に compositionend イベントが発生するため、これを利用します。

CompositionEvent オブジェクトの data プロパティに 確定した文字列 が入っています。

const inputElement = document.getElementById('hoge');
inputElement.addEventListener('compositionend', (event) => {
  // 発火する
  // event.data に「確定した文字列」が入っている
});

ちなみに、日本語入力時でないときは確定キーではなく改行キーに変わると思いますが、この改行キーの押下については keydown / up イベントで検知できました。

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?