ページ

2005年3月14日月曜日

Google サジェストの不思議

Google サジェストとアラート」 で書いた Google サジェスト(日本語版) ですが、使ってみて 「おや?」 と思うことがありました。IME で漢字を入力しようとすると、確定していなくてもサジェストが表示されるんです。どうやっているのか気になってました。


で、試したコード。



<html>
<body/>
<form name="f">
<input name="a"
onkeydown="document.getElementById('dc').innerText=event.keyCode;
           document.getElementById('dv').innerText=document.f.a.value"
onkeyup="document.getElementById('uc').innerText=event.keyCode;
         document.getElementById('uv').innerText=document.f.a.value"
/><br/>
keydown: <span id="dc"></span>:<span id="dv"></span><br/>
keyup: <span id="uc"></span>:<span id="uv"></span>
</form>
</body>
<html>



IME がオンのあいだもキーアップするたびに keyup は呼ばれるようです。keydown は呼ばれてるような呼ばれてないようなよくわからない感じです。
また、<input> 要素の value は IME で入力中の読みも含めて返されるようです。
と言うわけで、別に特別なことはしなくても、keyup のタイミングで value を参照すれば確定前の文字列も含めた文字列が取り出せます。


上記は Windows 2000 Professional、IE6 SP1、IME は Win2000 標準のやつ、という環境で試した結果です。OS、IE、IME が違えば動作は違ってくると思いますし、ブラウザが IE 以外の場合はぜんぜん違う結果になる可能性が大だと思います。


で、FireFox 1.0 で同じような感じで試してみたら、IME がオンのあいだは keydown も keyup も呼ばれないみたいです。それじゃあということで、



<html>
<script>
function test()
{
    document.f.b.value = document.f.a.value;
    setTimeout(test, 100);
}
setTimeout(test, 100);
</script>
<body/>
<form name="f">
<input name="a"/><br/>
<input name="b"/>
</form>
</body>
<html>


こんな風にして、100ミリ秒おきに <input> 要素の value がどうなっているのか表示されてみました。すると、ちゃんと IME で入力中の読みも含めて取りだせました。

0 件のコメント:

コメントを投稿