回答編集履歴
3
追記2
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二度読みに関する訂正
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
修正
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
|
-
|
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を勝手に読み込んだりすると、そのサイトの人に不要なアクセス負荷がかかりますしやめましょう。
|