JavaScript

最終更新日:
公開日:

レシピ

イベント

全角入力の開始と終了を検出する

キーボードによる全角入力の開始と終了のタイミングを検出して、指定した処理を実行する方法について解説します。

この記事のポイント

  • 変換を伴う全角入力が開始されるとイベント「compositionstart」が発生する
  • 変換完了して全角入力が終了するとイベント「compositionend」が発生する

全角入力の開始と終了で発生するイベントについて

キーボードで日本を入力するときは全角入力を行いますが、変換するかどうかが未確定の状態で入力する状態になります。
そのような未確定状態の入力が開始されたときはイベント「compositionstart」が発生し、変換が完了して入力終了するタイミングにイベント「compositionend」が発生します。

この2つのイベントは変換のない半角英数字の入力では発生しません。

今回は例として、以下の1行フォームのHTMLを使って入力状態を確認していきます。

HTMLコード例

<form id="form_recipe" method="post" action="">
  <label for="input_name">テキスト入力フォーム:</label>
  <input type="text" id="input_name" name="input_name" value="">
</form>

このフォームにあるid属性input_name」に対して、上記の2つのイベントをイベントリスナーに登録します。

コード例

window.addEventListener('DOMContentLoaded', function(){

  // 1行テキストフォームのHTMLを取得
  var input_element = document.getElementById('input_name');

  // 入力開始
  input_element.addEventListener('compositionstart', function(){
      console.log("入力開始");
  });

  // 入力終了
  input_element.addEventListener('compositionend', function(){
    console.log("入力終了");
  });
});

このコードを実行すると、1行テキストに全角入力を開始するタイミングで「入力開始」、変換確定して入力が終わったタイミングで「入力終了」とコンソールにそれぞれ出力されます。

例として1行フォームに「今日は暑い」と入力するときに、「今日は」「暑い」と2回に分けて入力したときは、コンソールには「入力開始」「入力終了」「入力開始」「入力終了」と2回ずつ出力されます。

CompositionEventオブジェクトdataオブジェクトを参照すると、全角入力の入力があるたびに入力内容を取得することができます。

上記のコードからイベント「compositionend」の箇所だけ修正します。
イベントリスナーで実行する処理に対して、CompositionEventオブジェクトを引数として渡して、処理の中でdataオブジェクトの値を取得してコンソールに出力します。

コード例

window.addEventListener('DOMContentLoaded', function(){

  // 1行テキストフォームのHTMLを取得
  var input_element = document.getElementById('input_name');

  // 入力開始
  input_element.addEventListener('compositionstart', function(){
      console.log("入力開始");
  });

  // 入力終了
  input_element.addEventListener('compositionend', function(e){
    console.log(e.data);
  });
});

こちらのコードを実行すると、全角入力を開始したときは先ほどと同様にコンソールに「入力開始」と出力され、入力完了したら入力した値がそのまま出力されます。
例えば「今日は暑い」を「今日は」「暑い」と2回に分けて入力したら、コンソールには「入力開始」「今日は」「入力開始」「暑い」と出力されます。

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

コメントありがとうございます!
運営の参考にさせていただきます。