回答編集履歴

1

追記

2016/06/17 11:28

投稿

masaya_ohashi
masaya_ohashi

スコア9206

test CHANGED
@@ -15,3 +15,161 @@
15
15
  TouchEventにbuttons,witch,buttonというパラメータはありません。おそらくここでエラーが起きて処理が止まっています。
16
16
 
17
17
  window.TouchEventで判断したあとにこれらの判断を持って行きましょう。
18
+
19
+
20
+
21
+ ### 追記
22
+
23
+ Chromeのデバイスシミュレータでテストした結果、eはjQuery.Eventでラップされており、originalEventというプロパティに本来のイベントが格納されているようです。クリックのイベントは例外的にjQuery.Eventにもプロパティがコピーされているため、普通にアクセスできるようです。
24
+
25
+ そして、実際に飛んできたイベントがTouchEventかどうかを調べる判断方法に変えてみました。
26
+
27
+ さらに、var XやYの宣言タイミングがおかしかったので改善してみました。
28
+
29
+ ```Javascript
30
+
31
+ function onMove(e) {
32
+
33
+ var rect = e.target.getBoundingClientRect();
34
+
35
+ var X = undefined;
36
+
37
+ var Y = undefined;
38
+
39
+ if (window.TouchEvent && e.originalEvent instanceof TouchEvent) {
40
+
41
+ X = (e.originalEvent.changedTouches[0].pageX - rect.left);
42
+
43
+ Y = (e.originalEvent.changedTouches[0].pageY - rect.top);
44
+
45
+ } else {
46
+
47
+ if (e.buttons === 1 || e.witch === 1) {
48
+
49
+ X = (e.clientX - rect.left);
50
+
51
+ Y = (e.clientY - rect.top);
52
+
53
+ }
54
+
55
+ }
56
+
57
+ if (X != undefined && Y != undefined) {
58
+
59
+ draw(X, Y);
60
+
61
+ }
62
+
63
+ };
64
+
65
+
66
+
67
+ function onClick(e) {
68
+
69
+ var rect = e.target.getBoundingClientRect();
70
+
71
+ var X = undefined;
72
+
73
+ var Y = undefined;
74
+
75
+ if (window.TouchEvent && e.originalEvent instanceof TouchEvent) {
76
+
77
+ X = (e.originalEvent.changedTouches[0].pageX - rect.left);
78
+
79
+ Y = (e.originalEvent.changedTouches[0].pageY - rect.top);
80
+
81
+ } else {
82
+
83
+ if (e.button === 0) {
84
+
85
+ X = (e.clientX - rect.left);
86
+
87
+ Y = (e.clientY - rect.top);
88
+
89
+ }
90
+
91
+ }
92
+
93
+ if (X != undefined && Y != undefined) {
94
+
95
+ draw(X, Y);
96
+
97
+ }
98
+
99
+ };
100
+
101
+ ```
102
+
103
+
104
+
105
+ ###補足
106
+
107
+ PCのChromeではif(window.TouchEvent)はtrueになりますが、マウスでクリックするとMouseEventが飛んできます。なので、いまのイベントハンドラの登録では動作しません(実際私のPC環境では動きませんでした)。
108
+
109
+ いっそのことイベントハンドラの登録は、どちらもしてしまうべきかと思います。
110
+
111
+ ```Javascript
112
+
113
+ $('canvas').on('touchstart', function(e) {
114
+
115
+ onClick(e);
116
+
117
+ isDrawing = true;
118
+
119
+ }).on('touchmove', function(e) {
120
+
121
+ onMove(e);
122
+
123
+ e.preventDefault();
124
+
125
+ }).on('touchend', function() {
126
+
127
+ if (!isDrawing) return;
128
+
129
+ saveImageData();
130
+
131
+ isDrawing = false;
132
+
133
+ }).on('touchcancel', function() {
134
+
135
+ if (!isDrawing) return;
136
+
137
+ saveImageData();
138
+
139
+ isDrawing = false;
140
+
141
+ }).on('mousedown', function(e) {
142
+
143
+ onClick(e);
144
+
145
+ isDrawing = true;
146
+
147
+ }).on('mousemove', function(e) {
148
+
149
+ onMove(e);
150
+
151
+ }).on('mouseup', function() {
152
+
153
+ if (!isDrawing) return;
154
+
155
+ drawEnd();
156
+
157
+ saveImageData();
158
+
159
+ isDrawing = false;
160
+
161
+ }).on('mouseleave', function() {
162
+
163
+ if (!isDrawing) return;
164
+
165
+ drawEnd();
166
+
167
+ saveImageData();
168
+
169
+ isDrawing = false;
170
+
171
+ });
172
+
173
+
174
+
175
+ ```