Webコンサルタントの愚痴とアジャイル,生産性向上,Trac,オープンソースなどの与太話
なんとなくAjaxを色々やってみよーということで、本買った。
PHPによるJavaScriptを書かないAjax 九天社 ISBN978-4-86167-175-3
とりあえず読み応えありそうなので、土日にゆっくり読むことにする。
それぞれのブラウザ毎に異なる仕様を吸収するソースを書くのも面倒だし、かといってprototype.jsとかも複雑そうだし、やっぱなれたPHPでAjaxだよな~ということでxajaxというライブラリを使ってみた。
以下はライブドアの天気予報Webサービスに接続して画面に表示する例だが、極めてシンプルであり、ソース中にはJAVAスクリプトのコードはほぼ出現しない。
動作させると、プルダウンの切り替えによって画面を切り替えるようになっている。
require_once("./xajax.inc.php");
require_once("XML/Unserializer.php");
require_once("HTTP/Request.php");
$xajax = new xajax();
$xajax->registerFunction("weather_search");
function weather_search($string)
{
$string = htmlspecialchars($string);
$url = "http://weather.livedoor.com/forecast/webservice/rest/v1?day=today&city=".$string;
$option = array(
"timeout" => "10",
"allowRedirects" => true,
"maxRedirects" => 3,
);
$http = &new HTTP_Request($url, $option);
$http->addHeader('User-Agent', 'Ryuzee.com test scripts');
$http->sendRequest();
if ($http->getResponseCode() != 200 && $http->getResponseCode() != 304){
return PEAR::raiseError('Error HTTP Status ' . $http->getResponseCode());
}
$result = $http->getResponseBody();
$xml = &new XML_Unserializer();
$xml->setOption(XML_UNSERIALIZER_OPTION_ATTRIBUTES_PARSE, true);
$xml->unserialize($result, false);
$xml_result = $xml->getUnserializedData();
$objResponse = new xajaxResponse();
$objResponse->addAssign("result","innerHTML", nl2br(print_r($xml_result, true)));
return $objResponse;
}
$xajax->processRequests();
?>
<html>
<head>
<title>xajax sample</title>
<?php $xajax->printJavascript(); ?>
</head>
<body>
<select name="point" onChange="if(this.value != 0){ xajax_weather_search(this.value); }">
<option value="0">---Please select---</option>
<option value="4">Sapporo</option>
<option value="15">Hakodate</option>
<option value="31">Fukushima</option>
<option value="50">Niigata</option>
<option value="63">Tokyo</option>
<option value="67">Chiba</option>
<option value="79">Kyoto</option>
<option value="81">Osaka</option>
</select>
<div id="result"></div>
</body>
</html>
こんなことをして嵌った。
で、これは何故か失敗します。ちょっと以下の通り試してみてください。
例えば、デスクトップにparent.htmlという名前で以下のようなファイルを作ります。
これを実行すると、結果はこうなります。

次にファイルシステム同士で実行してみます。(googleはローカルに配置できないので、
同じフォーム要素を持ったファイルを作ってください)
呼び出し元と呼び出し先をファイルシステム同士に配置した場合、これはうまくいきます。
さらに、今度は呼び出し元を違うサーバに配置し、呼び出し先をローカルのIIS以下に配置してみます。
これはうまくいきません。
まとめると
| 呼び出し元 | 呼び出し先 | 項目操作 できるか |
|---|---|---|
| ファイルシステム | ファイルシステム | 成功 |
| ファイルシステム | 内部サイト(http://localhost) | 失敗 |
| ファイルシステム | 外部サイト | 失敗 |
| 内部サイト(http://localhost) | ファイルシステム | 失敗 |
| 内部サイト(http://localhost) | 内部サイト(http://localhost) | 成功 |
| 内部サイト(http://localhost) | 外部サイト(http://192.168.1.54) | 失敗 |
| 外部サイト(http://192.168.1.54) | ファイルシステム | 失敗 |
| 外部サイト(http://192.168.1.54) | 内部サイト(http://localhost) | 失敗 |
| 外部サイト(http://192.168.1.54) | 外部サイト(http://192.168.1.54) | 成功 |
結論としては、
ということのようだ。なるほどねぇ。
JAVAスクリプトとCSSを使うと簡単に対応できる。
http://www.dhtmlgoodies.com/index.html?whichScript=form-field-tooltipにアクセスしてzipファイルをダウンロードする。
解凍すると、js、css、imagesディレクトリがあるので、そのままの構成でサーバにアップする。
後は、ツールチップヒントを出したい画面に以下のような記述を挿入する。
<head>部
<body>部の最下部
ツールチップを出したい箇所
以上で終了だ。
特に複雑な入力を求めるものやいつも間違えてしまうような画面に適用すると良いだろう。
付属のサンプルを表示した例が以下である。FirstNameの右横にツールチップが表示されている。

Web2.0時代は色々なAPIが無償で用意されているから使いがいがあって楽しい。
今日採用したのは、Snapというサービス。ハイパーリンクのhoverイベントに反応して、リンク先のサムネイルを表示してくれる、という優れものである。
サイトURLはこちら:http://www.snap.com/about/spa1A.php
ちなみに、導入は非常に簡単で、上記サイトにアクセスしてサインアップし、生成されたJAVAスクリプトをページに挿入するのみである。(以下は適宜改行が入っている)
日本では、simpleapiなどのAPIが無償提供されているが、海外にも色々あるようだ。
自分のサイトがちょっとした工夫でにぎやか(微妙にうざいかも汗)になるので、どんどん探してみよう。
日記 PHP オープンソース Linux Trac Perl wordpress フリーソフト 自宅サーバ phpMyFaq Plugin Delphi 書評 apache eclipse Subversion Firefox セキュリティ アジャイル プラグイン mojavi Ruby Ajax/Web2.0 CakePHP Zope フレームワーク サーバ 文字化け scuttle OpenVZ 自宅 phpBB 仮想化 翻訳・日本語化 CMS ApacheDS LDAP 生産性向上 hacks CodeIgniter Agile・生産性向上 レビュー XAMPP Excel SBM 言語ファイル 修正 Ajax taskfreak mod_security ダウンロード HTML::FillInForm 情報共有 格安 レンタル アンケート API PhpScheduleIt 翻訳