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

回答編集履歴

3

追記2

2017/03/23 02:37

投稿

masaya_ohashi
masaya_ohashi

スコア9210

answer CHANGED
@@ -83,4 +83,72 @@
83
83
  ```HTML
84
84
  <script src="http://code.jquery.com/jquery.js"></script>
85
85
  ```
86
- この行を消してください。あと、こういった「外部のサイトのファイル」を勝手に使うのはご法度です。外部公開用のCDNや、googleapisの埋め込み用はいいですが、他者のサイトのjsを勝手に読み込んだりすると、そのサイトの人に不要なアクセス負荷がかかりますしやめましょう。
86
+ この行を消してください。あと、こういった「外部のサイトのファイル」を勝手に使うのはご法度です。外部公開用のCDNや、googleapisの埋め込み用はいいですが、他者のサイトのjsを勝手に読み込んだりすると、そのサイトの人に不要なアクセス負荷がかかりますしやめましょう。
87
+
88
+ # 追記
89
+ AjaxでPHPにデータを飛ばしても、それは「Ajaxに対するレスポンス」が変わるだけで、現在表示されている「ページ」が変わるわけではありません。一般的に、TwitterやFacebookのように「ページの再読み込みをせずに、内容だけ書き換わっていく」処理は、**更新するためのデータをPHPからもらい**、**ページの書き換えはJavaScript**で行います。
90
+ index.phpを元ページ、ajax.phpを更新データ用PHP、main.jsをページ更新用処理として説明します。
91
+
92
+ #index.php
93
+ ```HTML
94
+ <!--省略-->
95
+ <body>
96
+ <div id="response0"></div>
97
+ <div id="response1"></div>
98
+ </body>
99
+ ```
100
+ 元ページにresponse0、response1というdivを記述しておくことで、ajaxからのレスポンスを入れる箱を用意します。
101
+
102
+ #ajax.php
103
+ ```PHP
104
+ <?php
105
+ //ajax送信でPOSTされたデータを受け取る
106
+ $post_data_1 = $_POST['post_data_1'];
107
+ $post_data_2 = $_POST['post_data_2'];
108
+ //受け取ったデータを配列に格納
109
+ //そのまま返すだけだと伝わりにくいので、文字を加工して返す
110
+ $return_array = array("PHPに送られたpost_data_1:".$post_data_1, "PHPに送られたpost_data_2:".$post_data_2);
111
+ //ヘッダーの設定
112
+ header('Content-type:application/json; charset=utf8');
113
+ //「$return_array」をjson_encodeして出力
114
+ echo json_encode($return_array);
115
+
116
+ ?>
117
+ ```
118
+ AjaxからPHPに送られてきた値を元に、元ページに表示するためのデータを**PHPの中で作成**して、Ajaxにレスポンスとして返します。
119
+
120
+ #main.js
121
+ ```JavaScript
122
+
123
+ jQuery(function($){
124
+ //ajax送信
125
+ // **********************
126
+ // URLをajax.phpにすること
127
+ // **********************
128
+ $.ajax({
129
+ url : "ajax.php",
130
+ type : "POST",
131
+ data : {post_data_1:"hoge", post_data_2:"piyo"}
132
+ }).done(function(response, textStatus, xhr) {
133
+ console.log("ajax通信に成功しました");
134
+
135
+ //responseにはajax.phpが返したレスポンスが入っている
136
+
137
+ // 元ページのresponse0のdivに、PHPから返されたresponse[0]を入れる
138
+ $("#response0").text(response[0]);
139
+
140
+ // 元ページのresponse1のdivに、PHPから返されたresponse[1]を入れる
141
+ $("#response1").text(response[1]);
142
+
143
+ }).fail(function(xhr, textStatus, errorThrown) {
144
+ console.log("ajax通信に失敗しました");
145
+ });
146
+ });
147
+ ```
148
+ 最後に、ajax通信で受け取ったレスポンスを使って、元ページを書き換えます。
149
+
150
+ #PHPの動作、JavaScriptの動作を理解していないようなので
151
+
152
+ PHPを事務員、ブラウザをあなたに例えて話をしましょう。
153
+
154
+ 事務員さんにあなたはindex.phpという書類を紙に書いて自分に渡してくれと頼みました。事務員さんは自分の手元にあるindex.phpというお手本を元に、紙に書き込んであなたに渡しました(レスポンス)。その後、あなたは事務員さんに「ちょっとここ変えたいから書き直して」とお願いしても、PHPさんは事務処理上もう渡しちゃった紙(レスポンス)を書き直すことはできません。事務員さんに紙を書き直して、と頼むことはそれはすなわちブラウザのリロードです。部分的に書き換える処理がしたいのであれば、あなた(ブラウザ)の持つ修正用のペン(JavaScript)とajaxという手続きを使います。あなた(ブラウザ)は「じゃあこういうデータを渡すから、書き直す内容だけ教えて(ajax)」と頼みます。すると事務員さんはあなたから渡されたデータ(POSTデータ)を元に、書き直すべき内容をあなた(ブラウザ)に教えてくれます(Ajaxに対するレスポンス)。あなたは自分が使うことのできる修正用のペン(JavaScript)を使って、もらった内容を元に書き換えるのです。

2

jquery二度読みに関する訂正

2017/03/23 02:37

投稿

masaya_ohashi
masaya_ohashi

スコア9210

answer CHANGED
@@ -79,7 +79,7 @@
79
79
  });
80
80
  ```
81
81
 
82
- もう一点、よく見たらjQuery2回読み込んでるじゃないですか…1で十分です。
82
+ もう一点、よく見たらjQuery2回読み込んでるじゃないですか…1で十分です。jQueryは2回以上読み込むとわけのわからない動作になります。たとえ同一バージョン、同一ファイルであってもです。
83
83
  ```HTML
84
84
  <script src="http://code.jquery.com/jquery.js"></script>
85
85
  ```

1

修正

2017/03/22 01:43

投稿

masaya_ohashi
masaya_ohashi

スコア9210

answer CHANGED
@@ -1,4 +1,31 @@
1
+ ### 修正
2
+ まずajaxの通信先と、jsを読み込んで実行するページは別にしてください。HTMLを表示するためのphpと、Ajax通信するためのphpが一緒のファイルだとわけの分からない動作になります。仮にAjax通信のためのファイルをajax.phpとして、ページ表示のためのファイルをindex.phpとして、Ajax通信を行うJavaScriptファイルをmain.jsとして下記に記述します。
3
+ # index.php
4
+ ```HTML
5
+ <!DOCTYPE html>
6
+ <html>
7
+ <head>
8
+ <meta charset="UTF-8" />
9
+ <meta http-equiv="x-ua-compatible" content="IE=Edge" />
10
+ <meta name="viewport" content="width=device-width, user-scalable=no" />
11
+ <meta name="apple-mobile-web-app-capable" content="yes" />
12
+ <title>仮のタイトル</title>
1
- 提示されたコードの上の部分がajaxのアクセス先であるindex.phpですか?だとすると、そもそもhtml形式で返していること自体がおかしいです。Content-typeにapplication/jsonを指定しているのであれば、htmlタグがあってはいけません。これだけで十分です。
13
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
14
+ <script src="http://code.jquery.com/jquery.js"></script>
15
+ <script type="text/javascript" src="main.js"></script>
16
+ <style type="text/css">
17
+ body {
18
+ margin: 0;
19
+ padding: 0;
20
+ }
21
+ </style>
22
+ </head>
23
+ <body>
24
+
25
+ </body>
26
+ </html>
27
+ ```
28
+ # ajax.php
2
29
  ```PHP
3
30
  <?php
4
31
  //ajax送信でPOSTされたデータを受け取る
@@ -12,4 +39,48 @@
12
39
  echo json_encode($return_array);
13
40
 
14
41
  ?>
15
- ```
42
+ ```
43
+
44
+ # main.js
45
+ ```JavaScript
46
+ jQuery(function($){
47
+ //ajax送信
48
+ // **********************
49
+ // URLをajax.phpにすること
50
+ // **********************
51
+ $.ajax({
52
+ url : "ajax.php",
53
+ type : "POST",
54
+ data : {post_data_1:"hoge", post_data_2:"piyo"},
55
+ error : function(XMLHttpRequest, textStatus, errorThrown) {
56
+ console.log("ajax通信に失敗しました");
57
+ },
58
+ success : function(response) {
59
+ console.log("ajax通信に成功しました");
60
+ console.log(response[0]);
61
+ console.log(response[1]);
62
+ }
63
+ });
64
+ });
65
+ ```
66
+
67
+ あと、このAjaxの書き方はかなり古い時代の書き方です。jQuery1.8以降はこう書きます。
68
+ ```JavaScript
69
+ $.ajax({
70
+ url : "ajax.php",
71
+ type : "POST",
72
+ data : {post_data_1:"hoge", post_data_2:"piyo"}
73
+ }).done(function(response, textStatus, xhr) {
74
+ console.log("ajax通信に成功しました");
75
+ console.log(response[0]);
76
+ console.log(response[1]);
77
+ }).fail(function(xhr, textStatus, errorThrown) {
78
+ console.log("ajax通信に失敗しました");
79
+ });
80
+ ```
81
+
82
+ もう一点、よく見たらjQuery2回読み込んでるじゃないですか…1個で十分です。
83
+ ```HTML
84
+ <script src="http://code.jquery.com/jquery.js"></script>
85
+ ```
86
+ この行を消してください。あと、こういった「外部のサイトのファイル」を勝手に使うのはご法度です。外部公開用のCDNや、googleapisの埋め込み用はいいですが、他者のサイトのjsを勝手に読み込んだりすると、そのサイトの人に不要なアクセス負荷がかかりますしやめましょう。