「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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。