Skip to content

Instantly share code, notes, and snippets.

@nantekkotai
Created January 23, 2013 05:49
Show Gist options
  • Save nantekkotai/4602401 to your computer and use it in GitHub Desktop.
Save nantekkotai/4602401 to your computer and use it in GitHub Desktop.
Enterで実行する仕組みは、日本語入力の場合、工夫しないと変換入力途中に実行されてしまう。

日本語入力を考慮したEnterで実行

例えばEnterで実行した瞬間に文字列を切り取るとか、そういうことをしたとします。
日本語入力の場合は変換途中のEnterである可能性があります。
そうするとおかしな状態で切り取ってしまうかもしれません。
それを防ぐためにはどうするか。

入力状態を監視する仕組みを作るのです。

var IMEObserver = function (elm) {
  var IMEState = false,
      keyPressCount = 0;
  
  function stateCheck(e) {
    var type = e.type,
        keyCode = e.keyCode;

    if (type == 'keypress' && !(keyCode === 241 || keyCode === 242)) {
      keyPressCount++;

    } else if (type == 'keyup') {
      keyPressCount--;

      if (keyPressCount < 0) {
        IMEState = (keyCode === 13) ? false : true;
        keyPressCount = 0;

      } else {
        IMEState = false;
      }
    } 
  }

  $(elm)
    .keydown(stateCheck)
    .keypress(stateCheck)
    .keyup(stateCheck);

  return {
    // 日本語入力中の場合はtrueを返す
    isIME: function () {
      return IMEState;
    }
  }
};

これで任意のタイミングでisIMEを実行して、それが日本語入力変換中かそうでないかを判断出来ます。
keyCodeの241と242は変換中のスペースのkeyCodeになります。
このコードでは2パターンの変換しか対応してません。
なので他にも日本語変換時の動作パターンで対応しなければいけない場合には随時修正が必要になります。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment