質問編集履歴

1

ソースコードの追加および内容を簡単に追記しました

2022/06/25 10:41

投稿

teru-
teru-

スコア13

test CHANGED
File without changes
test CHANGED
@@ -2,3 +2,94 @@
2
2
  preventDefault()やstopImmediatePropagation()ではイベントの伝藩を止められませんでした。
3
3
 
4
4
  もし方法があるのであれば、ご教授いただきたいです。
5
+
6
+ 失礼いたしました。追記になります。
7
+
8
+ 下記ソースコードです。
9
+ やりたいことは、要素をドラッグする場合はクリックイベントを発生させず、ドラッグをしない(要素自体をmousedown/mouseupしない=ドラッグしない)場合は、アラートを出したいです。
10
+ removeEventlistenerを使って試してみましたが、再登録がうまくできず、一度ドラッグしてしまうと、アラート(clickイベント)が発生しなくなってしまいました。
11
+
12
+ ```html
13
+ <div class="drag-and-drop" id="red-box"></div>
14
+ <div class="drag-and-drop" id="blue-box"></div>
15
+ <div class="drag-and-drop" id="yellow-box"></div>
16
+ ```
17
+
18
+ ```js
19
+ const body = document.querySelector("body");
20
+ body.addEventListener("click", hoge);
21
+ function hoge(e) {
22
+ alert("click");
23
+ }
24
+
25
+
26
+ {
27
+ var elements = document.getElementsByClassName("drag-and-drop");
28
+ console.log(elements);
29
+ var x;
30
+ var y;
31
+ var elem;
32
+
33
+ for (var i = 0; i < elements.length; i++) {
34
+ elements[i].addEventListener("mousedown", (e) => {
35
+ // body.removeEventListener("click", hoge);
36
+ e.stopImmediatePropagation();
37
+ e.preventDefault();
38
+ elem = e.target;
39
+ elem.classList.add("drag");
40
+
41
+ if (e.type === "mousedown") {
42
+ // var event = event;
43
+ } else {
44
+ console.log(e.changedTouches[0]);
45
+ var e = e.changedTouches[0];
46
+ }
47
+
48
+ //要素内の相対座標を取得
49
+ console.log(elem.offsetLeft);
50
+ console.log(elem.offsetX);
51
+ console.log(e.pageX);
52
+ x = e.pageX - elem.offsetLeft;
53
+ console.log(x);
54
+ y = e.pageY - elem.offsetTop;
55
+ document.body.addEventListener("mousemove", mmove, false);
56
+
57
+ e.stopImmediatePropagation();
58
+ e.preventDefault();
59
+ });
60
+ }
61
+
62
+ function mmove(e) {
63
+
64
+ var drag = document.getElementsByClassName("drag")[0];
65
+ if (e.type === "mousemove") {
66
+ var event = e;
67
+ } else {
68
+ var event = e.changedTouches[0];
69
+ }
70
+ e.preventDefault();
71
+
72
+ drag.style.top = event.pageY - y + "px";
73
+ drag.style.left = event.pageX - x + "px";
74
+
75
+ drag.addEventListener("mouseup", mup, false);
76
+ document.body.addEventListener("mouseleave", mup, false);
77
+ drag.addEventListener("touchend", mup, false);
78
+ document.body.addEventListener("touchleave", mup, false);
79
+
80
+ }
81
+
82
+ function mup(e) {
83
+
84
+ var drag = document.getElementsByClassName("drag")[0];
85
+
86
+ document.body.removeEventListener("mousemove", mmove, false);
87
+ drag.removeEventListener("mouseup", mup, false);
88
+ document.body.removeEventListener("touchmove", mmove, false);
89
+ drag.removeEventListener("touchend", mup, false);
90
+
91
+ drag.classList.remove("drag");
92
+ }
93
+ body.addEventListener("click", hoge);
94
+ }
95
+ ```