【jQuery】jquery.jpostal.jsで郵便番号から住所を自動補完する完全ガイド|分割表示・バリデーション・エラー処理まで

ECサイトや会員登録フォームで「郵便番号を入力すると住所が自動補完される」機能は、ユーザーの入力負荷を大幅に減らし離脱率の低下に繋がります。jquery.jpostal.js を使えば、jQueryプロジェクトに数行で郵便番号→住所の自動補完機能を追加できます。

この記事でわかること

  • jquery.jpostal.jsの導入方法(CDN / ダウンロード)
  • 郵便番号入力で住所を1つのフィールドに自動補完する
  • 都道府県・市区町村・町域を別フィールドに分割して補完する
  • フォーマットコード(%1〜%8)の使い方一覧
  • ハイフンあり・なし両方の郵便番号に対応する
  • 住所が見つからない場合のエラー処理
  • 郵便番号バリデーションとの組み合わせ
スポンサーリンク

jquery.jpostal.jsとは

jquery.jpostal.jsは、郵便番号データベースAPIに問い合わせて住所情報を取得するjQueryプラグインです。フォームの入力フィールドにバインドするだけで郵便番号→住所の自動補完を実装できます。

項目 内容
依存ライブラリ jQuery 1.7以上
データソース 郵便番号検索API(zip-cloud.appspot.com)
対応郵便番号 日本国内の7桁郵便番号(ハイフンあり・なし両対応)
ライセンス MIT

導入方法

CDNから読み込む

GitHubからCDN経由で読み込む方法が最も手軽です。

<!-- 1. jQueryを先に読み込む -->
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>

<!-- 2. jquery.jpostal.jsを読み込む -->
<script src="https://cdn.jsdelivr.net/npm/jquery.jpostal.js@1.0.1/jquery.jpostal.min.js"></script>

ローカルファイルを使う場合

GitHubのリポジトリ(harisenbon/jpostal)から jquery.jpostal.js をダウンロードし、プロジェクトの適切なディレクトリに配置してパスを指定してください。

基本の使い方:住所を1つのフィールドに補完する

最もシンプルなパターンです。郵便番号入力欄を離れると(focusout)、住所フィールドに都道府県から町域までの住所が自動で入力されます。

<form>
  <div>
    <label>郵便番号(ハイフンなし7桁またはハイフンあり)</label>
    <input type="text" id="postal-code" placeholder="1234567">
  </div>
  <div>
    <label>住所</label>
    <input type="text" id="address" placeholder="自動補完されます">
  </div>
</form>
$(function () {
  $('#postal-code').jpostal({
    postcode: ['#postal-code'],  // 郵便番号の入力フィールド
    address: {
      '#address': '%3%4%5%6%7'   // 住所を補完するフィールドとフォーマット
    }
  });
});
フォーマットコードの意味
%3: 都道府県 / %4: 市区町村 / %5: 町域 / %6: 丁目 / %7: 番地
詳細は次のセクションの一覧表を参照してください。

都道府県・市区町村・町域を別フィールドに分割する

実務のフォームでは都道府県・市区町村・町域をそれぞれ別の入力欄に分けるケースが多いです。address オブジェクトに複数のフィールドを定義することで実現できます。

<label>郵便番号</label>
<input type="text" id="zip" placeholder="123-4567">

<label>都道府県</label>
<input type="text" id="pref" placeholder="東京都">

<label>市区町村</label>
<input type="text" id="city" placeholder="新宿区">

<label>町域</label>
<input type="text" id="town" placeholder="西新宿">

<label>番地・建物名(手動入力)</label>
<input type="text" id="building" placeholder="2-8-1">
$(function () {
  $('#zip').jpostal({
    postcode: ['#zip'],
    address: {
      '#pref': '%3',    // 都道府県のみ
      '#city': '%4',    // 市区町村のみ
      '#town': '%5%6%7' // 町域・丁目・番地
    }
  });
});

フォーマットコード一覧

jpostal.jsで使えるフォーマットコードは以下の通りです。これらを組み合わせて address の値に設定します。

コード 内容
%1 郵便番号(ハイフンなし) 1234567
%2 郵便番号(ハイフンあり) 123-4567
%3 都道府県 東京都
%4 市区町村 新宿区
%5 町域(大字・字) 西新宿
%6 丁目 二丁目
%7 番地 8番1号
%8 ふりがな(都道府県) とうきょうと
一般的なフォーマットの組み合わせ

  • 都道府県から町域まで1行: %3%4%5%6%7
  • 都道府県のみ: %3
  • 市区町村以降: %4%5%6%7
  • 郵便番号をハイフンあり形式に変換: %2

ハイフンあり・なし両方の郵便番号に対応する

ユーザーが「1234567」と入力しても「123-4567」と入力しても動作するように設定できます。また、補完後に郵便番号フィールドをハイフンあり形式に統一することも可能です。

$(function () {
  $('#zip').jpostal({
    postcode: ['#zip'],
    address: {
      '#zip':  '%2',        // ハイフンあり形式に自動変換して上書き
      '#pref': '%3',
      '#city': '%4',
      '#town': '%5%6%7'
    }
  });
});
postcode配列に複数フィールドを指定できる
郵便番号が上3桁と下4桁に分かれた2つのフィールドに入力される場合は、postcode: ["#zip1", "#zip2"] のように配列で指定します。jpostal.jsが結合して7桁の郵便番号として検索します。

住所が見つからない場合のエラー処理

存在しない郵便番号が入力された場合、フィールドは空のままになります。callback オプションを使って住所が取得できなかった場合の処理を追加できます。

$(function () {
  $('#zip').jpostal({
    postcode: ['#zip'],
    address: {
      '#pref': '%3',
      '#city': '%4',
      '#town': '%5%6%7'
    },
    // 検索完了後のコールバック(data: 取得した住所データの配列)
    callback: function (data) {
      if (!data || data.length === 0) {
        // 住所が見つからない場合
        $('#zip-error')
          .text('この郵便番号の住所情報が見つかりませんでした。手動で入力してください。')
          .show();
        $('#pref, #city, #town').val('');  // 各フィールドをクリア
      } else {
        $('#zip-error').hide().text('');
      }
    }
  });
});

郵便番号バリデーションとの組み合わせ

郵便番号フィールドのフォーカスアウト時に形式チェックを行い、正しい形式のときだけ住所検索を実行する実装例です。

$(function () {
  // 郵便番号の形式チェック(7桁数字、またはハイフンあり)
  function isValidPostal(val) {
    return /^\d{7}$/.test(val) || /^\d{3}-\d{4}$/.test(val);
  }

  $('#zip').on('blur', function () {
    var val = $(this).val().trim();

    if (val === '') {
      $('#zip-error').hide();
      return;
    }

    if (!isValidPostal(val)) {
      $('#zip-error').text('郵便番号は7桁の数字またはハイフンあり形式(例: 123-4567)で入力してください').show();
      return;
    }

    $('#zip-error').hide();
  });

  // jpostal.jsでの自動補完(形式チェックはjpostal.jsが内部で処理)
  $('#zip').jpostal({
    postcode: ['#zip'],
    address: {
      '#pref': '%3',
      '#city': '%4',
      '#town': '%5%6%7'
    },
    callback: function (data) {
      if (!data || data.length === 0) {
        $('#zip-error').text('住所情報が見つかりませんでした').show();
      }
    }
  });
});
フォームバリデーション全体への組み込み
郵便番号の自動補完は、フォーム全体のバリデーション処理と組み合わせて使うのが実務的です。フォームバリデーションの実装全般はフォームバリデーション完全ガイドを参照してください。

jpostal.js不要のVanilla JS版(フォールバック対応)

jQueryへの依存をなくしたい場合や、jpostal.jsが使えない環境向けに、郵便番号検索APIを直接Fetchするシンプルな実装例も紹介します。

// jQuery版($.ajax)
function searchAddress(postal) {
  var code = postal.replace('-', '');  // ハイフンを除去
  if (!/^\d{7}$/.test(code)) return;

  $.ajax({
    url: 'https://zip-cloud.appspot.com/api/search',
    data: { zipcode: code },
    dataType: 'jsonp',
    success: function (data) {
      if (data.results) {
        var r = data.results[0];
        $('#pref').val(r.address1);  // 都道府県
        $('#city').val(r.address2);  // 市区町村
        $('#town').val(r.address3);  // 町域
      } else {
        alert('住所が見つかりませんでした');
      }
    }
  });
}

$(function () {
  $('#zip').on('blur', function () {
    searchAddress($(this).val());
  });
});
zip-cloud APIの利用上の注意
zip-cloud.appspot.com は無料の郵便番号検索APIです。商用利用は可能ですが、サービスの継続性は保証されていません。大量のリクエストは避け、レート制限に注意してください。社内システムや高トラフィックのサービスでは郵便番号CSVデータを自前のAPIサーバーに取り込んで使うことも検討してください。

まとめ

jquery.jpostal.jsを使うと、数行のコードで郵便番号→住所の自動補完が実装できます。

  • CDNで読み込み → $(el).jpostal({ postcode, address }) を設定するだけ
  • フォーマットコード(%3〜%7)で補完フィールドを柔軟に設定できる
  • callback で住所が見つからない場合の処理を追加する
  • 郵便番号の形式チェックは blur イベントで事前に行う

関連記事: フォームバリデーション完全ガイド / blur()でフォーカスが外れた瞬間に処理する

よくある質問(FAQ)

Q郵便番号を入力しても住所が補完されません。
A①DevToolsのConsoleにエラーが出ていないか確認してください。②jQuery > jpostal.jsの読み込み順序が正しいか確認してください。③セレクター(#postal-code など)がHTMLのID/クラスと一致しているか確認してください。④インターネット接続が必要です(オフライン環境では郵便番号APIに接続できません)。
Q補完のタイミングを変えたいです(入力中にリアルタイム補完など)。
Ajpostal.jsのデフォルトはフォーカスアウト時(focusout)に補完します。7桁入力された瞬間に自動補完するには、keyup イベントで文字数を監視し、7桁になったら trigger("focusout") を呼ぶか、jpostal.jsを使わずに直接APIを呼び出す方法を使ってください。
Q同じ郵便番号で複数の住所が存在する場合はどうなりますか?
A郵便番号検索APIがその郵便番号に対して複数の住所を返す場合、jpostal.jsはデフォルトで最初の1件(results[0])を使用します。callbackdata の全件を受け取り、複数件の場合はセレクトボックスで選択させる実装も可能です。
QWordPressのContact Form 7に組み込むには?
ACF7のフォームに郵便番号・住所のテキストフィールドを追加し、フッターに出力したスクリプトでCF7が生成するinput要素のIDまたはクラスをセレクターとして指定してください。CF7はフィールド名を your-postal-code のように設定するとinput[name="your-postal-code"] で取得できます。
Q海外在住ユーザーへの対応はできますか?
Ajpostal.jsは日本の郵便番号のみ対応しています。海外住所の入力フォームも必要な場合は、国選択のセレクトボックスを設け、「日本」選択時のみjpostal.jsによる自動補完を有効にし、「日本以外」選択時は自動補完なしで手動入力させる実装にしてください。