回答編集履歴

1

テスト用のものを掲載しました。

2021/12/19 05:19

投稿

babu_babu_baboo
babu_babu_baboo

スコア616

test CHANGED
@@ -99,3 +99,543 @@
99
99
 
100
100
 
101
101
  ```
102
+
103
+ >出来ませんでした
104
+
105
+
106
+
107
+ 危うく消すところでした。
108
+
109
+ テストに使ったコードです。
110
+
111
+
112
+
113
+ 関数 add が機能を兼用しているのがダメですよ
114
+
115
+
116
+
117
+ ```html&js
118
+
119
+ <!DOCTYPE html>
120
+
121
+ <html lang="ja">
122
+
123
+ <head>
124
+
125
+ <meta charset="UTF-8" />
126
+
127
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
128
+
129
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
130
+
131
+
132
+
133
+ <!-- CSS -->
134
+
135
+ <link
136
+
137
+ href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css"
138
+
139
+ rel="stylesheet"
140
+
141
+ integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1"
142
+
143
+ crossorigin="anonymous"
144
+
145
+ />
146
+
147
+
148
+
149
+ <title>条件分岐の練習</title>
150
+
151
+ </head>
152
+
153
+ <body class="bg-light">
154
+
155
+ <div class="container w-100">
156
+
157
+ <h1 class="text-center text-info my-4">納期管理アプリ</h1>
158
+
159
+
160
+
161
+ <form id="all_radio">
162
+
163
+ <div class="responsibility">
164
+
165
+ <div class="form-check">
166
+
167
+ <input
168
+
169
+ class="form-check-input"
170
+
171
+ type="radio"
172
+
173
+ name="deadline"
174
+
175
+ id="t_t"
176
+
177
+ value="0"
178
+
179
+ checked
180
+
181
+ />
182
+
183
+ <label class="form-check-label" for="flexRadioDefault2">
184
+
185
+ 通常業務、通常配送
186
+
187
+ </label>
188
+
189
+ </div>
190
+
191
+ <div class="form-check">
192
+
193
+ <input
194
+
195
+ class="form-check-input"
196
+
197
+ type="radio"
198
+
199
+ name="deadline"
200
+
201
+ id="t_k"
202
+
203
+ value="1"
204
+
205
+ />
206
+
207
+ <label class="form-check-label" for="flexRadioDefault1">
208
+
209
+ 通常業務、緊急配送
210
+
211
+ </label>
212
+
213
+ </div>
214
+
215
+ </div>
216
+
217
+
218
+
219
+ <div class="deadline mt-3">
220
+
221
+ <div class="form-check">
222
+
223
+ <input
224
+
225
+ class="form-check-input"
226
+
227
+ type="radio"
228
+
229
+ name="deadline"
230
+
231
+ id="j_t"
232
+
233
+ value="2"
234
+
235
+ />
236
+
237
+ <label class="form-check-label" for="flexRadioDefault2">
238
+
239
+ 重要業務、通常配送
240
+
241
+ </label>
242
+
243
+ </div>
244
+
245
+ <div class="form-check">
246
+
247
+ <input
248
+
249
+ class="form-check-input"
250
+
251
+ type="radio"
252
+
253
+ name="deadline"
254
+
255
+ id="j_k"
256
+
257
+ value="3"
258
+
259
+ />
260
+
261
+ <label class="form-check-label" for="flexRadioDefault1">
262
+
263
+ 重要業務、緊急配送
264
+
265
+ </label>
266
+
267
+ </div>
268
+
269
+ </div>
270
+
271
+ </form>
272
+
273
+
274
+
275
+ <form id="form" class="mt-2 mb-5">
276
+
277
+ <input
278
+
279
+ id="input"
280
+
281
+ class="form-control"
282
+
283
+ placeholder="納期、送り先を入力"
284
+
285
+ autocomplete="off"
286
+
287
+ />
288
+
289
+ </form>
290
+
291
+
292
+
293
+ <div id="all_ul" class="f-container">
294
+
295
+ <ul class="list-group text-secondary" id="ul_3">
296
+
297
+ 重要、緊急
298
+
299
+ </ul>
300
+
301
+ <ul class="list-group text-secondary" id="ul_2">
302
+
303
+ 重要、通常
304
+
305
+ </ul>
306
+
307
+ <ul class="list-group text-secondary" id="ul_1">
308
+
309
+ 通常、緊急
310
+
311
+ </ul>
312
+
313
+ <ul class="list-group text-secondary" id="ul_0">
314
+
315
+ 通常、通常
316
+
317
+ </ul>
318
+
319
+ </div>
320
+
321
+ </div>
322
+
323
+
324
+
325
+ <!-- Resetボタン -->
326
+
327
+ <div class="d-grid gap-2 col-1 mx-auto pt-5">
328
+
329
+ <button id="Reset" class="btn btn-primary" type="button">Reset</button>
330
+
331
+ </div>
332
+
333
+
334
+
335
+ <script>
336
+
337
+ const form = document.getElementById("form");
338
+
339
+ const input = document.getElementById("input");
340
+
341
+ const ul_0 = document.getElementById("ul_0");
342
+
343
+ const ul_1 = document.getElementById("ul_1");
344
+
345
+ const ul_2 = document.getElementById("ul_2");
346
+
347
+ const ul_3 = document.getElementById("ul_3");
348
+
349
+ const all_radio = document.getElementById("all_radio");
350
+
351
+
352
+
353
+ loadData ();
354
+
355
+ // ローカルデータ読み込み
356
+
357
+ /*
358
+
359
+ let todos = JSON.parse(localStorage.getItem("todos"));
360
+
361
+ if (todos) {
362
+
363
+ // 配列の全要素に対して反復処理
364
+
365
+ todos.forEach((todo) => {
366
+
367
+ add(todo);
368
+
369
+ });
370
+
371
+ }
372
+
373
+ */
374
+
375
+ // フォームがエンター(submit)された時処理
376
+
377
+ form.addEventListener("submit", function (event) {
378
+
379
+ // デフォルトのイベント中止(エンター後のリロード)
380
+
381
+ event.preventDefault();
382
+
383
+ // 下記の関数submit後に行いたい処理
384
+
385
+ add();
386
+
387
+ });
388
+
389
+
390
+
391
+ function add(todo) {
392
+
393
+ // フォームに入力された値を取る
394
+
395
+ let todoText = input.value;
396
+
397
+
398
+
399
+ if (todo) {
400
+
401
+ todoText = todo.text;
402
+
403
+ }
404
+
405
+ // フォームが空の状態でのliタグの追加を防ぐ
406
+
407
+ if (todoText.length > 0) {
408
+
409
+ // liタグの作成
410
+
411
+ const li = document.createElement("li");
412
+
413
+ // liにフォームに入力された値を入れる
414
+
415
+ li.innerText = todoText;
416
+
417
+ // liタグにlist-group-itemクラスの追加、デザインの為
418
+
419
+ li.classList.add("list-group-item");
420
+
421
+
422
+
423
+ // ラジオボタンの選択された値
424
+
425
+ let radioNodeList = all_radio.deadline;
426
+
427
+ let radiobtn = radioNodeList.value;
428
+
429
+
430
+
431
+ switch (radiobtn) {
432
+
433
+ case "0":
434
+
435
+ // ul_0の子要素として追加する
436
+
437
+ ul_0.appendChild(li);
438
+
439
+ // フォームを空にする
440
+
441
+ input.value = "";
442
+
443
+ // ローカルストレージに保存する
444
+
445
+ saveData();
446
+
447
+ break;
448
+
449
+ case "1":
450
+
451
+ ul_1.appendChild(li);
452
+
453
+ input.value = "";
454
+
455
+ saveData();
456
+
457
+ break;
458
+
459
+ case "2":
460
+
461
+ ul_2.appendChild(li);
462
+
463
+ input.value = "";
464
+
465
+ saveData();
466
+
467
+ break;
468
+
469
+ case "3":
470
+
471
+ ul_3.appendChild(li);
472
+
473
+ input.value = "";
474
+
475
+ saveData();
476
+
477
+ }
478
+
479
+
480
+
481
+ if (todo && todo.completed) {
482
+
483
+ li.classList.add("text-decoration-line-through");
484
+
485
+ }
486
+
487
+
488
+
489
+ li.addEventListener("contextmenu", function (event) {
490
+
491
+ // 右クリックイベントブロック
492
+
493
+ event.preventDefault();
494
+
495
+ li.remove();
496
+
497
+ saveDate();
498
+
499
+ });
500
+
501
+
502
+
503
+ li.addEventListener("click", function () {
504
+
505
+ li.classList.toggle("text-decoration-line-through");
506
+
507
+ saveDate();
508
+
509
+ });
510
+
511
+ }
512
+
513
+ }
514
+
515
+ // li要素を取得して、配列としてまとめておく
516
+
517
+ function saveData() {
518
+
519
+ const lists = document.querySelectorAll("li");
520
+
521
+ // 空の配列を定義
522
+
523
+ const todos = { };
524
+
525
+ // 配列の全要素に対して反復処理
526
+
527
+ lists.forEach((li) => {
528
+
529
+ // todosの配列に追加していく処理
530
+
531
+ let parent = li.parentNode, id = parent.id;
532
+
533
+ if (id) {
534
+
535
+ if (! todos[id])
536
+
537
+ todos[id] = [ ];
538
+
539
+
540
+
541
+ todos[id].push ({
542
+
543
+ // 入力された値
544
+
545
+ text: li.innerText,
546
+
547
+ completed: li.classList.contains("text-decoration-line-through"),
548
+
549
+ });
550
+
551
+ }
552
+
553
+ });
554
+
555
+ // jsonでローカルデータ保存
556
+
557
+ localStorage.setItem("todos", JSON.stringify(todos));
558
+
559
+ }
560
+
561
+
562
+
563
+ function loadData () {
564
+
565
+ let todos = JSON.parse(localStorage.getItem("todos"));
566
+
567
+ if (! todos)
568
+
569
+ return;
570
+
571
+
572
+
573
+ let LI = document.createElement ('li');
574
+
575
+ LI.classList.add ("list-group-item");
576
+
577
+
578
+
579
+ for (let [id, group] of Object.entries (todos)) {
580
+
581
+ let ul = document.getElementById (id);
582
+
583
+ if (ul){
584
+
585
+ for (let {text, completed} of group) {
586
+
587
+ let li = LI.cloneNode (false);
588
+
589
+ li.textContent = text;
590
+
591
+ if (completed)
592
+
593
+ li.classList.add("text-decoration-line-through");
594
+
595
+ ul.appendChild (li);
596
+
597
+ }
598
+
599
+ }
600
+
601
+ }
602
+
603
+ }
604
+
605
+
606
+
607
+ // リセットボタン
608
+
609
+ const Reset = document.getElementById("Reset");
610
+
611
+
612
+
613
+ Reset.addEventListener("click", function () {
614
+
615
+ // 子要素全消去
616
+
617
+ all_ul.innerHTML = "";
618
+
619
+ window.location.reload();
620
+
621
+ saveDate();
622
+
623
+ });
624
+
625
+
626
+
627
+ input.addEventListener ('change', function () {
628
+
629
+ add();
630
+
631
+ }, false);
632
+
633
+
634
+
635
+ </script>
636
+
637
+ </body>
638
+
639
+ </html>
640
+
641
+ ```