質問編集履歴

2

コードの短縮

2024/04/08 14:37

投稿

homepage-site
homepage-site

スコア28

test CHANGED
File without changes
test CHANGED
@@ -1,8 +1,8 @@
1
1
  ### 実現したいこと
2
- 画像アイコンを初めに表示して名前を次に表示したい。
2
+ 非同期通信で表示するコンテンツの順番を指定して、画像アイコン名前の順番で表示したい。
3
3
 
4
4
  ### 発生している問題・分からないこと
5
- 画像アイコンのに名前のコード書いても順番が固定されているのか名前が先に表示されてしまう。
5
+ 画像アイコンのに名前のコード後に書いても名前が先に表示されてしまう。
6
6
  ```ここに言語を入力
7
7
  divNamaePartialParts.appendChild(usericonImg);
8
8
  divNamaePartialParts.appendChild(child); // div (子要素) の末尾に child を追加
@@ -13,148 +13,8 @@
13
13
 
14
14
 
15
15
  ### 該当のソースコード
16
- ```HTML
17
- <div id="input_area">
18
- <form name="input_form">
19
- <div class="usericon-partial">
20
- <h2>画像アイコン(image icon)<span class="required">※任意</span></h2>
21
- <div class="usericon-thumbnail-button">
22
- <label>
23
- <div class="usericon-uploads">
24
- <img src="<?php echo $noimage_url; ?>" class="changeImg" style="height: 100px;">
25
- </div>
26
- <input type="file" class="attach" name="attach[]" data-maxsize="5" accept=".png, .jpg, .jpeg" style="display: none;">
27
- </label>
28
- <div class="viewer"></div>
29
- <button type="button" class="attachclear">clear</button>
30
- </div>
31
- </div>
32
-
33
- <div class="namae-partial-parts"> <!-- namae-partial-parts -->
34
- <h2>名前(name)<span class="required">※任意</span></h2>
35
- <div class="parts">
36
- <input class="input" type="text" name="namae" id="name" data-length="<?php echo MAX_LENGTH::NAME; ?>" data-minlength="<?php echo MIN_LENGTH::NAME; ?>" placeholder="未入力の場合は、匿名で表示されます">
37
- <div></div>
38
- </div>
39
- </div>
40
- </div>
41
-
42
- <div class="post-button"><!-- ボタンを押せなくする -->
43
- <button type="button" id="submit_button" name="mode" value="confirm">確認画面へ進む</button>
44
- </div>
45
- <!-- type、name、id、valueの順番 -->
46
- </form>
47
- </div>
48
- <div id="confirm_area"></div>
49
-
50
- <style>
51
- .concealItems {
52
- display: none;
53
- }
54
- </style>
55
- ```
56
-
57
16
  ```Javascript
58
17
  <script>
59
- const input_area = document.getElementById("input_area");
60
- const confirm_area = document.getElementById("confirm_area");
61
- var namae_value = "";
62
- // 要素が3個の空配列を作成
63
- const blobType = ["", "", "", ""];
64
- const blobUrl = ["", "", "", ""];
65
-
66
- const set_attach_event = function() {
67
- /* カメラ画像をファイルアップロード時に非表示にする */
68
- /* 省略 */
69
- /* カメラ画像をファイルアップロード時に非表示にする */
70
- const attach = document.querySelectorAll('.attach');
71
- const clear = document.querySelectorAll('.attachclear');
72
- const viewer = document.querySelectorAll('.viewer');
73
- const changeImg = document.querySelectorAll('.changeImg'); // 入力されたら消す画像
74
- for (let i = 0; i < attach.length; i++) {
75
- attach[i].addEventListener('change', () => {
76
- //HTML要素の中身を変更するときに使われるプロパティ
77
- if (i == 3) {
78
- maxsize = 5;
79
- height = "40px";
80
- width = "40px";
81
- } else {
82
- maxsize = 15;
83
- height = "350px";
84
- width = "528px";
85
- }
86
- if (attach[i].files[0].size > maxsize * 1024 * 1024) {
87
- alert('ファイルサイズが ' + maxsize + 'MBバイトを超えています');
88
- return;
89
- }
90
- viewer[i].innerHTML = "";
91
- //新コード
92
- blobType[i] = "";
93
- blobUrl[i] = "";
94
- if (attach[i].files.length !== 0) {
95
- //オブジェクトのURLを作成する
96
- blobUrl[i] = window.URL.createObjectURL(attach[i].files[0]);
97
- //ファイルの内容を読み込む FileReaderオブジェクト を生成し、ファイルの内容を非同期で取得
98
- const reader = new FileReader();
99
- reader.onload = () => {
100
- var child = null;
101
- //result プロパティは、ファイルの内容を返す
102
- if (reader.result.indexOf("data:image/jpeg;base64,") === 0 ||
103
- reader.result.indexOf("data:image/png;base64,") === 0) {
104
- blobType[i] = "img";
105
- child = document.createElement("img");
106
- } else if (reader.result.indexOf("data:video/mp4;base64,") === 0) {
107
- blobType[i] = "video";
108
- child = document.createElement("video");
109
- child.setAttribute("controls", null);
110
- } else if (reader.result.indexOf("data:application/pdf;base64,") === 0) {
111
- blobType[i] = "iframe";
112
- child = document.createElement("iframe");
113
- } else {
114
- alert("対象外のファイルです");
115
- attach[i].value = "";
116
- }
117
- if (child !== null) {
118
- child.style.height = height;
119
- child.style.width = width;
120
- child.src = blobUrl[i];
121
- //戻り値は追加した子要素 viewer[i]
122
- viewer[i].appendChild(child);
123
- //旧コード
124
- changeImg[i].classList.add('hideItems'); // もともとの画像を消す
125
- }
126
- };
127
- //指定されたBlob または File の内容を読み込む
128
- reader.readAsDataURL(attach[i].files[0]);
129
- }
130
- });
131
- clear[i].addEventListener('click', () => {
132
- blobType[i] = "";
133
- blobUrl[i] = "";
134
- attach[i].value = "";
135
- viewer[i].innerHTML = "";
136
- changeImg[i].classList.remove('hideItems');
137
- });
138
- };
139
- }
140
-
141
- const submit_button_click = function() {
142
- //ローディングアニメーション画像
143
- const submit_button = document.getElementById("submit_button");
144
- submit_button.disabled = true;
145
- submit_button.classList.add('wait');
146
- namae_value = "";
147
-
148
- //サーバーにデータを送信する際に使用するオブジェクトを生成
149
- const formData = new FormData(input_form);
150
- //オブジェクト内の既存のキーに新しい値を追加
151
- formData.append("action", "bbs_quest_submit");
152
- const opt = {
153
- method: "post",
154
- body: formData
155
- }
156
-
157
- const submit_button_click = function() {
158
18
  //非同期通信
159
19
  fetch("<?php echo home_url('wp-admin/admin-ajax.php'); ?>", opt)
160
20
  .then(response => {
@@ -207,8 +67,6 @@
207
67
  .catch(error => {
208
68
  console.log(error);
209
69
  });
210
- }
211
- }
212
70
  </script>
213
71
  ```
214
72
 
@@ -228,3 +86,5 @@
228
86
  ### 補足
229
87
  ※参考サイト
230
88
  https://so-zou.jp/web-app/tech/programming/javascript/dom/node/
89
+
90
+ https://qiita.com/terufumi1122/items/4cfcaa92e9a96058220c

1

コード追加

2024/04/08 07:56

投稿

homepage-site
homepage-site

スコア28

test CHANGED
File without changes
test CHANGED
@@ -13,16 +13,202 @@
13
13
 
14
14
 
15
15
  ### 該当のソースコード
16
+ ```HTML
17
+ <div id="input_area">
18
+ <form name="input_form">
19
+ <div class="usericon-partial">
20
+ <h2>画像アイコン(image icon)<span class="required">※任意</span></h2>
21
+ <div class="usericon-thumbnail-button">
22
+ <label>
23
+ <div class="usericon-uploads">
24
+ <img src="<?php echo $noimage_url; ?>" class="changeImg" style="height: 100px;">
25
+ </div>
26
+ <input type="file" class="attach" name="attach[]" data-maxsize="5" accept=".png, .jpg, .jpeg" style="display: none;">
27
+ </label>
28
+ <div class="viewer"></div>
29
+ <button type="button" class="attachclear">clear</button>
30
+ </div>
31
+ </div>
32
+
33
+ <div class="namae-partial-parts"> <!-- namae-partial-parts -->
34
+ <h2>名前(name)<span class="required">※任意</span></h2>
35
+ <div class="parts">
36
+ <input class="input" type="text" name="namae" id="name" data-length="<?php echo MAX_LENGTH::NAME; ?>" data-minlength="<?php echo MIN_LENGTH::NAME; ?>" placeholder="未入力の場合は、匿名で表示されます">
37
+ <div></div>
38
+ </div>
39
+ </div>
40
+ </div>
41
+
42
+ <div class="post-button"><!-- ボタンを押せなくする -->
43
+ <button type="button" id="submit_button" name="mode" value="confirm">確認画面へ進む</button>
44
+ </div>
45
+ <!-- type、name、id、valueの順番 -->
46
+ </form>
47
+ </div>
48
+ <div id="confirm_area"></div>
49
+
50
+ <style>
51
+ .concealItems {
52
+ display: none;
53
+ }
54
+ </style>
55
+ ```
16
56
 
17
57
  ```Javascript
18
- <script>   
58
+ <script>
59
+ const input_area = document.getElementById("input_area");
60
+ const confirm_area = document.getElementById("confirm_area");
61
+ var namae_value = "";
62
+ // 要素が3個の空配列を作成
63
+ const blobType = ["", "", "", ""];
64
+ const blobUrl = ["", "", "", ""];
65
+
66
+ const set_attach_event = function() {
67
+ /* カメラ画像をファイルアップロード時に非表示にする */
68
+ /* 省略 */
69
+ /* カメラ画像をファイルアップロード時に非表示にする */
70
+ const attach = document.querySelectorAll('.attach');
71
+ const clear = document.querySelectorAll('.attachclear');
72
+ const viewer = document.querySelectorAll('.viewer');
73
+ const changeImg = document.querySelectorAll('.changeImg'); // 入力されたら消す画像
74
+ for (let i = 0; i < attach.length; i++) {
75
+ attach[i].addEventListener('change', () => {
76
+ //HTML要素の中身を変更するときに使われるプロパティ
77
+ if (i == 3) {
78
+ maxsize = 5;
79
+ height = "40px";
80
+ width = "40px";
81
+ } else {
82
+ maxsize = 15;
83
+ height = "350px";
84
+ width = "528px";
85
+ }
86
+ if (attach[i].files[0].size > maxsize * 1024 * 1024) {
87
+ alert('ファイルサイズが ' + maxsize + 'MBバイトを超えています');
88
+ return;
89
+ }
90
+ viewer[i].innerHTML = "";
91
+ //新コード
92
+ blobType[i] = "";
93
+ blobUrl[i] = "";
94
+ if (attach[i].files.length !== 0) {
95
+ //オブジェクトのURLを作成する
96
+ blobUrl[i] = window.URL.createObjectURL(attach[i].files[0]);
97
+ //ファイルの内容を読み込む FileReaderオブジェクト を生成し、ファイルの内容を非同期で取得
98
+ const reader = new FileReader();
99
+ reader.onload = () => {
100
+ var child = null;
101
+ //result プロパティは、ファイルの内容を返す
102
+ if (reader.result.indexOf("data:image/jpeg;base64,") === 0 ||
103
+ reader.result.indexOf("data:image/png;base64,") === 0) {
104
+ blobType[i] = "img";
105
+ child = document.createElement("img");
106
+ } else if (reader.result.indexOf("data:video/mp4;base64,") === 0) {
107
+ blobType[i] = "video";
108
+ child = document.createElement("video");
109
+ child.setAttribute("controls", null);
110
+ } else if (reader.result.indexOf("data:application/pdf;base64,") === 0) {
111
+ blobType[i] = "iframe";
112
+ child = document.createElement("iframe");
113
+ } else {
114
+ alert("対象外のファイルです");
115
+ attach[i].value = "";
116
+ }
117
+ if (child !== null) {
118
+ child.style.height = height;
119
+ child.style.width = width;
120
+ child.src = blobUrl[i];
121
+ //戻り値は追加した子要素 viewer[i]
122
+ viewer[i].appendChild(child);
123
+ //旧コード
124
+ changeImg[i].classList.add('hideItems'); // もともとの画像を消す
125
+ }
126
+ };
127
+ //指定されたBlob または File の内容を読み込む
128
+ reader.readAsDataURL(attach[i].files[0]);
129
+ }
130
+ });
131
+ clear[i].addEventListener('click', () => {
132
+ blobType[i] = "";
133
+ blobUrl[i] = "";
134
+ attach[i].value = "";
135
+ viewer[i].innerHTML = "";
136
+ changeImg[i].classList.remove('hideItems');
137
+ });
138
+ };
139
+ }
140
+
141
+ const submit_button_click = function() {
142
+ //ローディングアニメーション画像
143
+ const submit_button = document.getElementById("submit_button");
144
+ submit_button.disabled = true;
145
+ submit_button.classList.add('wait');
146
+ namae_value = "";
147
+
148
+ //サーバーにデータを送信する際に使用するオブジェクトを生成
149
+ const formData = new FormData(input_form);
150
+ //オブジェクト内の既存のキーに新しい値を追加
151
+ formData.append("action", "bbs_quest_submit");
152
+ const opt = {
153
+ method: "post",
154
+ body: formData
155
+ }
156
+
157
+ const submit_button_click = function() {
158
+ //非同期通信
159
+ fetch("<?php echo home_url('wp-admin/admin-ajax.php'); ?>", opt)
160
+ .then(response => {
161
+ //ボタンを使用可にしています「非同期通信が完了して応答があった時」の処理です。
162
+ submit_button.disabled = false;
163
+ //ボタンのクラスからwaitを削除しています(もとのボタンに戻ります)
164
+ submit_button.classList.remove('wait');
165
+ return response.json();
166
+ })
167
+ .then(json => {
168
+ if (json.error != "") {
169
+ alert(json.error);
170
+ return;
171
+ }
172
+ namae_value = json.namae;
173
+ // 空文字を入れることで要素内を空にできる
174
+ confirm_area.textContent = '';
175
+ var div;
176
+ var child;
177
+
19
- const divNamaePartialParts = document.createElement("div"); // div (子)を生成
178
+ const divNamaePartialParts = document.createElement("div"); // div (子)を生成
20
- divNamaePartialParts.classList.add("namae-partial-parts"); // classの追加
179
+ divNamaePartialParts.classList.add("namae-partial-parts"); // classの追加
21
- child = document.createElement("p"); // p (孫)を生成
180
+ child = document.createElement("p"); // p (孫)を生成
22
- child.appendChild(document.createTextNode(namae_value)); //孫要素として Text ノードを生成
181
+ child.appendChild(document.createTextNode(namae_value)); //孫要素として Text ノードを生成
23
- divNamaePartialParts.appendChild(child); // div (子要素) の末尾に child を追加
182
+ divNamaePartialParts.appendChild(child); // div (子要素) の末尾に child を追加
183
+ divNamaePartialParts.appendChild(usericonImg);
24
- confirm_area.appendChild(divNamaePartialParts); // confirm_area (親要素) の末尾に div を追加
184
+ confirm_area.appendChild(divNamaePartialParts); // confirm_area (親要素) の末尾に div を追加
185
+
186
+ child = document.createElement("button"); // button (孫)を生成
187
+ child.type = "button";
188
+ child.innerText = "入力画面へ戻る";
189
+ child.addEventListener("click", () => {
190
+ input_area.style.display = "block";
191
+ // 空文字を入れることで要素内を空にできる
192
+ confirm_area.textContent = '';
193
+ confirm_area.style.display = "none";
194
+ });
195
+ divPostButton.appendChild(child); // div (子要素) の末尾に child を追加
196
+ child = document.createElement("button"); // button (孫)を生成
197
+ child.type = "button";
198
+ //name属性の追加・変更
199
+ child.setAttribute("name", "output");
200
+ child.innerText = "結果画面へ進む";
201
+ child.addEventListener("click", confirm_button_click);
202
+ divPostButton.appendChild(child); // div (子要素) の末尾に child を追加
203
+ confirm_area.appendChild(divPostButton); // confirm_area (親要素) の末尾に div を追加
25
- divNamaePartialParts.appendChild(usericonImg);
204
+ input_area.style.display = "none";
205
+ confirm_area.style.display = "block";
206
+ })
207
+ .catch(error => {
208
+ console.log(error);
209
+ });
210
+ }
211
+ }
26
212
  </script>
27
213
  ```
28
214