例えば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パターンの変換しか対応してません。
なので他にも日本語変換時の動作パターンで対応しなければいけない場合には随時修正が必要になります。