tonextone.com/note/

Last-modified: 2006-09-01 (金)

Copyright ©master_at_tonextone.com All rights reserved.

JavaScript の *.onkey* と IME の事情。その1

Posted : 2005-08-29 00:00 / Category : [開発日誌]
Google suggestの補完候補表示機能は、便利なので、結構いろんな人がマネをしている。
俺もこれで真似しているわけだが、まだマネし切れていない部分がある。
それは、かな漢字変換が未確定の段階での、補完候補取得機能。
IME-on でも、キーをタイプする毎に、補完候補が更新されるっていうヤツ。
Google 以外で、この機能を Cross-Browser に実装して、公開している人もいないようだ。

という事で、あの難読化された ac.js から学ぶ事にする。
現段階で分かっている事は、
      IME-on 状態で、

      IE:
          キータイプ毎に keydown, keyup が発生する。keypress は発生しない。
          未確定段階の入力値を getElementById().value で取得できる。

      Firefox:
          キータイプ毎に keydown, keypress が発生。keyup は発生しない。
          未確定段階の入力値を getElementById().value で取得できない。
          [Enter]で確定すると、 keyup が発生し、入力値を getElementById().value で取得できる。

      Opera:
          キータイプしても keydown,keypress,keyup は発生しない。
          未確定段階の入力値を getElementById().value で取得できない。
          [Enter]で確定しても、keydown,keypress,keyup は発生しない。
          そこから更に[Enter][Backspase]などの制御キーをタイプすると、
          ようやく keydown,keypress,keyup が発生する。
    
[テスト]

やっぱり、google の中の人はすごいなぁ。それにひきかえ Opera の中の人は…。

トラックバック

1: tonextone.com/note//JavaScript の *.onkey* と IME の事情。その2 (09/04 03:56)
key event をトリガーにするのは諦めて、入力値の変更をトリガーにしている。そのために、10 ms 毎に入力値を監視している(idkc() という関数)。
2: ネットビジネス用CGI Perl HTML Javascriptの情報サイト/JavaScriptの条件分岐 (03/25 00:17)
  私たちの生活の中でも、さまざまな選択があるように、JavaScriptのプログラムにも、条件によって処理を変化させる「条件分岐」というものがあります。前回の記事「JavaScriptの演算子(2)」にも出てきた「if」などが、条件分岐のプログラムコードの代表です。コンピュータの世界で言えば、「変数の内容が1だったら処理Aを行い、変数の内容が2だったら処理Bを行う」といった事を指します。では、JavaScriptの条件分岐を行うためのプログラムコードを説明します。

ツッコミ

1: master (08/29 23:24)
よく見ると、日本語版(hl=ja)と、英語版(hl=en)とでは、挙動が違う!!
英語版( http://www.google.com/webhp?hl=en&complete=1 )
日本語版( http://www.google.co.jp/webhp?hl=ja&complete=1 )

英語版だと、Opera で IME-on の場合、(普通には)補完されない!!
やはり多言語対応のために hack が必要だったんじゃないかと推測する。

その代わりというか、
英語版では第一候補の補完部分が入力欄に自動的に追加される。
2: master (08/30 00:55)
InstallAC(document.f,document.f.q,document.f.btnG,"search","en");
の5番目の引数に "ja" を渡すと、IME-on でも良い感じで処理するようになっている。
要するに、この引数での条件分岐を追っていけば、求める hack を突き止められる。
[ このエントリへはツッコミ出来ません ]