2005年05月13日

[プログラム関係] HTMLをドラッガブルに

ここでやったHTMLエレメントのドラッグについての技術的メモ。

基本的な動作原理:
各エレメントにIDを付加。
エレメントのOnClickハンドラをJavascriptオブジェクトに流し込む。
スクリプト内ではエレメントのpositionをabsoluteに設定し、マウスポジションにあわせて座標を更新する。

使用スクリプト:
http://www.qyen.org/scripts/dragDiv.js
見ての通りXP風ページのdrag.jsからのちょい変更程度。

機知のバグ:
ieで、縦横のスクロールがされている状態だとマウスのポジションが正確に取れない。

諸悪の根源はこれ。
if (isNaN(parseInt(window.scrollX))==false) ix +=window.scrollX ;

つまり縦横のスクロール量を取得するのに、mozilla風にwindow.scrollX/scrollYを使ってるのが原因。
んじゃieでどう取るのよってのが分からなくて放置してた。

その辺上手いことやってるのがwemaスクリプト
中を見てみるとieとmozilla、Operaでそれぞれ取得方法を変えてるみたい。

function getMouseY(e){
if(window.opera) //o6!)
return e.clientY
else if(document.all && document.getElementById && (document.compatMode=='CSS1Compat')) // e6
return document.documentElement.scrollTop+event.clientY
else if(document.all) //e4,e5,e6!)
return document.body.scrollTop+event.clientY
else if(document.layers||document.getElementById)
return e.pageY //n4,n6,m1!)
}

こらきっついな。

#つーかいい加減各ブラウザ共通で使えるクライアントスクリプト出てくれないかね。

この辺がイベント毎にチェックされるのもかなりアレなんでOO風に書き出してみると

var coordinateHandler = null ;

function onLoad(e){
if(window.opera) //o6!)
coordinateHandler = new OperaHandler();
else if(document.all && document.getElementById && (document.compatMode=='CSS1Compat')) // e6
coordinateHandler = new Ie6Handler();
else if(document.all) //e4,e5,e6!)
coordinateHandler = new OldIeHandler();
else if(document.layers||document.getElementById)//n4,n6,m1!)
coordinateHandler = new MozillaHandler();
}

function getMouseY(e){
return coordinateHandler.clientY
}

こんなとこか。
つーかこんなもんとっととインターフェース策定して、ハンドラをベンダーから出してくれないかな。一々動作検証すんのが面倒。


しかし最近はCSSがそれなりに使えるブラウザが増えてきて、HTML+CSS+Javascriptで遊べることが多くなってきた気がする。

MSNSpacesの設定画面なんかその最たるものか。
IEワールド全快で厳しいけど。

投稿者 和尚 : 2005年05月13日 15:50 | トラックバック
コメント

>つーかこんなもんとっととインターフェース策定して、ハンドラをベンダーから出してくれないかな。

それだーーーー!!
全ブラウザ共通の汎用インタフェースを策定して実装を各ベンダからライブラリとして出せば言う事なし。とにかくブラウザ毎に違う挙動をするJavaScriptが好きになれなくてマジメにやらなかったけど、Ajaxだの高橋メソッドだの(それは違)が出てマジメにやらざるをえなくなってきてるなー。でもAjaxは単なる流行りもんでしょ?でしょでしょ?違う?

Posted by: J2 : 2005年05月13日 17:34

J2さん>
というか同じリソース(HTMLとかCSSとか)読んで出てくるオブジェクトが違うんで、まずその適当に作ったパーサーを何とかしろtうわなんだおまklsかjsld

というか、SourceForgeあたりにその辺の共通スクリプトとか落ちてそうなんですがねぇ。

>でもAjaxは単なる流行りもんでしょ?でしょでしょ?違う?

いやー。Ajaxはこれから先 結構長い期間残ると思いますよ。.net2.0が出たらPC向けのインターフェースがどうなるかによりますけど。
Ajaxみたいな軽量インターフェースはこれから先モバイル端末向けのインターフェースとして主流になりそうな気がします。

Posted by: 和尚 : 2005年05月13日 18:12
コメントする









名前、アドレスを登録しますか?