C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

うっかり備忘録: JavaScript で受け取るイベントの座標情報

最近やっているJavaScript講座用にと、Girlsなんてちょっと中二病を催して付けた名前のJavaScriptアプリがあるんだけど、そいつのモックアップにクライアントサイドの動きを実装していた時の事。

ありゃ・・・GirlsのモックアップHTML5的なドラッグアンドドロップで案件の移動を実装できたと思っていたはずだったが・・・Chromium18でしか期待通りに動かないなコレ。Fx11でも動いてくれないとカナシイなあ。

HTML5ドラッグアンドドロップAPIを使ってみた部分なので、ブラウザー間の実装差だろうかとうか思ってみた。しかし問題は新しいドラッグアンドドロップの為のAPIの使い方ではなくて、古くからのブラウザー間のイベントにおける座標取得なのでした。マウス関連のイベントを拾うとマウスの座標を読み取れる訳ですが、これがウェブブラウザー毎にちまちまっと違うんですよねー。

// test
//   C: Chromium-18
//   F: Firefox-11
//   O: Opera-next-12.00a
e.x       // C   O
e.pageX   // C F O
e.layerX  // C F  
e.clientX // C F O
e.screenX // C F O

今回はChromiumでデバッグしながら作っていて、うっかり座標取得に`event.x`と`event.y`を使ってしまっていたところがあった為に、FirefoxでGUIの挙動があるぇーって事になっていたのでした。うっかり備忘録☆(ゝω・)vキャピ

おまけ: なんかTwitterでぼやいてたコトのメモ

もちろん、ブラウザーはスクリプト処理系は何か1つだけ組み込みでサポートとかすべきじゃなくて、ユーザーは任意の処理系をプラグイン式に簡単にブラウザーへインストールしたりアンインストールしたりできるべき。

プラグインの仕様を満たしてさえ居ればウェブブラウザーはDOM操作やイベント等のAPIをプラグインに提供し、プラグインはそのプラグインが満たす言語仕様に基づいてスクリプトを実行するエンジンを提供すればいいじゃない・w・

プラグインは何もネイティブ以外にもABI的な仕様を提供してCで書かれた本物のバイナリのプラグインでもPythonなりRubyのレイヤーでもブラウザーのAPIに接続できるように複数のネイティブレベルのレイヤーを設ければ誰も困るまい?

ウェブブラウザーはレンダリング等の実装に特化してスクリプト処理系は完全に分離できる状況というのは、巨大な産物になっているブラウザーにも良い事だと思うんだ。もちろんスクリプト開発者にも、エンドユーザーにも。

うーん、実はコレかなり大真面目に思ってたり・w・