郵便番号入力フォームで「123-4567」のようにハイフンを自動挿入すると、ユーザーの入力ミスを減らし、フォームの使いやすさが向上します。この記事ではハイフン自動挿入・住所自動入力連携・バリデーション・ペースト対応まで解説します。
この記事でわかること
- 数字入力時にハイフンを自動挿入する(NNN-NNNN形式)
- バックスペース対応(ハイフン直後の削除でハイフンも除去)
- zipcloud APIで郵便番号から住所を自動入力する
- 7桁の郵便番号かどうかをバリデーションする
- ペースト・スマホへの対応
input[type=text]でカスタム実装 vs ライブラリ
| 方法 | メリット | デメリット |
|---|---|---|
| jQuery自作実装 | 依存ゼロ・自由なカスタマイズ | バックスペース/ペースト等の考慮が必要 |
| jQuery Mask Plugin | 設定1行・各種入力形式対応 | ライブラリ追加が必要・メンテ停止気味 |
| IMask.js | モダン・バニラJS・型変換対応 | 学習コスト・jQueryと別物 |
新規プロジェクトでは依存ゼロのカスタム実装か、活発にメンテされているIMask.jsを推奨します。
ハイフン自動挿入の基本実装
<input type="text" id="zip-input" placeholder="例: 123-4567"
maxlength="8" inputmode="numeric">
$(function () {
$('#zip-input').on('input', function () {
// 数字以外を除去し、最大7桁
var digits = $(this).val().replace(/[^0-9]/g, '').slice(0, 7);
// 3桁後にハイフンを挿入
var formatted = digits.replace(/^(\d{3})(\d)/, '$1-$2');
$(this).val(formatted);
});
});
maxlength=”8″でNNN-NNNNの8文字に制限
郵便番号形式は最大8文字(3桁 + ハイフン + 4桁)です。
郵便番号形式は最大8文字(3桁 + ハイフン + 4桁)です。
maxlength="8" を設定しておくと余分な入力を防げます。inputmode="numeric" でスマホでは数字キーボードが表示されます。バックスペース対応(削除時にハイフンも自動削除)
バックスペースでハイフン直後の数字を削除した場合、ハイフンも一緒に削除する処理です。日付入力のスラッシュ自動挿入と同じパターンです。
$(function () {
var prevVal = '';
$('#zip-input').on('keydown', function () {
prevVal = $(this).val();
});
$('#zip-input').on('input', function () {
var val = $(this).val();
var digits = val.replace(/[^0-9]/g, '');
// 削除時、前の末尾文字がハイフンなら数字も1つ削除
var isDeleting = val.length < prevVal.length;
if (isDeleting && prevVal.slice(-1) === '-') {
digits = digits.slice(0, -1);
}
var formatted = digits.slice(0, 7).replace(/^(\d{3})(\d)/, '$1-$2');
$(this).val(formatted);
prevVal = formatted;
});
});
zipcloud APIで郵便番号から住所を自動入力する
7桁入力完了時にzipcloud(無料API)を呼び出して住所を自動補完するパターンです。
<input type="text" id="zip-input" placeholder="123-4567" maxlength="8"> <button id="zip-btn">住所検索</button> <p id="zip-error" style="color:red"></p> <input type="text" id="pref" placeholder="都道府県"> <input type="text" id="city" placeholder="市区町村"> <input type="text" id="addr" placeholder="町域">
function searchZip(zip) {
var digits = zip.replace(/-/g, '');
if (digits.length !== 7) return;
$.getJSON('https://zipcloud.ibsnet.co.jp/api/search?zipcode=' + digits, function (data) {
if (data.results) {
var r = data.results[0];
$('#pref').val(r.address1);
$('#city').val(r.address2);
$('#addr').val(r.address3);
$('#zip-error').text('');
} else {
$('#zip-error').text('該当する住所が見つかりません');
}
}).fail(function () {
$('#zip-error').text('住所の取得に失敗しました');
});
}
$(function () {
// 7桁入力完了で自動検索
$('#zip-input').on('input', function () {
var val = $(this).val();
if (val.replace(/-/g, '').length === 7) {
searchZip(val);
}
});
// 検索ボタン
$('#zip-btn').on('click', function () {
searchZip($('#zip-input').val());
});
});
zipcloud APIの利用上の注意
zipcloudは無料で使えますが、商用利用・大量リクエストの場合は利用規約を確認してください。住所データは完全ではなく、新設住所や大型ビルの住所が含まれない場合があります。自動入力後はユーザーに住所の確認・修正を促すUIにしてください。
zipcloudは無料で使えますが、商用利用・大量リクエストの場合は利用規約を確認してください。住所データは完全ではなく、新設住所や大型ビルの住所が含まれない場合があります。自動入力後はユーザーに住所の確認・修正を促すUIにしてください。
郵便番号バリデーション
function isValidZip(str) {
// NNN-NNNN 形式チェック
return /^\d{3}-\d{4}$/.test(str);
}
$(function () {
$('form').on('submit', function (e) {
var val = $('#zip-input').val();
if (!isValidZip(val)) {
e.preventDefault();
$('#zip-error').text('郵便番号を正しく入力してください(例: 123-4567)');
} else {
$('#zip-error').text('');
}
});
// 入力完了(8文字)でリアルタイムバリデーション
$('#zip-input').on('input', function () {
var val = $(this).val();
if (val.length === 8) {
var ok = isValidZip(val);
$('#zip-error').text(ok ? '' : '正しい郵便番号を入力してください');
} else {
$('#zip-error').text('');
}
});
});
ペースト対応・ハイフンなし7桁の変換
input イベントはペーストでも発火するため、基本の実装でペーストも動作します。ただし「1234567」のようにハイフンなし7桁をペーストした場合も自動変換されます。
// ハイフンなし7桁 → NNN-NNNN に変換(ページ読み込み時の初期値にも使える)
function formatZip(val) {
var digits = val.replace(/[^0-9]/g, '').slice(0, 7);
return digits.replace(/^(\d{3})(\d)/, '$1-$2');
}
$(function () {
// Ajaxやサーバーから取得した初期値を変換してセット
var savedZip = '1234567'; // 例: DBから取得した値
$('#zip-input').val(formatZip(savedZip)); // → '123-4567'
// inputイベントで自動フォーマット(ペースト時も発火)
$('#zip-input').on('input', function () {
$(this).val(formatZip($(this).val()));
});
});
まとめ
郵便番号入力フィールドへのハイフン自動挿入の実装ポイントをまとめます。
- 基本: 数字7桁を取得 → 3桁後にハイフンを挿入(
maxlength="8") - バックスペース: 削除時に前の末尾がハイフンなら数字も1つ削除
- 住所自動入力: 7桁完了でzipcloud APIを呼び出し(無料)
- バリデーション:
/^\d{3}-\d{4}$/で形式チェック - 初期値変換:
formatZip()でハイフンなし7桁を変換
関連記事: 日付入力にスラッシュを自動挿入する方法 / 時間入力にコロンを自動挿入する方法 / フォームバリデーション完全ガイド
よくある質問(FAQ)
Q送信時はハイフンを除いた7桁で送りたいです。
Asubmitイベントで hidden input に変換値をセットします:
$("#hidden-zip").val($("#zip-input").val().replace(/-/g, ""))これでUIはNNN-NNNN、送信値は7桁数字にできます。Q郵便番号の自動検索でCORSエラーが出ます。
AzipcloudはCORS対応しており、ブラウザから直接
$.getJSON()で呼び出せます。エラーが出る場合はURLの誤りやネットワーク問題が多いです。自社サーバーを経由してAPIを叩くプロキシ構成にすることでCORSを回避できます。Qスマホで数字キーボードを表示したいです。
A
inputmode="numeric" を input要素に追加してください。type="tel" でも同様ですが、電話番号UIと混同されやすいためtype="text" + inputmode="numeric" を推奨します。Q住所自動入力後に番地・建物名の欄にフォーカスを移したいです。
Azipcloud APIのコールバック内でフォーカスを移動します:
$("#building").focus();住所が自動入力された後、ユーザーが続きを入力しやすくなります。Q「〒」マークを入力欄の前に表示したいです。
ACSSで
::before 疑似要素を使うか、inputをdivで囲んでテキストを配置します:<div class="zip-wrap"><span>〒</span><input ...></div>inputの value に「〒」を含めてしまうとバリデーションが複雑になるため、UIと値を分けて管理することを推奨します。
