teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

追記

2016/12/03 16:13

投稿

退会済みユーザー
answer CHANGED
@@ -337,4 +337,65 @@
337
337
  </script>
338
338
  </body>
339
339
  </html>
340
+ ```
341
+
342
+ #追記
343
+
344
+ ```html
345
+
346
+ <script>
347
+ function number_format(num) {
348
+ return num.toLocaleString();
349
+ }
350
+
351
+ function loop_set(tgt) {
352
+
353
+ //描画回数
354
+ var refreshCount = 37;
355
+
356
+ //描画インターバル
357
+ var interval = 10;
358
+
359
+ // 変更前の値
360
+ var num = parseInt($('#count').attr('data-value')) + 0;
361
+
362
+ // 増減
363
+ var diff = tgt - num;
364
+
365
+ var id = setInterval(function () {
366
+
367
+ if ((diff > 0 && num <= tgt) || (diff < 0 && num > tgt)) {
368
+ num += Math.floor(diff / refreshCount);
369
+ } else {
370
+ num = tgt;
371
+ clearInterval(id);
372
+ }
373
+ $('#count').text(number_format(num))
374
+ .attr('data-value', num);
375
+
376
+ }, interval);
377
+ }
378
+
379
+ function pay() {// Ajax通信
380
+ if ($("form").serialize() === '') {
381
+ loop_set(0);
382
+ return;
383
+ }
384
+ $.ajax({
385
+ url: 'inc/calculation.php',
386
+ type: 'post',
387
+ dataType: 'json',
388
+ data: $("form").serialize()
389
+ }).done(function (response) {
390
+ loop_set(response['tgt']);
391
+ }).fail(function () {
392
+ alert('通信失敗');
393
+ });
394
+ }
395
+
396
+ $('.item').on('click', function () {
397
+ pay();
398
+ });
399
+
400
+ </script>
340
401
  ```

3

追記

2016/12/03 16:13

投稿

退会済みユーザー
answer CHANGED
@@ -229,4 +229,112 @@
229
229
  </script>
230
230
  </body>
231
231
  </html>
232
+ ```
233
+
234
+ #追記
235
+
236
+ ```html
237
+ <!DOCTYPE HTML>
238
+ <html lang="en-US">
239
+ <head>
240
+ <meta charset="UTF-8">
241
+ <title></title>
242
+ <style type="text/css">
243
+ #count {
244
+ width: 200px;
245
+ border: 1px solid #CCC;
246
+ padding: .5em;
247
+ text-align: right;
248
+ }
249
+ </style>
250
+ </head>
251
+ <body>
252
+ <form action="">
253
+ <ul>
254
+ <li>
255
+ <label>
256
+ <input class="item" type="radio" name="pay_01" value="10000" />
257
+ 10000
258
+ </label>
259
+ </li>
260
+ <li>
261
+ <label>
262
+ <input class="item" type="radio" name="pay_01" value="20000" />
263
+ 20000
264
+ </label>
265
+ </li>
266
+ </ul>
267
+ <ul>
268
+ <li>
269
+ <label>
270
+ <input class="item" type="checkbox" name="pay_02[]" value="500" />
271
+ 500
272
+ </label>
273
+ </li>
274
+ <li>
275
+ <label>
276
+ <input class="item" type="checkbox" name="pay_02[]" value="10000" />
277
+ 10000
278
+ </label>
279
+ </li>
280
+ </ul>
281
+ </form>
282
+
283
+ <div id="count" data-value="0">
284
+ 0
285
+ </div>
286
+
287
+ <script type="text/javascript" src="//code.jquery.com/jquery-3.1.1.min.js"></script>
288
+ <script>
289
+ function number_format(num) {
290
+ return num.toLocaleString();
291
+ }
292
+
293
+ function loop_set(tgt) {
294
+
295
+ //描画回数
296
+ var refreshCount = 37;
297
+
298
+ //描画インターバル
299
+ var interval = 10;
300
+
301
+ // 変更前の値
302
+ var num = parseInt($('#count').attr('data-value')) + 0;
303
+
304
+ // 増減
305
+ var diff = tgt - num;
306
+
307
+ var id = setInterval(function () {
308
+
309
+ if ((diff > 0 && num <= tgt) || (diff < 0 && num > tgt)) {
310
+ num += Math.floor(diff / refreshCount);
311
+ } else {
312
+ num = tgt;
313
+ clearInterval(id);
314
+ }
315
+ $('#count').text(number_format(num))
316
+ .attr('data-value', num);
317
+
318
+ }, interval);
319
+ }
320
+
321
+ function pay() {// Ajax通信
322
+ $.ajax({
323
+ url: 'inc/calculation.php',
324
+ type: 'post',
325
+ dataType: 'json',
326
+ data: $("form").serialize()
327
+ }).done(function (response) {
328
+ loop_set(response['tgt']);
329
+ }).fail(function () {
330
+ alert('通信失敗');
331
+ });
332
+ }
333
+
334
+ $('.item').on('click', function () {
335
+ pay();
336
+ });
337
+ </script>
338
+ </body>
339
+ </html>
232
340
  ```

2

追記

2016/12/03 15:27

投稿

退会済みユーザー
answer CHANGED
@@ -123,4 +123,110 @@
123
123
  header('Content-type: application/json');
124
124
  $calculation = array('tgt' => calculate(filter_input_array(INPUT_POST)));
125
125
  echo json_encode($calculation);
126
+ ```
127
+
128
+ #追記
129
+
130
+ 減算方向の処理でも結構簡素化できました。
131
+
132
+ ```html
133
+ <!DOCTYPE HTML>
134
+ <html lang="en-US">
135
+ <head>
136
+ <meta charset="UTF-8">
137
+ <title></title>
138
+ <style type="text/css">
139
+ #count {
140
+ width: 200px;
141
+ border: 1px solid #CCC;
142
+ padding: .5em;
143
+ text-align: right;
144
+ }
145
+ </style>
146
+ </head>
147
+ <body>
148
+ <form action="">
149
+ <ul>
150
+ <li>
151
+ <label>
152
+ <input class="item" type="radio" name="pay_01" value="10000" />
153
+ 10000
154
+ </label>
155
+ </li>
156
+ <li>
157
+ <label>
158
+ <input class="item" type="radio" name="pay_01" value="20000" />
159
+ 20000
160
+ </label>
161
+ </li>
162
+ </ul>
163
+ <ul>
164
+ <li>
165
+ <label>
166
+ <input class="item" type="checkbox" name="pay_02[]" value="500" />
167
+ 500
168
+ </label>
169
+ </li>
170
+ <li>
171
+ <label>
172
+ <input class="item" type="checkbox" name="pay_02[]" value="10000" />
173
+ 10000
174
+ </label>
175
+ </li>
176
+ </ul>
177
+ </form>
178
+
179
+ <div id="count">
180
+ 0
181
+ </div>
182
+
183
+ <script type="text/javascript" src="//code.jquery.com/jquery-3.1.1.min.js"></script>
184
+ <script>
185
+
186
+ // 初期値
187
+ var num = 0;
188
+
189
+ function loop_set(tgt) {
190
+
191
+ //描画回数
192
+ var refreshCount = 37;
193
+
194
+ //描画インターバル
195
+ var interval = 10;
196
+
197
+ // 増減
198
+ var diff = tgt - $('#count').text();
199
+
200
+ var id = setInterval(function () {
201
+
202
+ if ((diff > 0 && num <= tgt) || (diff < 0 && num > tgt)) {
203
+ num += Math.floor(diff / refreshCount);
204
+ } else {
205
+ num = tgt;
206
+ clearInterval(id);
207
+ }
208
+ $('#count').text(num);
209
+
210
+ }, interval);
211
+ }
212
+
213
+ function pay() {// Ajax通信
214
+ $.ajax({
215
+ url: 'inc/calculation.php',
216
+ type: 'post',
217
+ dataType: 'json',
218
+ data: $("form").serialize()
219
+ }).done(function (response) {
220
+ loop_set(response['tgt']);
221
+ }).fail(function () {
222
+ alert('通信失敗');
223
+ });
224
+ }
225
+
226
+ $('.item').on('click', function () {
227
+ pay();
228
+ });
229
+ </script>
230
+ </body>
231
+ </html>
126
232
  ```

1

修正

2016/12/03 13:53

投稿

退会済みユーザー
answer CHANGED
@@ -2,6 +2,7 @@
2
2
  描画の回数を減らす。`/ 300` となると、1000分の1秒ごとに300回描画するので。
3
3
  描画のインターバルを増やす。1000分の1秒だとクライアントのマシンのスペックによってもたつく。
4
4
  冗長な処理を簡素化。
5
+ obClick はレガシーコードなので、削除。`on('click', function(){})`に置き換え。
5
6
 
6
7
  ```html
7
8
  <!DOCTYPE HTML>
@@ -62,12 +63,12 @@
62
63
  var num = 0;
63
64
 
64
65
  //描画回数
65
- var refreshCount = 20;
66
+ var refreshCount = 23; // 素数の方が演出的にいいかも
66
67
 
67
68
  //描画インターバル
68
69
  var interval = 10;
69
70
 
70
- id = setInterval(function () {
71
+ var id = setInterval(function () {
71
72
 
72
73
  if (num <= tgt) {
73
74
  num += Math.floor(tgt / refreshCount);