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'
}
});
});
郵便番号が上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.appspot.com は無料の郵便番号検索APIです。商用利用は可能ですが、サービスの継続性は保証されていません。大量のリクエストは避け、レート制限に注意してください。社内システムや高トラフィックのサービスでは郵便番号CSVデータを自前のAPIサーバーに取り込んで使うことも検討してください。
まとめ
jquery.jpostal.jsを使うと、数行のコードで郵便番号→住所の自動補完が実装できます。
- CDNで読み込み →
$(el).jpostal({ postcode, address })を設定するだけ - フォーマットコード(%3〜%7)で補完フィールドを柔軟に設定できる
callbackで住所が見つからない場合の処理を追加する- 郵便番号の形式チェックは
blurイベントで事前に行う
関連記事: フォームバリデーション完全ガイド / blur()でフォーカスが外れた瞬間に処理する
よくある質問(FAQ)
#postal-code など)がHTMLのID/クラスと一致しているか確認してください。④インターネット接続が必要です(オフライン環境では郵便番号APIに接続できません)。keyup イベントで文字数を監視し、7桁になったら trigger("focusout") を呼ぶか、jpostal.jsを使わずに直接APIを呼び出す方法を使ってください。results[0])を使用します。callback で data の全件を受け取り、複数件の場合はセレクトボックスで選択させる実装も可能です。your-postal-code のように設定するとinput[name="your-postal-code"] で取得できます。