PageSourceSearch

https://fortune-cookie.tokyo/assets/js/zip-search.js?v=1.0.610

js fortune-cookie.tokyo collected 2026-10-07 17:58:13 UTC 7,469 bytes, 182 lines download raw bytes

1/**
2 * 郵便番号の検索処理
3 * views/js/zip_search.blade.php
4 */
5window.addEventListener('load', function () {//HTML読み込み完了後に実行
6    //郵便番号(申し込み者)の検索
7    const zip_code_input = document.getElementById('address1');
8    const zip_code_btn = document.getElementById('zip_code_search');
9
10    if (zip_code_btn && zip_code_input != null) {
11        zip_code_btn.addEventListener('click', function () {
12
13            let api = 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=';
14            let error = document.getElementById('error');
15            let zip_code = document.getElementById('zip_code');
16            let address1 = document.getElementById('address1');
17            let prefectures = document.getElementById('prefectures');
18            let city = document.getElementById('city');
19            let param = zip_code.value.replace('-', '');
20            let url = api + param;
21
22            let params = { 'zip_code': zip_code, 'city': city, 'address1': address1, 'prefectures': prefectures };
23            ajax_jsonp(url, display_message, params);
24
25        }, false);
26    }
27
28    //郵便番号(送り先)の検索
29    const delivery_zip_code_input = document.getElementById('address1_delivery');
30    const delivery_zip_code_btn = document.getElementById('zip_code_delivery_search');
31    if (delivery_zip_code_btn && delivery_zip_code_input != null) {
32        delivery_zip_code_btn.addEventListener('click', function () {
33
34            let api = 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=';
35            let error = document.getElementById('error');
36            let zip_code = document.getElementById('zip_code_delivery');
37            let address1 = document.getElementById('address1_delivery');
38            let prefectures = document.getElementById('prefectures_delivery');
39            let city = document.getElementById('city_delivery');
40            let param = zip_code.value.replace('-', '');
41            let url = api + param;
42
43            let params = { 'zip_code': zip_code, 'city': city, 'address1': address1, 'prefectures': prefectures };
44            ajax_jsonp(url, display_message, params);
45
46        }, false);
47    }
48
49});
50
51/**
52 * zipcode
53 */
54function get_address_from_zip_code(zip_code_name, prefectures_name, address1_name, city_name) {
55
56    let api = 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=';
57    let error = document.getElementById('error');
58    let zip_code = document.getElementById(zip_code_name);
59    let address1 = document.getElementById(address1_name);
60    let prefectures = document.getElementById(prefectures_name);
61    let city = city_name ? document.getElementById(city_name) : null;
62    let param = zip_code.value.replace('-', '');
63    let url = api + param;
64
65    let params = { 'zip_code': zip_code, 'city': city, 'address1': address1, 'prefectures': prefectures };
66    ajax_jsonp(url, display_message, params);
67
68}
69
70/**
71 * 1件分の住所結果をフォームフィールドに適用する
72 * @param {Object} result - zipcloud の results 配列の1要素
73 * @param {Object} params - display_message に渡される params オブジェクト
74 */
75function applyZipResult(result, params) {
76    if (params['prefectures']) {
77        // 都道府県のセット(address1)
78        var prefectures = params['prefectures'];
79        for (let i = 0; i < prefectures.length; i++) {
80            if (result.address1 == prefectures[i].value) {
81                params['prefectures'].options[i].selected = true;
82            }
83        }
84    }
85
86    if (params['city']) {
87        // 市区町村のセット(address2 = 市区町村)
88        // params['city'] が falsy(null)の場合はスキップ(customer_info の既存挙動踏襲)
89        params['city'].value = result.address2;
90    }
91
92    if (params['address1']) {
93        // 町域のセット(address3 = 町域)
94        params['address1'].value = result.address3;
95    }
96}
97
98/**
99 * zip_code 入力欄の直後にある候補プルダウンを削除する
100 * zip-results-selector クラスを持つ要素のみ削除し、他の sibling は一切削除しない
101 * @param {Element} zipCodeElement - params['zip_code'] の DOM 要素
102 */
103function removeZipResultsSelector(zipCodeElement) {
104    if (!zipCodeElement) {
105        return;
106    }
107    var next = zipCodeElement.nextElementSibling;
108    if (next && next.classList.contains('zip-results-selector')) {
109        next.parentNode.removeChild(next);
110    }
111}
112
113//ajaxの戻り値を使った処理
114var display_message = function (data, params) {
115
116    //追加エラーメッセージを一度削除
117    var elems = document.getElementsByClassName('zip-add-message');
118    for (var i in elems) {
119        var e = elems[0];
120        if (e) {
121            e.parentNode.removeChild(e);
122        }
123    }
124    //エラー表示を解除
125    params['zip_code'].classList.remove("input-error");
126
127    // 全分岐共通: 過去の候補プルダウンを削除(再検索時の重複防止)
128    removeZipResultsSelector(params['zip_code']);
129
130    //郵便番号にエラーがある場合
131    if (data.message) {
132
133        // 追加する要素を作成します
134        var newContent = '<div class="error-message add-message zip-add-message">' + data.message + '</div>';
135        params['zip_code'].insertAdjacentHTML('beforebegin', newContent);
136        params['zip_code'].classList.add("input-error");
137
138    }
139    //検索データが存在しない場合
140    if (data.results == null) {
141
142        // 追加する要素を作成します
143        var newContent = '<div class="error-message add-message zip-add-message">入力した郵便番号に当てはまる住所が存在しません。</div>';
144        params['zip_code'].insertAdjacentHTML('beforebegin', newContent);
145        params['zip_code'].classList.add("input-error");
146
147    } else {
148
149        // 1件目をフィールドに反映(単一・複数いずれも共通)
150        applyZipResult(data.results[0], params);
151
152        // 複数結果時: 候補プルダウンを生成して zip_code 直後に挿入
153        if (data.results.length >= 2) {
154            try {
155                var selectElement = document.createElement('select');
156                selectElement.classList.add('zip-results-selector');
157
158                for (let idx = 0; idx < data.results.length; idx++) {
159                    var option = document.createElement('option');
160                    option.value = String(idx);
161                    // XSS 対策: textContent でセット(innerHTML 禁止)
162                    option.textContent = data.results[idx].address2 + data.results[idx].address3;
163                    if (idx === 0) {
164                        option.selected = true;
165                    }
166                    selectElement.appendChild(option);
167                }
168
169                // プルダウン変更時に対応する住所をフィールドへ反映
170                selectElement.addEventListener('change', function () {
171                    var selectedIdx = Number(this.value);
172                    applyZipResult(data.results[selectedIdx], params);
173                });
174
175                params['zip_code'].insertAdjacentElement('afterend', selectElement);
176            } catch (e) {
177                console.warn('[zip-search] 候補プルダウンの生成に失敗しました:', e);
178                // 1件目の反映は try の前に完了済みのため、フォーム入力は継続可能
179            }
180        }
181    }
182}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.