2016.5.6
2017.4.17

郵便番号から住所検索

AngularJS用の郵便番号から住所検索を行う処理がほしかったので、JavaScriptライブラリ「AjaxZip3」をバラして、必要なコードを抜き出して作成してみました。

目次

  • 元のソース「ajaxzip3.js」
  • ソースコード
  • 感想

元のソース「ajaxzip3.js」

https://github.com/ajaxzip3/ajaxzip3.github.io/blob/master/ajaxzip3.js

ajaxzip3についてはこちら(AjaxZip3の使い方 | Webサイト制作支援 | ShanaBrian Website)を参照。

ソースコード

前提としてAngularJSが動作する環境で行うこと。


// AngularJSのコード
var myApp = angular.module('myApp', []);

myApp.controller('MainCtrl', function ($scope, $http) {

    // 住所データ設定
    var zip_addr = {};
    zip_addr.zip1 = "";
    zip_addr.zip2 = "";
    zip_addr.addr1 = "";
    zip_addr.addr2 = "";
    zip_addr.addr3 = "";
    $scope.zip_addr = zip_addr;

    // 都道府県リスト
    var prefmap = [null,"北海道","青森県","岩手県","宮城県","秋田県","山形県","福島県","茨城県","栃木県","群馬県","埼玉県","千葉県","東京都","神奈川県","新潟県","富山県","石川県","福井県","山梨県","長野県","岐阜県","静岡県","愛知県","三重県","滋賀県","京都府","大阪府","兵庫県","奈良県","和歌山県","鳥取県","島根県","岡山県","広島県","山口県","徳島県","香川県","愛媛県","高知県","福岡県","佐賀県","長崎県","熊本県","大分県","宮崎県","鹿児島県","沖縄県"];

    /**
     * 郵便番号から住所の検索・取得
     */
    function searchZipAddr(zip1, zip2, successFunc, errorFunc)
    {
        // 入力チェック
        if(zip1.match(/[^0-9]+/) || 
            zip2.match(/[^0-9]+/) || 
            !(zip1.length === 3) ||
            !(zip2.length === 4) ){
            errorFunc();
            return;
        }
        // 検索処理
        var zipAddr = {};
        var config = {};
        $http.get("https://yubinbango.github.io/yubinbango-data/data/" + zip1 + ".js", config)
        .success(function (data, status, headers, config) {
            if(data){
                zipAddr = angular.fromJson(data.substr(0, data.lastIndexOf(");")).replace("$yubin(", ""));
                var addr = zipAddr[zip1 + zip2];
                if(addr){
                    successFunc(addr);
                }else{
                    errorFunc();
                }
            }else{
                errorFunc();
            }
        })
        .error(function (data, status, headers, config) {
            errorFunc();
        });
    };

    /**
     * 住所検索ボタン押下
     */
    $scope.clickSearchZipAddr = function(){
        searchZipAddr(
            $scope.zip_addr.zip1, 
            $scope.zip_addr.zip2,
            function(addr){
                $scope.zip_addr.addr1 = prefmap[addr[0]];
                $scope.zip_addr.addr2 = addr[1];
                $scope.zip_addr.addr3 = addr[2];
            },
            function(){
                alert('該当する住所が見つかりませんでした。');
            }
        );
    };
});

以下は対応するHTMLコードです。


<div ng-controller="MainCtrl">
    <p>
        <input type="text" ng-model="zip_addr.zip1" size="2" maxlength="3" /> -
        <input type="text" ng-model="zip_addr.zip2" size="3" maxlength="4" />
        <button ng-click="clickSearchZipAddr()">住所検索</button>
    </p>
    <p>
        <input type="text" ng-model="zip_addr.addr1" size="15" />
        <input type="text" ng-model="zip_addr.addr2" size="15" />
        <input type="text" ng-model="zip_addr.addr3" size="15" />
    </p>
</div>

感想

そうそうないと思いますが、都道府県が増減したり、郵便番号の体系が変わったら修正しないといけないと思います。

AngularJS】関連記事