回答編集履歴

3

追記2

2017/03/23 02:37

投稿

masaya_ohashi
masaya_ohashi

スコア9206

test CHANGED
@@ -169,3 +169,139 @@
169
169
  ```
170
170
 
171
171
  この行を消してください。あと、こういった「外部のサイトのファイル」を勝手に使うのはご法度です。外部公開用のCDNや、googleapisの埋め込み用はいいですが、他者のサイトのjsを勝手に読み込んだりすると、そのサイトの人に不要なアクセス負荷がかかりますしやめましょう。
172
+
173
+
174
+
175
+ # 追記
176
+
177
+ AjaxでPHPにデータを飛ばしても、それは「Ajaxに対するレスポンス」が変わるだけで、現在表示されている「ページ」が変わるわけではありません。一般的に、TwitterやFacebookのように「ページの再読み込みをせずに、内容だけ書き換わっていく」処理は、**更新するためのデータをPHPからもらい**、**ページの書き換えはJavaScript**で行います。
178
+
179
+ index.phpを元ページ、ajax.phpを更新データ用PHP、main.jsをページ更新用処理として説明します。
180
+
181
+
182
+
183
+ #index.php
184
+
185
+ ```HTML
186
+
187
+ <!--省略-->
188
+
189
+ <body>
190
+
191
+ <div id="response0"></div>
192
+
193
+ <div id="response1"></div>
194
+
195
+ </body>
196
+
197
+ ```
198
+
199
+ 元ページにresponse0、response1というdivを記述しておくことで、ajaxからのレスポンスを入れる箱を用意します。
200
+
201
+
202
+
203
+ #ajax.php
204
+
205
+ ```PHP
206
+
207
+ <?php
208
+
209
+ //ajax送信でPOSTされたデータを受け取る
210
+
211
+ $post_data_1 = $_POST['post_data_1'];
212
+
213
+ $post_data_2 = $_POST['post_data_2'];
214
+
215
+ //受け取ったデータを配列に格納
216
+
217
+ //そのまま返すだけだと伝わりにくいので、文字を加工して返す
218
+
219
+ $return_array = array("PHPに送られたpost_data_1:".$post_data_1, "PHPに送られたpost_data_2:".$post_data_2);
220
+
221
+ //ヘッダーの設定
222
+
223
+ header('Content-type:application/json; charset=utf8');
224
+
225
+ //「$return_array」をjson_encodeして出力
226
+
227
+ echo json_encode($return_array);
228
+
229
+
230
+
231
+ ?>
232
+
233
+ ```
234
+
235
+ AjaxからPHPに送られてきた値を元に、元ページに表示するためのデータを**PHPの中で作成**して、Ajaxにレスポンスとして返します。
236
+
237
+
238
+
239
+ #main.js
240
+
241
+ ```JavaScript
242
+
243
+
244
+
245
+ jQuery(function($){
246
+
247
+ //ajax送信
248
+
249
+ // **********************
250
+
251
+ // URLをajax.phpにすること
252
+
253
+ // **********************
254
+
255
+ $.ajax({
256
+
257
+ url : "ajax.php",
258
+
259
+ type : "POST",
260
+
261
+ data : {post_data_1:"hoge", post_data_2:"piyo"}
262
+
263
+ }).done(function(response, textStatus, xhr) {
264
+
265
+ console.log("ajax通信に成功しました");
266
+
267
+
268
+
269
+ //responseにはajax.phpが返したレスポンスが入っている
270
+
271
+
272
+
273
+ // 元ページのresponse0のdivに、PHPから返されたresponse[0]を入れる
274
+
275
+ $("#response0").text(response[0]);
276
+
277
+
278
+
279
+ // 元ページのresponse1のdivに、PHPから返されたresponse[1]を入れる
280
+
281
+ $("#response1").text(response[1]);
282
+
283
+
284
+
285
+ }).fail(function(xhr, textStatus, errorThrown) {
286
+
287
+ console.log("ajax通信に失敗しました");
288
+
289
+ });
290
+
291
+ });
292
+
293
+ ```
294
+
295
+ 最後に、ajax通信で受け取ったレスポンスを使って、元ページを書き換えます。
296
+
297
+
298
+
299
+ #PHPの動作、JavaScriptの動作を理解していないようなので
300
+
301
+
302
+
303
+ PHPを事務員、ブラウザをあなたに例えて話をしましょう。
304
+
305
+
306
+
307
+ 事務員さんにあなたはindex.phpという書類を紙に書いて自分に渡してくれと頼みました。事務員さんは自分の手元にあるindex.phpというお手本を元に、紙に書き込んであなたに渡しました(レスポンス)。その後、あなたは事務員さんに「ちょっとここ変えたいから書き直して」とお願いしても、PHPさんは事務処理上もう渡しちゃった紙(レスポンス)を書き直すことはできません。事務員さんに紙を書き直して、と頼むことはそれはすなわちブラウザのリロードです。部分的に書き換える処理がしたいのであれば、あなた(ブラウザ)の持つ修正用のペン(JavaScript)とajaxという手続きを使います。あなた(ブラウザ)は「じゃあこういうデータを渡すから、書き直す内容だけ教えて(ajax)」と頼みます。すると事務員さんはあなたから渡されたデータ(POSTデータ)を元に、書き直すべき内容をあなた(ブラウザ)に教えてくれます(Ajaxに対するレスポンス)。あなたは自分が使うことのできる修正用のペン(JavaScript)を使って、もらった内容を元に書き換えるのです。

2

jquery二度読みに関する訂正

2017/03/23 02:37

投稿

masaya_ohashi
masaya_ohashi

スコア9206

test CHANGED
@@ -160,7 +160,7 @@
160
160
 
161
161
 
162
162
 
163
- もう一点、よく見たらjQuery2回読み込んでるじゃないですか…1で十分です。
163
+ もう一点、よく見たらjQuery2回読み込んでるじゃないですか…1で十分です。jQueryは2回以上読み込むとわけのわからない動作になります。たとえ同一バージョン、同一ファイルであってもです。
164
164
 
165
165
  ```HTML
166
166
 

1

修正

2017/03/22 01:43

投稿

masaya_ohashi
masaya_ohashi

スコア9206

test CHANGED
@@ -1,4 +1,58 @@
1
+ ### 修正
2
+
3
+ まずajaxの通信先と、jsを読み込んで実行するページは別にしてください。HTMLを表示するためのphpと、Ajax通信するためのphpが一緒のファイルだとわけの分からない動作になります。仮にAjax通信のためのファイルをajax.phpとして、ページ表示のためのファイルをindex.phpとして、Ajax通信を行うJavaScriptファイルをmain.jsとして下記に記述します。
4
+
5
+ # index.php
6
+
7
+ ```HTML
8
+
9
+ <!DOCTYPE html>
10
+
11
+ <html>
12
+
13
+ <head>
14
+
15
+ <meta charset="UTF-8" />
16
+
17
+ <meta http-equiv="x-ua-compatible" content="IE=Edge" />
18
+
19
+ <meta name="viewport" content="width=device-width, user-scalable=no" />
20
+
21
+ <meta name="apple-mobile-web-app-capable" content="yes" />
22
+
23
+ <title>仮のタイトル</title>
24
+
1
- 提示されたコードの上の部分がajaxのアクセス先であるindex.phpですか?だとすると、そもそもhtml形式で返していること自体がおかしいです。Content-typeにapplication/jsonを指定しているのであれば、htmlタグがあってはいけません。これだけで十分です。
25
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
26
+
27
+ <script src="http://code.jquery.com/jquery.js"></script>
28
+
29
+ <script type="text/javascript" src="main.js"></script>
30
+
31
+ <style type="text/css">
32
+
33
+ body {
34
+
35
+ margin: 0;
36
+
37
+ padding: 0;
38
+
39
+ }
40
+
41
+ </style>
42
+
43
+ </head>
44
+
45
+ <body>
46
+
47
+
48
+
49
+ </body>
50
+
51
+ </html>
52
+
53
+ ```
54
+
55
+ # ajax.php
2
56
 
3
57
  ```PHP
4
58
 
@@ -27,3 +81,91 @@
27
81
  ?>
28
82
 
29
83
  ```
84
+
85
+
86
+
87
+ # main.js
88
+
89
+ ```JavaScript
90
+
91
+ jQuery(function($){
92
+
93
+ //ajax送信
94
+
95
+ // **********************
96
+
97
+ // URLをajax.phpにすること
98
+
99
+ // **********************
100
+
101
+ $.ajax({
102
+
103
+ url : "ajax.php",
104
+
105
+ type : "POST",
106
+
107
+ data : {post_data_1:"hoge", post_data_2:"piyo"},
108
+
109
+ error : function(XMLHttpRequest, textStatus, errorThrown) {
110
+
111
+ console.log("ajax通信に失敗しました");
112
+
113
+ },
114
+
115
+ success : function(response) {
116
+
117
+ console.log("ajax通信に成功しました");
118
+
119
+ console.log(response[0]);
120
+
121
+ console.log(response[1]);
122
+
123
+ }
124
+
125
+ });
126
+
127
+ });
128
+
129
+ ```
130
+
131
+
132
+
133
+ あと、このAjaxの書き方はかなり古い時代の書き方です。jQuery1.8以降はこう書きます。
134
+
135
+ ```JavaScript
136
+
137
+ $.ajax({
138
+
139
+ url : "ajax.php",
140
+
141
+ type : "POST",
142
+
143
+ data : {post_data_1:"hoge", post_data_2:"piyo"}
144
+
145
+ }).done(function(response, textStatus, xhr) {
146
+
147
+ console.log("ajax通信に成功しました");
148
+
149
+ console.log(response[0]);
150
+
151
+ console.log(response[1]);
152
+
153
+ }).fail(function(xhr, textStatus, errorThrown) {
154
+
155
+ console.log("ajax通信に失敗しました");
156
+
157
+ });
158
+
159
+ ```
160
+
161
+
162
+
163
+ もう一点、よく見たらjQuery2回読み込んでるじゃないですか…1個で十分です。
164
+
165
+ ```HTML
166
+
167
+ <script src="http://code.jquery.com/jquery.js"></script>
168
+
169
+ ```
170
+
171
+ この行を消してください。あと、こういった「外部のサイトのファイル」を勝手に使うのはご法度です。外部公開用のCDNや、googleapisの埋め込み用はいいですが、他者のサイトのjsを勝手に読み込んだりすると、そのサイトの人に不要なアクセス負荷がかかりますしやめましょう。