Dojo Toolkit

 社内ページ用に作っていますので、IEがメインのブラウザーなのですが、昨日の例で

dojo.connect(dojo.body(), "onkeydown", "keybordpress");

とやっていると、Firefox2や3ではキーボード入力が認識されません。Dojo Toolkit 0.4の頃は、こういうもんなんだろう。Firefoxへの対応はあきらめていました。
 でも今回の1.2の移行にともない、なるべく両方で動いたほうが将来的に楽できるかも。と思って、この見直しと同時にFirefoxでも動くようにしています。で、どうやらFirefoxではbodyに対してはonkeydownイベントが起こらないようです。どうすればいいのだろうと調べてみて、dojo.docに対してなら、イベントが起こることを確認できました。すなわち、以下のようになります。IEはどちらでもいけます。

dojo.connect(dojo.doc, "onkeydown", "keybordpress");

これでIEFirefoxともにキー入力で操作できるようになりました。

dojo.doc

dojo.doc APIのページ
dojo.docはwindow.documentを指し、dojo.body()はbody要素を指し示しています。

dojo.isFF、dojo.isIE、dojo.isKhtml、dojo.isMozilla、dojo.isOpera、dojo.isSafari

dojo.isFF APIのページ
dojo.isIE APIのページ
dojo.isKhtml APIのページ
dojo.isMozilla APIのページ
dojo.isOpera APIのページ
dojo.isSafari APIのページ
上で述べたように、IEFirefox両方で動くようにすると、共通のソースでは無理なことも出てきます。たとえば、IEではマウスのスクロールはonmousewheelで取得できるのに対して、FirefoxではDOMMouseScrollになるとか。こういうブラウザー依存を避けるためにもDojo Toolkitというライブラリーを使っているのですが、そこまでカバーできていない部分もあるんですね。こういうところは個別に判別して場合分けするしかありません。
ブラウザーの種類を判別する関数としてdojo.isIEやdojo.isOperaなどがあり、どんな種類があるかはdojo/_base/_loader/hostenv_browser.jsにて定義されています。
dojo.isIEはIEのバージョン番号を返し、IEじゃないとundefinedを返します。でも、うちのFirefox 3.0.3なのですが、dojo.isFFやdojo.isMozillaで試してもundefinedとなります。dojo.isBrowserなら大丈夫なのですが。これは様子見です。
使い方は次のようになります。

if (dojo.isIE) {
	dojo.connect(imgobj, "onmousewheel", "imgwheel");
} else {
	dojo.connect(imgobj, "DOMMouseScroll", "imgwheel");
}

もしくは、

dojo.connect(imgobj, dojo.isIE ? "onmousewheel" : "DOMMouseScroll", "imgwheel");

とか。こちらは書き方はdojoのソースに数箇所あります。それを参考にしてみました。

追記

 会社のFirefox 3はWindows XP 64bit版上で、上記のようにdojo.isFFがおかしかったのですが、家に帰ってみてXP 32bit版とMac OS X版のFirefox 3では問題なく動きました。なんだか会社のFirefoxの環境がおかしい気がしますので、明日、確認してみます。

10/17追記

 会社のFirefox 3.0.3でdojo.isFFやdojo.isMozillaがおかしかった件ですが、User Agent Switcherを使っているのが原因でした。IEに設定して接続しており、これをオフにすることでdojo.isFFもdojo.isMozillaもちゃんと動くようになりました。
 また、マウスのスクロールについてですが、IEFirefoxはそれぞれevent.wheelDeltaとevent.detailで検出されるようになっていますが、回転方向による値はプラスとマイナスが逆になります。
 dijitのソースを見てみますと、例えばdijit/_TimePicker.jsでは以下のようにしていますね。

var scrollAmount = (dojo.isIE ? e.wheelDelta : -e.detail);