JavaScriptでWebアプリケーションを作ろうかと。
#といってもhtaでWin限定なんだけど(^^;
このとき、ウィンドウ移動させるためにイベントハンドラをオーバーライドしますが、
初回のマウスダウンと、ドラッグ開始直後に必ずエラー(アクセスが拒否されました)が発生する。
Javaと同じようにtry~catchが使えるので、エクセプション発生時は、エラー判定フラグ(eflag)をtrueにしておき、mouseupされてもドラッグ判定フラグ(dflag)はtrueのままにするという工夫で対処可能だった。
こうすることで、mousemove発生の都度、moveByが有効に機能するわけです。
対処済みのソースは以下のとおり。
<SCRIPT TYPE=”text/javascript”>
<!–
var dflag = false;
var eflag = false;
var posX, posY;
with(document){
onmousedown = function(){
dflag=true;
posX=event.clientX;
posY=event.clientY;
};
onmouseup = function(){
if( eflag == false ) {
dflag = false;
}
};
onmousemove = function(){
try {
if(dflag) {
eflag = false;
window.moveBy(event.clientX-posX,event.clientY-posY);
// moveToでもほぼ同じ動作だが、デュアルディスプレイだと
// 一方の画面までは移動不可みたいです。
}
} catch( e ) {
if( e.number == -2147024891 ) {
eflag = true;
}
}
};
}
//–>
</SCRIPT>
とくに、ドラッグ(マウスダウン)状態で、マウスがウィンドウ外に出てしまった場合は、さすがにmouseupイベントを取得することができないので、マウスがウィンドウ上に戻るまでは反応していなかのような振る舞いになってしまう。
この点は止むを得ないと思う。
ただし、マウスが戻ってからと、ウィンドウ上でのドラッグの挙動は、筋の通ったものになった。
※この対応を施さないと、ウィンドウ上でのドラッグでは移動せず、
mouseupしたときに瞬間移動するような違和感のある挙動になる。
以下が、よく見かけるサンプルは次のとおりだが、これだと冒頭で指摘した不具合あり。
<SCRIPT TYPE=”text/javascript”>
<!–
var dflag = false;
var posX, posY;
with(document){
onmousedown = function(){
dflag=true;
posX=event.clientX;
posY=event.clientY;
};
onmouseup = function(){
dflag = false;
};
onmousemove = function(){
if(dflag) {
window.moveBy(event.clientX-posX,event.clientY-posY);
// moveToでもほぼ同じ動作だが、デュアルディスプレイだと
// 一方の画面までは移動不可みたいです。
}
};
}
//–>
</SCRIPT>
参考URL:
Javascriptでtry-catchを使う
No comments yet. You should be kind and add one!
By submitting a comment you grant typista a perpetual license to reproduce your words and name/web site in attribution. Inappropriate and irrelevant comments will be removed at an admin’s discretion. Your email is used for verification purposes only, it will never be shared.