次のurlで紹介されているauto_ruby.js(内部的にprototype.jsを使用してます)は、氏名(漢字)を入力すると、ふりがな(全角かなor全角カナ)を自動入力してくれます。
http://ceo.sourcelab.jp/archives/97
http://d.hatena.ne.jp/a_horuru/20080702/1214997621
携帯電話の電話帳編集にも同様の機能があった気がありますが、私の携帯電話の場合、自動入力されるフリガナは半角カナですが、を半角カナ自動入力に対応させるには、次のようめconvHankakuKana()を追加すれば、よさそうです。
//--------設定-------- var convFlag = 2; //モードフラグ ひらがな→0 カタカナ→1 半角カナ→2 var nameField = 'tei_name'; //名前のID var rubyField = 'tei_name_kana'; //カナのID //-------------------- function $(e) { return document.getElementById(e); } var baseVal = ""; var beforeVal = ""; function convHankakuKana(val){ var retStr = ''; for(i=0;i<val.length;i++){ var oneChar = val.charAt(i); oneChar = KATAKANA_FULL2HALF[oneChar] || oneChar; retStr += oneChar; } return retStr; } var KATAKANA_FULL2HALF = {'あ':'ア', 'い':'イ', 'う':'ウ', 'え':'エ', 'お':'オ', 'か':'カ', 'き':'キ', 'く':'ク', 'け':'ケ', 'こ':'コ', 'さ':'サ', 'し':'シ', 'す':'ス', 'せ':'セ', 'そ':'ソ', 'た':'タ', 'ち':'チ', 'つ':'ツ', 'て':'テ', 'と':'ト', 'な':'ナ', 'に':'ニ', 'ぬ':'ヌ', 'ね':'ネ', 'の':'ノ', 'は':'ハ', 'ひ':'ヒ', 'ふ':'フ', 'へ':'ヘ', 'ほ':'ホ', 'ま':'マ', 'み':'ミ', 'む':'ム', 'め':'メ', 'も':'モ', 'や':'ヤ', 'ゆ':'ユ', 'よ':'ヨ', 'ら':'ラ', 'り':'リ', 'る':'ル', 'れ':'レ', 'ろ':'ロ', 'わ':'ワ', 'を':'ヲ', 'ん':'ン', 'ぁ':'ァ', 'ぃ':'ィ', 'ぅ':'ゥ', 'ぇ':'ェ', 'ぉ':'ォ', 'ッ':'ッ', 'ゃ':'ャ', 'ゅ':'ュ', 'ょ':'ョ', 'ヴ':'ヴ', 'が':'ガ', 'ぎ':'ギ', 'ぐ':'グ', 'げ':'ゲ', 'ご':'ゴ', 'ざ':'ザ', 'じ':'ジ', 'ず':'ズ', 'ぜ':'ゼ', 'ぞ':'ゾ', 'だ':'ダ', 'ぢ':'ヂ', 'づ':'ヅ', 'で':'デ', 'ど':'ド', 'ば':'バ', 'び':'ビ', 'ぶ':'ブ', 'べ':'ベ', 'ぼ':'ボ', 'ぱ':'パ', 'ぴ':'ピ', 'ぷ':'プ', 'ぺ':'ペ', 'ぽ':'ポ', 'ー':'ー', ' ':' '}; function setRuby() { var newVal = $(nameField).value; if (baseVal == newVal){return;} if (newVal == "") { $(rubyField).value=""; baseVal = ""; return; } var addVal = newVal; for(var i=baseVal.length; i>=0; i--) { if (newVal.substr(0,i) == baseVal.substr(0,i)) { addVal = newVal.substr(i);break; } } baseVal = newVal; if (addVal.match(/[^ ぁあ-んァー]/)) return; var flg = 0; if (addVal.match(/^[あ-ん]$/)) { if (beforeVal == addVal) flg = 1; beforeVal = addVal; } if(convFlag == 1){ addVal = convKana(addVal); } else if(convFlag == 2){ addVal = convHankakuKana(addVal); } var q = $(rubyField).value.slice(-1 * addVal.length); if (flg == 0 && q == addVal) return; $(rubyField).value += addVal; } function loopTimer(){ setRuby(); timer = setTimeout("loopTimer()",30); } function convKana(val){ var c, a = []; for(var i=val.length-1;0<=i;i--){ c = val.charCodeAt(i); a[i] = (0x3041 <= c && c <= 0x3096) ? c + 0x0060 : c; } return String.fromCharCode.apply(null, a); } var timer = false; window.onload = function(){ loopTimer(); $(rubyField).onkeyup = setRuby(); }
今のところ、sjisでも動作しています。