手癖で書いていたjQuery非同期通信の処理に関してもう一度確認する
需要が広がっている非同期通信ですが、どうしても手癖で書いてしまう事が多く、いけないなぁと思い、少し纏めてみました。
jQuery非同期通信で外部javascriptを読み込み実行する
$(function() {
$.ajax({
type: "GET",
url: "sample1.js",
dataType: "script"
});
});
それほど利用シーンは多くないと思いますが、javascriptをロードする事が出来ます。
jQuery非同期通信でHTMLファイルを読み込む
$(function() {
$.ajax({
url: "html.html",
dataType: "html",
}).done(function(html){
$("#ajax2").html(html);
}).fail(function(html){
$("#ajax2").html('読み込みエラーです');
});
});
これは割と需要が多そうですね。例えばHTMLで作成したギャラリーをロードしたりなど。htmlである必要は無く、PHPでも構わないので、動的にPHPで生成したHTMLを表示なんて手は割と使えます。
jQuery非同期通信でxmlファイルを読み込む
$(function() {
$.ajax({
url: "xml.xml",
dataType: "xml",
}).done(function(xml){
var text = $(xml).find("data").text();
$("#ajax3").text( text ).css({'color':'red'});
}).fail(function(xml){
$("#ajax3").html('読み込みエラーです');
});
});
XML形式で書きだされたデータをループして表示するなど、便利です。
外部RSSなどからデータを得る
$(function() {
$.ajax({
url: "proxy.php",
dataType: "xml"
}).done(function(xml){
$("#blog").html(''); //ローダーを消す
$(xml).find("item").each(function(){
var title = $(this).find("title").text();
$('#blog').append(title+'<br>');
});
}).fail(function(xml){
$("#blog").html('取得に失敗しました');
});
});
サンプルはSTUDIO KEYのWordPressブログを取得しています。自ドメイン内だとそのままいけますが、外部ドメインは取得出来ませんので、PHPで以下のようなコードを書いてRSSを取り込みます。
proxy.php
echo file_get_contents('https://studio-key.com/feed');
jQuery非同期通信でPHPに値を送信して受け取る
html,textを指定して取得する
$(function() {
$(document).on('click','#button1',function(){
$("#form1 p").remove(); //削除
$.ajax({
type: "POST",
url: "ajax1.php",
data: 'name1='+$("#name1").val(),
dataType :'html' //html指定
}).done(function(str){
$("<p></p>").html(str).appendTo("#form1"); //HTMLで表示される
$("<p></p>").text(str).appendTo("#form1"); //テキストで表示される
}).fail(function(str){
$('#form1').append('取得に失敗しました');
});
});
});
dataTypeにhtmを指定していますが、テキストで取り出すならtextでも構いません。また、htmlで取り出しても、取得する際にtext()指定するとHTMLコードがそのまま表示されます。
xmlを指定して取得する
$(function() {
$(document).on('click','#button2',function(){
$("#form2 p").remove(); //削除
$.ajax({
type: "POST",
url: "ajax2.php",
data: 'name2='+$("#name2").val(),
dataType :'xml' //xml指定
}).done(function(str){
// $("<p></p>").html(str).appendTo("#form2"); //これはエラーになる
$("<p></p>").text(str).appendTo("#form2"); //[object XMLDocument]
$("<p></p>").text( $(str).find("name").text() ).appendTo("#form2");
$("<p></p>").text( $(str).find("time").text() ).appendTo("#form2");
}).fail(function(str){
$('#form2').append('取得に失敗しました');
});
});
});
PHP側
header("Content-type: application/xml");
echo '<!--?xml version="1.0" encoding="UTF-8" ?--> ' . "\n";
?>
<xml>
<name><!--?php echo $_POST['name2']; ?--></name>
<time><!--?php echo date('H:i:s'); ?--></time>
</xml>
通信する側のPHPはヘッダーをXMLにしてデータを書き出します。この場合、html()で取り出すとエラーになり処理が止まります。text()では取り出せますが意味有りませんので例のように。
通信する側のPHPの処理に関して – XML
単に 1 を返したいとか0を返したいという事であれば、上で書いたようにPHPに1とechoするだけで良いですが、複数のデータを別々に得たいとか、ブログ記事のように同形式のデータを指定件数分得たいとか、そういう場合はXML形式にするのがベスト
<xml>
<item>
<title>TITLE</title>
<link>http://</link>
</item>
<item>
<title>TITLE</title>
<link>http://</link>
</item>
<item>
<title>TITLE</title>
<link>http://</link>
</item>
</xml>
itemで囲まれた3つのデータを吐き出すPHPを書いて、これを取得するケース
$.ajax({
url: "xml.php",
dataType :'xml'
}).done(function(xml){
$(xml).find("item").each(function(){
var title = $(this).find("title").text();
var link = $(this).find("link").text();
});
});
xml.phpから受け取ったXMLデータをitemで分割してループし、それぞれの値を得るものです。このデータをHTMLに書き出したい場合は、例えば以下のような感じで。
$.ajax({
url: "xml.php",
dataType :'xml'
}).done(function(xml){
$(xml).find("item").each(function(){
var title = $(this).find("title").text();
$("<li></li>").html(title).appendTo("ul");
});
});
まとめ
例えばアカウントが重複していないか確認するといったケースで非同期通信は威力を発揮します。ユーザーが入力した値をPHPに渡し、重複確認を行い結果をコールバックすれば、ユーザーはページリロード無しで重複しているかどうかを確認する事が出来ます。しかし、非同期通信処理である以上は、ソースコードで通信先のPHPが丸見えですので、安易に実装するとPHPを直で叩かれて大変な事に、なんて事も有りますのでご注意を。特にログインして利用するようなケースでは、非同期通信先のPHPにもユーザー認証を行う処理が必要です。こういうリスクを考えると、格好つけて非同期通信にせずともPOSTで処理した方が安心だと思われます。
逆に、例えばフォトギャラリーを表示するようなケースはHTMLを取得して表示すれば良いので、HTMLは書けるけど1jQueryは・・なんてケースでも割と簡単に実装可能だと思います。押したボタンによって違うHTMLをロードするといった事も慣れてくると簡単だと思います。jQueryに理解を深める事はもちろん重要ですが、無理にXMLで書きだしたものを取得してjQueryでHTMLを成形して・・・とか面倒な事を考えない事だと思います。




