スライダーコントロール



0   名前: れい : 2007/02/11(日) 22:10  ID:elQ/0TlY sub-Q5
どうもこんにちは。

javascriptでスライダーを作成しようとしています。

GaugeCtrlとMoveActionがあり、GaugeCtrlは画面のスライダーを動かし、
MoveActionは、赤いバーをドラッグ移動させるものです。

なぜ、GaugeCtrlのほうは動き、MoveActionは動かないのでしょうか?
onloadの関数のmoveObj.addAction1('panel_bar');を最後に持ってくると、
逆にMoveActionが動き、スライダーのほうが動かなくなります。

理由が分からないので、教えてもらおうと思い、登校します。
よろしくお願いします。


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"/>
<title>gauge</title>
<script type="text/javascript">
<!--
var gaugeCtrl;
var z_index;
var moveObj;

function GaugeCtrl(){

var target;
var context = this;
context.elemName;
var start = 0;

//
function addAction(elem){

var div = document.getElementById(elem);
div.onmousedown = startDrag;

document.onmouseup=endDrag;
//div.onmouseout=endDrag;
document.onmousemove=moveDrag;

}
this.addAction = addAction;

//
function startDrag(){

context.target = document.getElementById(this.value);
offsetX = event.offsetX;

start = offsetX;

//z_index++;
//context.target.style.zIndex = z_index;
return false;
}
this.startDrag = startDrag;

//
function moveDrag(){

if(!context.target){return false};
var x;

//x,y
x = event.clientX + document.body.scrollLeft;
if(x >= 145){
context.target.style.position='absolute';
context.target.style.left=132;
document.getElementById('mater').innerHTML = context.target.style.left;
endDrag();
return false;

}else if(50 >= x){
context.target.style.position='absolute';
context.target.style.left=52;
document.getElementById('mater').innerHTML = context.target.style.left;
endDrag();
return false;

}else{
x-=offsetX;
context.target.style.position='absolute';
context.target.style.left=x;
document.getElementById('mater').innerHTML = context.target.style.left;
return false;
};

}
this.moveDrag = moveDrag;

//
function endDrag(){

if(!context.target){return false};
if(context.target.style.left + 5 < 50){
alert();
}
context.target = null;
}
this.endDrag = endDrag;


}
//
function MoveAction(){

var context1 = this;
context1.target;
context1.elemName;
//
function addAction1(elem){

var div = document.getElementById(elem);
div.onmousedown = startDrag1;

document.onmouseup=endDrag1;
document.onmousemove=moveDrag1;

}
this.addAction1 = addAction1;

//
function startDrag1(){

context1.target = document.getElementById(this.value);

offsetX = event.offsetX;
offsetY = event.offsetY;

z_index++;
context1.target.style.zIndex = z_index;
return false;
}
this.startDrag1 = startDrag1;

//
function moveDrag1(){

if(!context1.target){return true}
var x;
var y;

//x,y
x = event.clientX + document.body.scrollLeft;
y = event.clientY + document.body.scrollTop;

x-=offsetX;
y-=offsetY;
context1.target.style.position='absolute';
context1.target.style.left=x;
context1.target.style.top=y;

return false;
}
this.moveDrag1 = moveDrag1;

//
function endDrag1(){
context1.target = null;
}
this.endDrag1 = endDrag1;

//
function enableDragAction(){
addAction(context1.elemName);
}
this.enable = enableDragAction;

//
function unable(event){
var elem = event ? event.target : window.event.srcElement;
var bar = elem.parentNode;
context1.elemName = bar.id;

bar.onmousedown = "";
elem.onmouseout = enableDragAction;
}
this.unable = unable;

}

window.onload = function(){

var gaugeCtrl = new GaugeCtrl();
var moveObj = new MoveAction();
gaugeCtrl.addAction('gauge');
moveObj.addAction1('panel_bar');
gaugeCtrl.addAction('gauge2');

}
//-->
</script>
<style type="text/css">
body{
margin-left: 0px;
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
width:900;

}
#panel_bar{
display:block;
background-color:red;
border-top:1px solid purple;
border-right:1px solid purple;
border-left:1px solid purple;
border-bottom:1px solid purple;
color:#ffffff;
cursor:pointer;
width:300;
height:20;
}

.memori{

background-image:url("../image/slider2.gif");

}
.pointer{
cursor:pointer;
}

#tbl{

}

</style>
</head>
<body>

<div id="panel">

<div id="panel_bar" value="panel" >
<p class="bar_content">Panel</p>
</div>

<div id="panel_body">
<table width="300" border="1" id="tbl">
<tbody>
<tr>
<td width="30">gauge</td>
<td width="100" class="memori">
<div><img class="pointer" id="gauge" value="gauge" src="../image/button_down.png"></div></td>
<td id="mater"></td>
</tr>
<tr>
<td width="30">gauge</td>
<td width="100" class="memori"><img class="pointer" id="gauge2" value="gauge2" src="../image/button_down.png"></td>
<td id="mater2">non</td>
</tr>
</tbody>

</table>
</div>

</div>

</body>
</html>

1   名前: れい : 2007/02/11(日) 22:10  ID:elQ/0TlY sub-Q5
すいません。追加で書きます。

現在、スライダーを動かすと、テーブルのオブジェクトから外れるためか、縦軸の位置がずれて、テーブルのセルが消えます。

このような問題は、どのように解決すればよいかも、アドバイスをお願いします。

2   名前: 匿名 : 2007/02/11(日) 22:10  ID:zI2A4Ka1 sub-Cz
1 つしかない document.onmousedown/move/up を取り合ってるんだもの。最後に上書きしたオブジェクトが勝つに決まってるわな。

最近(と言っても数年経つが)のスクリプトは、そういう書き方をしない。attachEvent(IE Event Model)か addEventListener(DOM Events)を調べてみれ。あるいは根性を見せるなら、グローバルな配列を使って自力でイベントハンドラ管理しても良い(IE メモリリーク問題に絡んで、そうしている人もいる)。

ちなみに、微妙なクロスブラウザ処理があるけど、これが IE 専用であることは大丈夫?(Opera、Safari ならかろうじて動くかもしれないが)


なお、

> context1.target.style.left=x;
> context1.target.style.top=y;
> width:300;
> height:20;

こういうのを見たら瞬時に気持ち悪くなってほしい。CSS の left、top、width、height は 0 以外では単位が必須。従って style.left 等も文字列として格納されているわけであり、

> if(context.target.style.left + 5 < 50){

これなんか潜在的なバグになっている。


> x = event.clientX + document.body.scrollLeft;
> y = event.clientY + document.body.scrollTop;

そろそろ IE 互換モード用にスクリプトを作るのは止めて良いと思う。標準モードでは document.documentElement.scrollLeft 等から取得する。

と言うか、今回はドラッグ移動だけなんだから、クライアント領域での移動量さえ分かれば良い。つまりスクロール量を調べる必要はない。こういう所で互換性を落とさないようにしよう。

3   名前: 匿名 : 2007/02/11(日) 22:10  ID:zI2A4Ka1 sub-Cz
>>2
> > if(context.target.style.left + 5 < 50){
> これなんか潜在的なバグになっている。

ごめん、潜在的どころか明らかなバグだね。例えば left: 40; の場合(単位がないので文法ミスだが、それは脇に置く)、style.left は文字列だから、

・'40' + 5 == '405'
・'405' < 50 == false

になる。位置計算がもう滅茶苦茶。

4   名前: れい : 2007/02/11(日) 22:10  ID:8DET73zi sub-OJ
ありがとうございます。ご意見を踏まえて、とりあえず以下のように作ってみました。
>今回はドラッグ移動だけなんだから、クライアント領域での移動量さえ分かれば良い。つまりスクロール量を調べる必要はない。こういう所で互換性を落とさないようにしよう。
は研究中です。

しかし、問題が2つあります。
1.最初にスライダを動かして、パネルを動かすと、スライダが置いてけぼりをくう。
2.スライダを動かすと、テーブルから外れるため、位置がずれる。

2を解決するために、最初に場所をcssで指定することはできますが、その場合、パネルを動かすと置いてけぼりを食います。

どのように解決すればいいのでしょうか。
よろしくお願いします。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"/>
<title>gauge</title>
<script type="text/javascript">
<!--
var gaugeCtrl;
var z_index;
var moveObj;
var parentX = 0;
var parentY = 0;

function GaugeCtrl(){

var target;
var context = this;
context.elemName;
var start = 0;
var absLeft = 40;
context.offsetX;

//Action
function addAction(elem){

var div = document.getElementById(elem);
div.onmousedown = startDrag;
//div.attachEvent('onmousedown',startDrag);
}
this.addAction = addAction;

//
function startDrag(){

document.onmouseup=endDrag;
document.onmousemove=moveDrag;
context.target = document.getElementById(this.value);
context.offsetX = event.offsetX;

start = context.offsetX;

return false;
}
this.startDrag = startDrag;

//
function moveDrag(){

if(!context.target){return false};
var x;

//x,y
x = event.clientX + document.body.scrollLeft - parentX;
//x = document.documentElement.scrollLeft
if(x >= 160){
context.target.style.position='absolute';
context.target.style.left = 150 + parseInt(parentX) + 'px';
document.getElementById('mater').innerHTML = context.target.style.left;
endDrag();
return false;
}else if(absLeft >= x){
context.target.style.position='absolute';
context.target.style.left = absLeft + 'px';
document.getElementById('mater').innerHTML = context.target.style.left;
endDrag();
return false;

}else{

x-=context.offsetX;
context.target.style.position='absolute';
context.target.style.left=x;
document.getElementById('mater').innerHTML = x;
return false;
};

}
this.moveDrag = moveDrag;

//
function endDrag(){

document.onmouseup = null;
document.onmousemove = null;
if(!context.target){return false};
if(parseInt(context.target.style.left) < 40){
context.target.style.left = '40px';
}else if(parseInt(context.target.style.left) > 150){
context.target.style.left = '150px';
}
document.onmouseup = null;
document.onmousemove = null;
context.target = null;
}
this.endDrag = endDrag;

}
//
function MoveAction(){

var context1 = this;
context1.target;
context1.elemName;

context1.eveObj = new Object();

//
function addAction1(elem){

var div = document.getElementById(elem);
div.onmousedown = startDrag1;
}
this.addAction1 = addAction1;

//
function startDrag1(){

document.onmouseup = endDrag1;
document.onmousemove = moveDrag1;

context1.target = document.getElementById(this.value);

offsetX = event.offsetX;
offsetY = event.offsetY;

z_index++;
context1.target.style.zIndex = z_index;
return false;
}
this.startDrag1 = startDrag1;

//
function moveDrag1(){

if(!context1.target){return true}
var x;
var y;

//x,y
x = event.clientX + document.body.scrollLeft;
y = event.clientY + document.body.scrollTop;

x-=offsetX;
y-=offsetY;
context1.target.style.position='absolute';
context1.target.style.left = x + 'px';
context1.target.style.top = y + 'px';
parentX = x;
parentY = y;
return false;
}
this.moveDrag1 = moveDrag1;

//
function endDrag1(){
context1.target = null;
document.onmouseup = null;
document.onmousemove = null;
}
this.endDrag1 = endDrag1;

//
function enableDragAction(){
addAction(context1.elemName);
}
this.enable = enableDragAction;

//
function unable(event){
var elem = event ? event.target : window.event.srcElement;
var bar = elem.parentNode;
context1.elemName = bar.id;

bar.onmousedown = "";
elem.onmouseout = enableDragAction;
}
this.unable = unable;

}

window.onload = function(){

var gaugeCtrl = new GaugeCtrl();
var moveObj = new MoveAction();
moveObj.addAction1('panel_bar');
gaugeCtrl.addAction('gauge');
gaugeCtrl.addAction('gauge2');

}
//-->
</script>
<style type="text/css">
body{
margin-left: 0px;
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
width:900;

}
#panel_bar{
display:block;
background-color:red;
border-top:1px solid purple;
border-right:1px solid purple;
border-left:1px solid purple;
border-bottom:1px solid purple;
color:#ffffff;
cursor:pointer;
width:300;
height:20;
}

.memori{

background-image:url("../image/slider2.gif");

}
.pointer{
cursor:pointer;
}

#tbl{
border-collapse:collapse;

}
#gauge{

}
</style>
</head>
<body>

<div id="panel">

<div id="panel_bar" value="panel" >
<p class="bar_content">Panel</p>
</div>

<div id="panel_body">
<table width="300" border="1" id="tbl">
<tbody>
<tr>
<td width="40">gauge</td>
<td width="105" class="memori" id = "memori">
<img class="pointer" id="gauge" value="gauge" src="../image/pointer1.gif">
</td>
<td id="mater"></td>
</tr>
<tr>
<td width="30">gauge</td>
<td width="105" class="memori"><img class="pointer" id="gauge2" value="gauge2" src="../image/pointer1.gif"></td>
<td id="mater2">non</td>
</tr>
</tbody>

</table>
</div>

</div>

</body>
</html>

5   名前: れい : 2007/02/11(日) 22:10  ID:8DET73zi sub-OJ
こんばんは。あれから、パネル自体を最初からabsoluteにすることで、この問題は解決しました。
ありがとうございます。

一覧へ戻る