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

回答編集履歴

4

Python例を加えます

2020/07/01 06:22

投稿

YufanLou
YufanLou

スコア466

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

レスポンスのデータの使用例を追加する

2020/07/01 06:22

投稿

YufanLou
YufanLou

スコア466

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/yn3a1sbt/)でご覧ください。
45
+ Demoコードを[JSFiddle](https://jsfiddle.net/ebzspt50/)でご覧ください。

2

送信先を取得する

2020/07/01 03:16

投稿

YufanLou
YufanLou

スコア466

answer CHANGED
@@ -14,10 +14,12 @@
14
14
 
15
15
  // ローディング画面を表示する
16
16
 
17
- // フォームデータを取得する
17
+ // 送信先とフォームデータを取得する
18
- let formData = new FormData(document.getElementById("form"));
18
+ let formElem = document.getElementById("form");
19
+ let formUrl = formElem.action;
20
+ let formData = new FormData(formElem);
19
21
  // フォームデータを送信する
20
- let response = await fetch('https://url/to/endpoint', {
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/b6ac8unm/)でご覧ください。
39
+ Demoコードを[JSFiddle](https://jsfiddle.net/yn3a1sbt/)でご覧ください。

1

簡単化かつDemoコードにリンク

2020/06/30 13:26

投稿

YufanLou
YufanLou

スコア466

answer CHANGED
@@ -1,8 +1,11 @@
1
1
  そうしたいと、フォームボタンのデフォルトを使えません。JavaScriptでフォームデータを送信しないといけないです。
2
2
 
3
+ button元素はデフォルトではフォームデータを送信しますが、ここではそうしたくないため、`type="button"`をつけます。
4
+
3
5
  ```html
6
+ <form id="form">
4
- <form>
7
+ <!-- フォーム -->
5
- <button onclick="sendData()">送信</button>
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
- let data = // フォームデータを取得する
17
+ // フォームデータを取得する
18
+ let formData = new FormData(document.getElementById("form"));
19
+ // フォームデータを送信する
15
- return await fetch('https://url/to/endpoint', {
20
+ let response = await fetch('https://url/to/endpoint', {
16
- method: 'POST',
21
+ method: 'POST',
17
- body: JSON.stringify(data)
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/)でご覧ください。