PageSourceSearch

https://visualpython.ai/js/zipcode_daum.js?1777248798

js visualpython.ai collected 2026-09-24 09:47:41 UTC 7,886 bytes, 236 lines download raw bytes

1var ZIPCODE_DAUM = function(){
2    var $zipcodeContainer, $zipcodeLayer;
3    var $postCodeInput;
4    var $addressInput;
5    var $subAddress; // 아이폰에서 input 버그로 인해 input 바로 위에 투명한 div
6    var onComplete;
7    var onStart;
8    var onShow;
9    var onClose;
10    var type;
11    var $openKakaoAddressButton;
12    // Daum(primary) 사용 불가 시 자체 주소 페이지(fallback)로 전환할지 여부.
13    // init 시점에 ADDRESS_MODE 강제 또는 헬스체크 결과로 결정한 뒤 캐싱한다.
14    // 기본값 false: 헬스체크 미완료/실패 시에도 Daum 사용 (기존 fail-open 동작 유지).
15    var useFallback = false;
16    var option = {
17        'addr_container' : null,
18        'addr_pop' : null,
19        'post_code' : null,
20        'addr' : null,
21        'height' : '',
22        'open_button' : null,
23	    attachShowEventOnInput: true,
24	    hideWhenClickOutside: true,
25    };
26
27    var init = function(data) {
28		option = $.extend(option,data);
29        $zipcodeContainer = option.addr_container;
30        $zipcodeLayer = option.addr_pop;
31        $postCodeInput = option.post_code;
32        $addressInput = option.addr;
33        $openKakaoAddressButton = option.open_button;
34        $subAddress = option.sub_addr;
35        onComplete = option.onComplete;
36        onShow = option.onShow;
37        onStart = option.onStart;
38        onClose = option.onClose;
39
40        if(typeof onStart == 'function'){
41            onStart();
42        }
43      if($openKakaoAddressButton !== undefined && $openKakaoAddressButton !== null){
44        $openKakaoAddressButton.off('click').on('click', function(){
45          showFindAddress();
46        });
47      }
48      if($postCodeInput !== undefined && $postCodeInput !== null){
49        $postCodeInput.off('click').on('click', function(){
50          showFindAddress();
51        });
52      }
53		if($subAddress !== undefined && $subAddress !== null ){
54			$subAddress.off('click').on('click', function(){
55				showFindAddress();
56			});
57		}
58
59		if (option.attachShowEventOnInput)  {
60			$addressInput.off('click').on('click', function(){
61				showFindAddress();
62			});
63		}
64
65		// init 시점에 1회만 결정. 이후 showFindAddress 호출 시 캐싱된 useFallback 값으로 분기한다.
66		resolveAddressProvider();
67    };
68
69    var resolveAddressProvider = function() {
70		// ADDRESS_MODE가 'kakao'/'naver'로 강제되어 있으면 자체 주소 검색 페이지(fallback) 사용
71		if (window.ADDRESS_MODE === 'kakao' || window.ADDRESS_MODE === 'naver') {
72			useFallback = true;
73			return;
74		}
75
76		// Daum 주소 검색 헬스체크
77		var controller = new AbortController();
78		var timeoutId = setTimeout(function() {
79			controller.abort();
80			// 타임아웃 시 Daum 사용 (fallback 안 함)
81			useFallback = false;
82		}, 3000);
83
84		fetch(TEST_SERVER ? 'https://gateway-platform.dev.imwebapis.com/address/health/daum' : 'https://gateway-platform.imwebapis.com/address/health/daum', {
85			method: 'GET',
86			signal: controller.signal
87		})
88		.then(function(response) {
89			clearTimeout(timeoutId);
90			if (!response.ok) {
91				// HTTP 오류 시 Daum 사용
92				useFallback = false;
93				return null;
94			}
95			return response.json();
96		})
97		.then(function(data) {
98			// isHealthy가 명시적으로 false일 때만 fallback 사용
99			useFallback = !!(data && data.isHealthy === false);
100		})
101		.catch(function(error) {
102			clearTimeout(timeoutId);
103			// 네트워크 오류 등 헬스체크 호출 실패 시 Daum 사용
104			useFallback = false;
105		});
106	};
107
108    var hideFindAddress = function() {
109        $zipcodeContainer.hide();
110        $zipcodeContainer.parent('div._widget_data').removeClass('address-open');
111        if(typeof onClose == 'function'){
112            onClose();
113        }
114    };
115    
116    var showFindAddress = function() {
117				// init 시점 resolveAddressProvider에서 결정/캐싱한 useFallback 값으로 분기
118				if (useFallback) {
119					useCustomAddressPage();
120				} else {
121					useDaumPostcode();
122				}
123			};
124			
125			var useCustomAddressPage = function() {
126				// 자체 제작 주소 검색 페이지
127				// 기존 iframe 제거
128				$zipcodeLayer.empty();
129				
130				var iframe = document.createElement('iframe');
131				iframe.src = '/_/address/';
132				iframe.style.width = '100%';
133				iframe.style.height = (!isNaN(option.height) && option.height !== '') ? option.height + 'px' : (option.height || '400px');
134				iframe.style.background = '#fff';
135				iframe.style.border = 'none';
136				$zipcodeLayer.get(0).appendChild(iframe);
137
138				// 메시지 핸들러 함수 정의
139				var messageHandler = function(event) {
140					if (event.data.type === 'ADDRESS_SELECTED') {
141						const { address, postalCode } = event.data;
142						$postCodeInput.val(postalCode);
143						$addressInput.val(address);
144						hideFindAddress();
145						onComplete({zonecode: postalCode, addressEnglish: ',,,,', jibunAddressEnglish: ',,,,'}, address);
146						
147						// 이벤트 리스너 제거
148						window.removeEventListener('message', messageHandler);
149					}
150				};
151				
152				window.addEventListener('message', messageHandler);
153				
154				// iframe을 넣은 element를 보이게 한다.
155				$zipcodeContainer.show();
156				$zipcodeContainer.parent('div._widget_data').addClass('address-open');
157
158				if(typeof onShow == 'function'){
159					onShow();
160				}
161
162				if (option.hideWhenClickOutside) {
163					$(document).find('body').off('mousedown.zipcode').on('mousedown.zipcode', function() {
164						hideFindAddress();
165						$(this).off('mousedown.zipcode');
166					});
167				}
168			};
169			
170			var useDaumPostcode = function() {
171				new kakao.Postcode({
172					oncomplete: function(data) {
173						// 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.
174
175						// 각 주소의 노출 규칙에 따라 주소를 조합한다.
176						// 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
177						var fullAddr = data.address; // 최종 주소 변수
178						var extraAddr = ''; // 조합형 주소 변수
179
180						// 기본 주소가 도로명 타입일때 조합한다.
181						if(data.addressType === 'R'){
182							//법정동명이 있을 경우 추가한다.
183							if(data.bname !== ''){
184								extraAddr += data.bname;
185							}
186							// 건물명이 있을 경우 추가한다.
187							if(data.buildingName !== ''){
188								extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName);
189							}
190							// 조합형주소의 유무에 따라 양쪽에 괄호를 추가하여 최종 주소를 만든다.
191							fullAddr += (extraAddr !== '' ? ' ('+ extraAddr +')' : '');
192						}
193
194						// 우편번호와 주소 정보를 해당 필드에 넣는다.
195						$postCodeInput.val(data.zonecode); //5자리 새우편번호 사용
196						$addressInput.val(fullAddr);
197						//document.getElementById('sample2_addressEnglish').value = data.addressEnglish;
198
199						// iframe을 넣은 element를 안보이게 한다.
200						// (autoClose:false 기능을 이용한다면, 아래 코드를 제거해야 화면에서 사라지지 않는다.)
201						hideFindAddress(data);
202
203						onComplete(data, fullAddr);
204					},
205					width :'100%',
206					height: option.height
207				}).embed($zipcodeLayer.get(0));
208
209				// iframe을 넣은 element를 보이게 한다.
210				$zipcodeContainer.show();
211				$zipcodeContainer.parent('div._widget_data').addClass('address-open');
212
213				if(typeof onShow == 'function'){
214					onShow();
215				}
216
217				if (option.hideWhenClickOutside) {
218					$(document).find('body').off('mousedown.zipcode').on('mousedown.zipcode', function() {
219						hideFindAddress();
220						$(this).off('mousedown.zipcode');
221					});
222				}
223    };
224
225    return {
226        'init' : function(data){
227            init(data);
228        },
229        'showFindAddress' : function(){
230            showFindAddress();
231        },
232        'hideFindAddress' : function(){
233            hideFindAddress();
234        }        
235    }
236};

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.