2005年07月13日
[技術] Ajaxサンプル
Ajaxを使ったウェブアプリのサンプルを作成してみました。参考にしたサイトはこちら。
サーバ側に山の情報として、「番号、名称、緯度、経度、標高」のデータを保持しておき、画面で番号を入力し、該当するデータがあった場合に名称、緯度、経度、標高を表示します。おまけとして、取得した緯度経度で国土地理院の地図データを表示するようにしました。
Ajax サンプル : 番号欄に3桁の数字を入力してください
このアプリの技術的特長は、番号入力後にユーザがいちいち送信ボタンを押さなくても、番号欄の入力値が変わるたびにサーバ側にデータを取得しに行っていることです。
このようなことを可能にしているのが、JavaScriptにあるXmlHTTPRequestクラスです。JavaScriptは以下のようになります。
// 国土地理院の地図を表示する
function watchizu(){
var ido = document.getElementById('pointido').value;
var keido = document.getElementById('pointkeido').value;
var B = ido.replace(/\./i, "");
var L = keido.replace(/\./i, "");
var url = "http://watchizu.gsi.go.jp/cgi-bin/bl.cgi?b=" + B +"&l=" + L ;
window.open(url,"");
}
// サーバ側のCGIを呼び出し
function getPointData() {
var id = document.getElementById('pointid').value;
http.open("GET", '/sample/point.cgi?id=' + escape(id), true);
http.onreadystatechange = handleHttpResponse;
http.send(null);
}
// サーバから返答を取得し、画面に表示
function handleHttpResponse() {
if (http.readyState == 4) {
results = http.responseText.split(",");
document.getElementById('pointname').value = results[0];
document.getElementById('pointido').value = results[1];
document.getElementById('pointkeido').value = results[2];
document.getElementById('pointheight').value = results[3];
}
}
// サーバとのやり取りを制御するXmlHTTPRequestインスタンスを生成
function getHttpObject() {
var xmlhttp;
// プリコンパイル指定
/*@cc_on
@if (@_jscript_version >= 5)
try {
xmlhttp = new ActiveXObject("Msmxl2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
@else
xmlhttp = false;
@end @*/
if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
try {
xmlhttp = new XMLHttpRequest();
} catch (e) {
xmlhttp = false;
}
}
return xmlhttp;
}
var http = getHttpObject();
サーバ側のCGI(point.cgi)は以下のようになる。
#!/usr/bin/perl -w
use strict;
use CGI;
my $q = CGI->new;
my $id = $q->param('id');
my $hash = {
100 => {name=>'甲武信ヶ岳', ido=>'35.5432', keido=>'138.4344', height=>'2475'},
101 => {name=>'横尾山', ido=>'35.5508', keido=>'138.3116', height=>'1818'},
102 => {name=>'瑞牆山', ido=>'35.5336', keido=>'138.3531', height=>'2230'},
110 => {name=>'金峰山', ido=>'35.5217', keido=>'138.3731', height=>'2599'},
111 => {name=>'朝日岳', ido=>'35.5228', keido=>'138.3833', height=>'2579'},
112 => {name=>'国師ケ岳', ido=>'35.5215', keido=>'138.4023', height=>'2592'},
120 => {name=>'北奥千丈岳', ido=>'35.5207', keido=>'138.4015', height=>'2601'},
121 => {name=>'乾徳山', ido=>'35.4923', keido=>'138.4254', height=>'2031'}
};
print "Content-Type: text/xml\n\n";
if ($hash->{$id}) {
my $data = $hash->{$id};
print "$data->{name},$data->{ido},$data->{keido},$data->{height}";
}else{
print '該当データなし,,,';
}
HTMLは以下のようになっている。
<form action="">
<p>番号: <input type="text" name="pointid" id="pointid" onKeyup="getPointData();"/>(100,101,102,110,111,112,120,121)</p>
<p>名称: <input type="text" name="pointname" id="pointname" /></p>
<p>緯度: <input type="text" name="pointido" id="pointido" /></p>
<p>経度: <input type="text" name="pointkeido" id="pointkeido" /></p>
<p>標高: <input type="text" name="pointheight" id="pointheight" /></p>
<input type="button" value="国土地理院の地図表示" onClick="watchizu();">
</form>
投稿者 nekobara : 2005年07月13日 22:39
トラックバック
このエントリーのトラックバックURL:
http://www.ishihara.ne.jp/mt/mt-tb.cgi/413
コメント
これがajaxですかぁ~
なんでもプログラミングしますね!
Gmailとかでつかわれている技術ですよね。
ブラウザでページを更新しなくても自動的に
情報が更新できる技術と認識しております。
投稿者 YSK後藤 : 2005年07月14日 18:19
>これがajaxですかぁ~
ajaxっていうのがおこがましいくらいにささやかなajaxですけどね(笑)
>なんでもプログラミングしますね!
JavaScriptは今回が初めてですので、実は結構くだらないところではまっています。
>Gmailとかでつかわれている技術ですよね。
>ブラウザでページを更新しなくても自動的に
>情報が更新できる技術と認識しております
そうそう世の中で、ブラウザはプアすぎるエンタープライズで使うなら、今後はリッチクライアントだなんて、騒いでいたら、GoogleがGmailで、既存技術の組み合わせだけでブラウザのGUIをリッチにできることを証明して、みんな目から鱗状態だったと思います。
投稿者 nekobara : 2005年07月14日 21:39