フォームなどで半角英数のみを入力させたい場合、CSSのime-modeを使えば実装できますが、Google Chromeでは対応していません。
今回はフォーム入力時にリアルタイムで全角英数を半角英数に変換する処理(英数字のみで記号は対象外)を実装してみます。
うまくいかなかった場合のサンプル
最初にやろうとして、微妙にうまくいかなかったサンプルです。
HTML
<input type="text" name="" class="sample" />
JavaScript
$(function() { $('.sample').keyup(function(e) { $(this).val(convertStr($(this).val())); }); }); // 変換処理 function convertStr(str) { var halfStr = str.replace(/あ/g, 'a').replace(/い/g, 'i').replace(/う/g, 'u').replace(/え/g, 'e').replace(/お/g, 'o').replace(/[A-Za-z0-9]/g, function(s) { return String.fromCharCode(s.charCodeAt(0)-0xFEE0); }); return halfStr; }
母音は入力した段階で英数字ではなくなっているので、最初に「あいうえお」を「aiueo」に変換するようにしています。
keyup時に入力内容を変換する形で問題ないかと思っていたのですが、入力スピードが速いと変換がうまくいかない場合がありました。
うまくいかなかった場合のデモページ
最終的なコード
色々試してみたのですがどれもいまいちだったので、最終的にフォーカスが当たっている時のみsetIntervalで入力内容を監視するようにしました。
JavaScript
$(function() { $('.sample').focus(function() { monitoring($(this)); }); $('.sample').blur(function() { monitoringClear($(this)); }); }); var monitoringTimer; // 入力エリアの監視 function monitoring(ele) { // 変更前の文字列 var before = ele.val(); // 現在の文字列 var current = ele.val(); monitoringTimer = setInterval(function() { // 現在の文字列取得 current = ele.val(); // 変更があった場合 if(before != current) { // 文字列の変換 current = convertStr(ele.val()); // 各値の上書き before = current; ele.val(current); } }, 10); } // 入力エリアの監視終了 function monitoringClear(ele) { clearInterval(monitoringTimer); } // 変換処理 function convertStr(str) { var halfStr = str.replace(/あ/g, 'a').replace(/い/g, 'i').replace(/う/g, 'u').replace(/え/g, 'e').replace(/お/g, 'o').replace(/[A-Za-z0-9]/g, function(s) { return String.fromCharCode(s.charCodeAt(0)-0xFEE0); }); return halfStr; }
入力時にリアルタイムで全角を半角に変換するデモページ
これで一応想定した動きになりました。
今回記号は変換対象に含めていませんが、記号も合わせて変換したい場合はconvertStr()内で一緒に変換してしまえばよさそうです。
コメントが承認されるまで時間がかかります。