質問編集履歴

1

タイトルと説明文の修正、コードの追加

2021/06/24 03:12

投稿

sugamat
sugamat

スコア2

test CHANGED
@@ -1 +1 @@
1
- Firefoxの無限ループ」の原因
1
+ FirefoxにおけるForm自動POSTによる無限ループ
test CHANGED
@@ -10,16 +10,198 @@
10
10
 
11
11
 
12
12
 
13
- ブラウザのデベロッパーツールのネットワークタブを観察してみた所、
14
-
15
- 何度もページ遷移が起こっているようです。
16
-
17
-
18
-
19
- javascriptで、
20
-
21
- ムに変更があった場合に送信するよう設定しているの
22
-
23
- 自動入力が原因ではないかと疑ってみましたが、
24
-
25
- それ原因ではありませんでた。
13
+ ---
14
+
15
+ 2021年6月24日加筆修正
16
+
17
+
18
+
19
+ **ウェブサイトの概要**
20
+
21
+ ァイルをアップロするページす。
22
+
23
+
24
+
25
+ 通常、formを利用
26
+
27
+ 1) ファイル選択
28
+
29
+ 2) ファイル送信
30
+
31
+ 3) ページ移動
32
+
33
+ の手順になるかと思います。
34
+
35
+
36
+
37
+ このページでは、2個のformがあり、javascriptを利用し、
38
+
39
+ 1) ファイル選択後、自動でファイル送信し、隠れiframeにページ読み込まれます。
40
+
41
+ 2) iframe読み込み終了後、自動でもうひとつのformが送信され、ページが移動します。
42
+
43
+
44
+
45
+ ---
46
+
47
+
48
+
49
+ **コード (debug.php)**
50
+
51
+
52
+
53
+ <!DOCTYPE html>
54
+
55
+ <html>
56
+
57
+
58
+
59
+ <!----------------------------------------------------------------------------->
60
+
61
+ <head>
62
+
63
+ <title>デバッグ用</title>
64
+
65
+ </head>
66
+
67
+
68
+
69
+ <!----------------------------------------------------------------------------->
70
+
71
+ <body>
72
+
73
+ <!--idはjavascriptで使用-->
74
+
75
+
76
+
77
+ <!--1つ目のフォーム-->
78
+
79
+ <form
80
+
81
+ id='upload' 
82
+
83
+ method = 'post' 
84
+
85
+ action = '../upload.php' 
86
+
87
+ enctype = 'multipart/form-data' 
88
+
89
+ target = 'hidden_iframe'
90
+
91
+ autocomplete = 'off'>
92
+
93
+
94
+
95
+ <!--
96
+
97
+ ファイルアップロード時に
98
+
99
+ ページ遷移させないため
100
+
101
+ upload.phpを隠れフレームに読み込む
102
+
103
+ multipart/form-dataは、様々なファイルに対応
104
+
105
+ formのtarget属性は、iframeのname属性と一致させる
106
+
107
+ -->
108
+
109
+
110
+
111
+ <input id='button' type='file' name='upload[]'>
112
+
113
+ <!--nameは変数名のようなもの、phpの$_FILESからアクセスするのに必要-->
114
+
115
+
116
+
117
+ </form>
118
+
119
+
120
+
121
+ <!--
122
+
123
+ 非表示のiframe
124
+
125
+ upload.phpを読み込む際
126
+
127
+ ページ遷移させないための隠れフレーム
128
+
129
+ iframeのname属性 = formのtarget属性
130
+
131
+ iframeへの読み込み完了でイベント発生
132
+
133
+ -->
134
+
135
+
136
+
137
+ <iframe id='hidden_iframe' name='hidden_iframe'></iframe>
138
+
139
+
140
+
141
+ <!--2つ目のフォーム-->
142
+
143
+ <form method='post' action='debug.php'>
144
+
145
+ <input id='hidden_button'
146
+
147
+ class = 'hidden_button'
148
+
149
+ type = 'submit'
150
+
151
+ name = 'hidden_button'
152
+
153
+ value = '隠れボタン'>
154
+
155
+
156
+
157
+ </form>
158
+
159
+
160
+
161
+ <!----------------------------------------------------------------------------->
162
+
163
+ <!--javascript-->
164
+
165
+
166
+
167
+ <script>
168
+
169
+ const upload = document.getElementById('upload');
170
+
171
+ const selectFile = document.getElementById('button');
172
+
173
+ const hiddenButton = document.getElementById('hidden_button');
174
+
175
+ const hiddenFrame = document.getElementById('hidden_iframe');
176
+
177
+
178
+
179
+ selectFile.addEventListener('change', function(){
180
+
181
+ upload.submit();
182
+
183
+ console.log('ファイルが送信されました');
184
+
185
+ });
186
+
187
+
188
+
189
+ // iframeにupload.phpの読み込みが完了しても
190
+
191
+ // ファイルのアップロードが完了してるとは限らない
192
+
193
+ hiddenFrame.addEventListener('load', function(){
194
+
195
+ hiddenButton.click();
196
+
197
+ console.log('アップロードが完了しました');
198
+
199
+ });
200
+
201
+ </script>
202
+
203
+
204
+
205
+ </body>
206
+
207
+ </html>