回答編集履歴
4
Python例を加えます
answer
CHANGED
@@ -42,4 +42,22 @@
|
|
42
42
|
}
|
43
43
|
```
|
44
44
|
|
45
|
-
Demoコードを[JSFiddle](https://jsfiddle.net/ebzspt50/)でご覧ください。
|
45
|
+
Demoコードを[JSFiddle](https://jsfiddle.net/ebzspt50/)でご覧ください。
|
46
|
+
|
47
|
+
## 追記
|
48
|
+
|
49
|
+
コメントと合わせて、DjangoでHeaderのRefererを読んで動作を分ける例を作ります。
|
50
|
+
|
51
|
+
```python
|
52
|
+
def check(request):
|
53
|
+
referer = request.META.get('HTTP_REFERER', '')
|
54
|
+
# KeyError の場合 get は2つ目の引数の値を返す
|
55
|
+
if !referer.endswith('check'):
|
56
|
+
form_data = request.POST
|
57
|
+
return render(request, 'polls/check_loading.html', form_data}
|
58
|
+
|
59
|
+
input_url = request.POST['check_url']
|
60
|
+
test_data = {'test':'sssss','test2':'aaaaaaa'}
|
61
|
+
print('ok')
|
62
|
+
return render(request,'polls/check.html',{'test_data': test_data})
|
63
|
+
```
|
3
レスポンスのデータの使用例を追加する
answer
CHANGED
@@ -29,6 +29,12 @@
|
|
29
29
|
// 送信成功したかを検査
|
30
30
|
if (response.ok) {
|
31
31
|
// 成功の場合の処理
|
32
|
+
// fetchで取得するページで今のページを書き換える
|
33
|
+
document.open();
|
34
|
+
document.write(await response.text());
|
35
|
+
document.close();
|
36
|
+
// 前のページへ正しく戻れるようページ歴史に追加する
|
37
|
+
history.pushState(null, "", "polls/check");
|
32
38
|
} else {
|
33
39
|
// 失敗の場合の処理
|
34
40
|
}
|
@@ -36,4 +42,4 @@
|
|
36
42
|
}
|
37
43
|
```
|
38
44
|
|
39
|
-
Demoコードを[JSFiddle](https://jsfiddle.net/
|
45
|
+
Demoコードを[JSFiddle](https://jsfiddle.net/ebzspt50/)でご覧ください。
|
2
送信先を取得する
answer
CHANGED
@@ -14,10 +14,12 @@
|
|
14
14
|
|
15
15
|
// ローディング画面を表示する
|
16
16
|
|
17
|
-
// フォームデータを取得する
|
17
|
+
// 送信先とフォームデータを取得する
|
18
|
-
let
|
18
|
+
let formElem = document.getElementById("form");
|
19
|
+
let formUrl = formElem.action;
|
20
|
+
let formData = new FormData(formElem);
|
19
21
|
// フォームデータを送信する
|
20
|
-
let response = await fetch(
|
22
|
+
let response = await fetch(formUrl, {
|
21
23
|
method: 'POST',
|
22
24
|
body: formData
|
23
25
|
});
|
@@ -34,4 +36,4 @@
|
|
34
36
|
}
|
35
37
|
```
|
36
38
|
|
37
|
-
Demoコードを[JSFiddle](https://jsfiddle.net/
|
39
|
+
Demoコードを[JSFiddle](https://jsfiddle.net/yn3a1sbt/)でご覧ください。
|
1
簡単化かつDemoコードにリンク
answer
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
そうしたいと、フォームボタンのデフォルトを使えません。JavaScriptでフォームデータを送信しないといけないです。
|
2
2
|
|
3
|
+
button元素はデフォルトではフォームデータを送信しますが、ここではそうしたくないため、`type="button"`をつけます。
|
4
|
+
|
3
5
|
```html
|
6
|
+
<form id="form">
|
4
|
-
<
|
7
|
+
<!-- フォーム -->
|
5
|
-
|
8
|
+
<button type="button" onclick="sendData()">送信</button>
|
6
9
|
</form>
|
7
10
|
```
|
8
11
|
|
@@ -11,16 +14,24 @@
|
|
11
14
|
|
12
15
|
// ローディング画面を表示する
|
13
16
|
|
14
|
-
|
17
|
+
// フォームデータを取得する
|
18
|
+
let formData = new FormData(document.getElementById("form"));
|
19
|
+
// フォームデータを送信する
|
15
|
-
|
20
|
+
let response = await fetch('https://url/to/endpoint', {
|
16
|
-
|
21
|
+
method: 'POST',
|
17
|
-
|
22
|
+
body: formData
|
18
|
-
|
23
|
+
});
|
19
|
-
.then(response => {
|
20
24
|
|
21
|
-
|
25
|
+
// ローディング画面を隠します
|
26
|
+
|
27
|
+
// 送信成功したかを検査
|
28
|
+
if (response.ok) {
|
29
|
+
// 成功の場合の処理
|
30
|
+
} else {
|
31
|
+
// 失敗の場合の処理
|
32
|
+
}
|
22
33
|
|
23
|
-
return response.json();
|
24
|
-
})
|
25
34
|
}
|
26
|
-
```
|
35
|
+
```
|
36
|
+
|
37
|
+
Demoコードを[JSFiddle](https://jsfiddle.net/b6ac8unm/)でご覧ください。
|