Ajax 검색 결과가 달라질 때 다중 마커 삭제 방법

AJAX로 검색을 해서 나오는 데이터들을 지도로 뿌려주는 것은 성공을 했습니다.
이제 검색 내용이 바뀔 때마다 원래 있던 마커를 지우고 다시 생성을 해야하는데요

여러개 마커 제어하기

이것을 참고해서 넣으면 되겠지 라고 생각했는데

addressSearch 함수의 결과를 전역변수에 담고 싶습니다

이 글에서 말씀하신 것 처럼 AJAX에서 전역변수에 담는 일이 쉽지가 않습니다.

https://devtalk.kakao.com/t/addresssearch/44163/4

이 예제도 ajax 안에서는 실패했습니다.

promise, async/await 를 써서라도 해결하고 싶은데 예제가 없어서 막막한 상황입니다.

어떤식으로 해결해야 할까요?

  • 소스코드
function getData() {

	var formData = $('form').serializeObject();
	delete formData['_csrf'];

	// 성별, 편의시설 하나만 선택할때 스트링으로 들어가는 것을 배열로 변경
	if (typeof formData.gender == 'string') {
		formData.gender = [formData.gender];
	}
	if (typeof formData.facilities == 'string') {
		formData.facilities = [formData.facilities];
	}

	$.ajax({
		url: '/searchgehainfo',
		type: 'post',
		contentType: 'application/json; charset=utf8',
		data: JSON.stringify(formData),
		dataType: 'json',
		beforeSend: function () {
			$('.wrap-loading').addClass('loader');
		},
		complete: function () {
			$('.wrap-loading').removeClass('loader');
			$('.wrap-loading').hide();
		}
	})
	.done(function (data) {
		// handlebars 템플릿 주입
		var source = $('#template').html();
		var template = Handlebars.compile(source);
		$('#searchresult').html(template(data));
	})
	.done(function (data) {
		// 마커 & 오버레이
		var geocoder = new daum.maps.services.Geocoder();
		
		var markers = [];

		// console.log(mapContainer);
		data.forEach(function (x, i) {
			geocoder.addressSearch(data[i].address, function (result, status) {
				if (status === daum.maps.services.Status.OK) {
					// markers가 하나라도 있으면
					// hide 하고 show

					var coords = new daum.maps.LatLng(result[0].y, result[0].x);

					// 마커를 생성하고 배열에 삽입 (지도위에 표시 x)
					var marker = new daum.maps.Marker({
						position: coords
					});
					markers.push(marker);

					// 배열에 추가된 마커들을 지도에 표시하거나 삭제하는 함수
					function showMarkers() {
						for (var i = 0, len = markers.length ; i < len; i++) {
							markers[i].setMap(map);
						}            
					}

					showMarkers();

					var customContent = document.createElement('div');
					customContent.className = 'wrap';

					var info = document.createElement('div');
					info.className = 'info';

					var contentTitle = document.createElement('div');
					contentTitle.className = 'title';
					contentTitle.textContent = data[i].guestHouseName;

					var closeBtn = document.createElement('div');
					closeBtn.className = 'close';
					closeBtn.title = '닫기';

					closeBtn.addEventListener("click", function(){ 
						CustomOverlay.setMap(null)
					});

					var contentBody = document.createElement('div');
					contentBody.className = 'body';

					var imgDiv = document.createElement('div');
					imgDiv.className = 'img';

					var imgTag = document.createElement('img');
					imgTag.src = data[i].originalName;
					imgTag.width = 73;
					imgTag.height = 70;

					var contentDesc = document.createElement('div');
					contentDesc.className = 'desc';

					var ellipsis = document.createElement('div');
					ellipsis.className = 'ellipsis';
					ellipsis.textContent = data[i].address;

					var aDiv = document.createElement('div');
					var aTag = document.createElement('a');
					aTag.href = 'http://www.kakaocorp.com/main';
					aTag.target = '_blank';
					aTag.className = 'link';
					aTag.textContent = '홈페이지';

					customContent.appendChild(info);
						info.appendChild(contentTitle);
							contentTitle.appendChild(closeBtn);
								closeBtn.appendChild(contentBody);
						info.appendChild(contentBody);
							contentBody.appendChild(imgDiv);
								imgDiv.appendChild(imgTag);
							contentBody.appendChild(contentDesc);
								contentDesc.appendChild(ellipsis);
								contentDesc.appendChild(aDiv);
									aDiv.appendChild(aTag);
						
					var CustomOverlay = new daum.maps.CustomOverlay({
						map: map,
						zIndex: 3,
						position: marker.getPosition()
					});
					
					daum.maps.event.addListener(marker, 'click', function() {
						CustomOverlay.setMap(map);
						CustomOverlay.setContent(customContent);
					});

					function closeOverlay() {
						CustomOverlay.setMap(null);
						CustomOverlay.setContent(null);
					}

				} // if status ok end
			}); // geocoder address search end

		}); // forEach end

	})
	.fail(function () {
		alert('failed');
	}); // ajax end

} // function getData end

q5

getData() 함수 밖에

var markers = [];
var overlays = [];

변수를 선언해 주시고

done 콜백 시작하자마자

.done(function (data) {

    markers.forEach(function (marker) { marker.setMap(null); });
    markers.length = 0 // 마커 배열 초기화
    overlays.forEach(function (overlay) { overlay.setMap(null); });
    overlays.length = 0 // 오버레이 배열 초기화

    // 이하 생략
})

이후, geocoder의 addressSearch 콜백에서 마커를 만들 때마다

var marker = new daum.maps.Marker({
    map: map,
    position: coords
});
markers.push(marker);

// 중략

var customOverlay = new daum.maps.CustomOverlay({
    map: map,
    zIndex: 3,
    position: marker.getPosition()
});
overlays.push(customOverlay);

// 이하 생략

해주시면 됩니다.

showMarkers() 함수와 호출부는 지워주세요.
closeOverlay() 도 안쓰는것 같은데 지워주세요.

1개의 좋아요

깔끔하게 해결 되었습니다 감사합니다~~

1개의 좋아요