jQueryとJSONPでoptionタグを自動生成

jQueryの$.postを使ってサーバにポスト、サーバからJSONPのデータをもらってselectのoptionタグを自動生成するという、よくありそうなあたりを作ったのですが、意外にも苦労したので忘れないようにメモです。

jQueryには$.getJSONという関数があるのですが、何が悪いのか私の環境で動かなかったし、GETではなくてPOSTを使いたかったので、$.post関数を使ってみました。JavaScript内で行ったのは以下。

  1. POSTして帰ってくるdataTypeはJSONPなのでコールバック関数の引数にはdataTypeとしてjsonpを指定する。
  2. サーバから受け取ったデータをJavaScriptのeval関数を使ってオブジェクトにする。
  3. evalして得られるオブジェクトは配列なので、jQueryの$.each関数を使ってループさせる。
  4. JavaScriptのOptionオブジェクトを生成してselectタグにappendする。

HTMLファイルはこんなふうになりました。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Create Option Tags Dynamically
<script type="text/JavaScript" src="jquery-1.2.6.min.js">
<script type="text/javascript">
<!--
$(document).ready(function(){
  $("select").hide();
  $(":radio").change(function(){
    $("select").hide();
    $("select").empty();
    var catalog = $(this).val();
    $.post (
      "catalog.php",
      {catalog_type: catalog},
      function(jsonp){
        var obj = eval('(' + jsonp + ')');
        $.each(obj['options'], function(i, o){
          var option = new Option(o.caption, o.value);
          $("select").append(option);
        });
        $("select").show();
      });
  });
});
//-->
</script>
</head>
<body>
<h4>Let's create option tags daynamically!</h4>
<input name="type" type="radio" value="flower"/>Flowers
<input name="type" type="radio" value="tree"/>Trees
<br/>
<select size="5"></select>
</body>
</html>

サーバ側の言語は何でもいいので、とにかくJSONPのフォーマットにしてデータを返せばよし、です。このプログラムの場合、ポスト先のcatalog.phpはこんなふうにしました。

<?php
if(isset($_REQUEST["catalog_type"])) {
	$catalog_type = $_REQUEST['catalog_type'];
	if ($catalog_type == 'flower') {
		getFlowers();
	} else if ($catalog_type == 'tree') {
		getTrees();
	}
}

function getFlowers() {
  $ret = "{";
  $ret .= "options: [";
    $ret .= "{value: 0, caption: 'magnoria'},";
    $ret .= "{value: 1, caption: 'gardenia'},";
    $ret .= "{value: 2, caption: 'honeysuckle'}";
    $ret .= "]";
    $ret .= "}";
  echo $ret;
}

function getTrees() {
  $ret = "{";
  $ret .= "options: [";
    $ret .= "{value: 0, caption: 'maple'},";
    $ret .= "{value: 1, caption: 'oak'},";
    $ret .= "{value: 2, caption: 'elm'},";
    $ret .= "{value: 3, caption: 'dogwood'}";
    $ret .= "]";
    $ret .= "}";
  echo $ret;
}
?>

これで、selectタグ内のoptionタグが自動的に生成されるので、

http://www.servletgarden.com/images/createselect_flowers.png
http://www.servletgarden.com/images/createselect_trees.png

というようにFlowersをクリックすると花用の、Treesをクリックすると木用の選択が表示されるようになりました。

参考URL