PrototypeのAjax.RequestとresponseXMLを使ったAjax通信 このエントリーを含むはてなブックマーク

2008年6月20日 17:32 » オープンソース

Firefox 3のダウンロード数が凄いことになっているらしい。
PrototypejQueryなどのライブラリのおかげでブラウザー互換を意識せずにJavascript開発ができるようになってきた昨今、FirebugHTTPLiveHeadersなど開発に便利なアドオンがあるFirefoxの人気が高まるのもうなずける。
とはいえまだまだ完全に互換性問題が無くなった訳ではない。当社でも最近IEで「エラーは起こらないのに、Ajaxが上手くいかない」状況にぶつかって苦労した。

実現したかったのは「ユーザーがボタン(input type="button")を押した時に非同期通信を行い、動的に作成した返り値を表示する」というもの。Ajax通信自体にはPrototypeのAjax.Requestオブジェクトを利用した。また、返り値に日本語を含むので、ブラウザーの違いによる文字コード問題を避けるためにresponseTextではなくresponseXMLを選んだ

JavascriptのAjax部分は以下の通り。

Event.observe($('someButton'), 'click',
    function(e) {
      new Ajax.Request('myxml.php',
        { method:'post',
          parameters:
            { param1: "foo", param2: "bar" },
          onSuccess: function(transport){
            var res = transport.responseXML;
            var msg = res.getElementsByTagName('msg')[0] ;
            alert(msg.firstChild.nodeValue);
          },
          onFailure: function(){ alert('Error: could not save layout.') }
      });
  });

続いてmyxml.phpの中身。

header("Content-Type: application/xml");
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo "\n";
echo "<msg>";
echo "<![CDATA[";
echo $_POST['param1'] . ',' . $_POST['param2'];
echo "]]>";
echo "</msg>";

ここでCDATAの前後に¥nを出力しないように注意する。つまり、XMLの出力は

<msg>
<![CDATA[Hello World]]>
</msg>

ではなく

<msg><![CDATA[Hello World]]></msg>

となるようにする。というのも、前者の場合msg要素のfirstChildがHello Worldではなく¥nになってしまうからだ。

Firebugがあればこういった部分のデバグも容易に行えるが、IEの場合はonSuccessのコールバック内でエラーが起きても何も表示されないためにわかりにくい。Ajax開発ではJavascriptだけでなくこういったXMLの細かい部分にも注意したい。

,

富士山周辺地域情報サイト【ふじでこ】

トラックバック(0)

Permalink: PrototypeのAjax.RequestとresponseXMLを使ったAjax通信

Trackback URL: http://4plus.jp/mt/mt-tb.cgi/16

コメントする


画像の中に見える文字を入力してください。

Ads

アーカイブ

ページの上部へ