drag.js
5.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
//グローバル変数の定義
var top_dif; // マウスポインタと画像のY座標の差分
var left_dif; // マスポインタと画像のX座標の差分
var outframe_pos; // 画像表示窓領域の座標格納オブジェクト
var inframe; // 画像格納領域のdiv要素
var outframe; // 画像表示窓領域のdiv要素
var image_width = 1024; // 画像サイズ(幅)
var image_height = 768; // 画像サイズ(高さ)
var image_left_offset = -312; // 最初に表示する画像の位置オフセット
var image_top_offset = -234; // 最初に表示する画像の位置オフセット
// バブリングとデフォルトイベントアクションの停止
function stopDefaultAndPropagation(e) {
// バブリング停止
if(e.stopPropagation) {
e.stopPropagation();
}
if(window.event) {
window.event.cancelBubble = true;
}
// デフォルトイベントアクションを停止する
if(e.preventDefault) {
e.preventDefault();
}
if(window.event) {
window.event.returnValue = false;
}
}
// ドラッグ開始
function dragStart(e) {
// 画像表示窓領域div要素の座標を取得
outframe_pos = getElemPos(outframe);
// 画像格納領域div要素の座標を取得
var pos = getElemPos(inframe);
// 画像格納領域div要素とマウスポインターの位置の差分を求める
left_dif = e.clientX - pos.x;
top_dif = e.clientY - pos.y;
// ドキュメント全体にイベントリスナーをセット
addListener(document, 'mousemove', moveElem, false);
addListener(document, 'mouseup', dragEnd, false);
// バブリングとデフォルトイベントアクションの停止
stopDefaultAndPropagation(e);
return false;
}
// ドラッグ終了
function dragEnd(e) {
if(e.preventDefault) e.preventDefault();
// イベントリスナー解除
removeListener(document, 'mousemove', moveElem, false);
removeListener(document, 'mouseup', dragEnd, false);
// マウスドラッグのフラグをfalseにセット
dragging = false;
// バブリングとデフォルトイベントアクションの停止
stopDefaultAndPropagation(e);
return false;
}
// ドラッグ中(子ウィンドウ移動)
function moveElem(e) {
// マウスがブラウザー表示領域から外れたら終了
if(
(navigator.appName == 'Netscape' && navigator.userAgent.indexOf("Safari") < 0 ) ||
navigator.userAgent.indexOf("Opera") >= 0
) {
if(
e.clientX >= window.innerWidth - 20 || e.clientX <= 10 ||
e.clientY >= window.innerHeight - 30 || e.clientY <= 10
) {
dragEnd(e);
return false;
}
}
// 画像格納領域div要素の移動
inframe.style.left = (e.clientX - outframe_pos.x - left_dif) + 'px';
inframe.style.top = (e.clientY - outframe_pos.y - top_dif) + 'px';
// バブリングとデフォルトイベントアクションの停止
stopDefaultAndPropagation(e);
return false;
}
// 要素の位置を取得し、オブジェクトとして返す
function getElemPos(elem) {
var obj = new Object();
obj.x = elem.offsetLeft;
obj.y = elem.offsetTop;
while(elem.offsetParent) {
elem = elem.offsetParent;
obj.x += elem.offsetLeft;
obj.y += elem.offsetTop;
}
return obj;
}
function getTargetNode(e) {
// 対象要素の参照を取得
var target_node;
if(e.target) {
target_node = e.target;
} else {
target_node = e.srcElement;
}
// Safari対策
if (target_node.nodeType == 3) {
target_node = target_node.parentNode;
}
return target_node;
}
// load時の処理
function setListeners(e) {
// 画像表示窓領域と画像格納領域のdiv要素の参照をグローバル変数にセット
outframe = document.getElementById('outframe');
inframe = document.getElementById('inframe');
// 画像格納領域div要素内にimgタグをセット
var img = document.createElement('img');
img.width = image_width;
img.height = image_height;
img.id = 'img';
img.src = 'images/big.jpg';
inframe.appendChild(img);
// 画像格納領域div要素の位置を調整
inframe.style.left = image_left_offset + 'px';
inframe.style.top = image_top_offset + 'px';
// 画像表示窓領域div要素にmousedownイベントリスナーをセット
addListener(outframe, 'mousedown', dragStart, false);
}
// イベントリスナー解除
function removeListener(elem, eventType, func, cap) {
if(elem.removeEventListener) {
elem.removeEventListener(eventType, func, cap);
} else if(elem.detachEvent) {
elem.detachEvent('on' + eventType, func);
}
}
// イベントリスナー登録
function addListener(elem, eventType, func, cap) {
if(elem.addEventListener) {
elem.addEventListener(eventType, func, cap);
} else if(elem.attachEvent) {
elem.attachEvent('on' + eventType, func);
} else {
alert('ご利用のブラウザーはサポートされていません。');
return false;
}
}
// load時のイベントリスナーをセットする
addListener(window, 'load', setListeners, false);