jineecode
지역 선택 JS로 제어하기 본문
개요: 매장 map을 구현하다가 각 지역 시/군/구의 option 값을 하드코딩하는 게 비효율적이라서 JS를 찾아보았다.
위 코드를 참고했다.
HTML
시/도 를 선택할 수 있는 select 태그 하나,
군/구 를 선택할 수 있는 select 태그 하나를 만든다.
시/도를 담은 select 태그에는 onchange 이벤트 속성(onchange)을 주었다.
change 이벤트가 일어나면 군/구 select 값이 바뀔 수 있도록 하기 위함이다.
onchange="함수명(this)"
각각의 option엔 value값을 준다.
군/구 select 태그엔 id="state"를 주었다.
<div class="search_boxes">
<div class="search_box">
<select name="" id="" onchange="categoryChange(this)">
<option value>시/도 선택</option>
<option value="general01">강원</option>
<option value="general02">경기</option>
<option value="general03">경남</option>
<option value="general04">경북</option>
<option value="general05">광주</option>
<option value="general06">대구</option>
<option value="general07">대전</option>
<option value="general08">부산</option>
<option value="general09">서울</option>
<option value="general10">울산</option>
<option value="general11">인천</option>
<option value="general12">전남</option>
<option value="general13">전북</option>
<option value="general14">제주</option>
<option value="general15">충남</option>
<option value="general16">충북</option>
</select>
</div>
<div class="search_box">
<select name="" id="state">
<option>군/구 선택</option>
</select>
</div>
JS
function categoryChange(e) {
const state = document.getElementById("state");
const gangwon = ["강릉시","동해시","삼척시","속초시","원주시","춘천시","태백시","고성군","양구군","양양군","영월군","인제군","정선군","철원군","평창군","홍천군","화천군","횡성군"];
const gyeonggi = ["고양시","과천시","광명시","광주시","구리시","군포시","김포시","남양주시","동두천시","부천시","성남시","수원시","시흥시","안산시","안성시","안양시","양주시","오산시","용인시","의왕시","의정부시","이천시","파주시","평택시","포천시","하남시","화성시","가평군","양평군","여주군","연천군"];
const gyeongsangnam = ["거제시", "김해시", "마산시", "밀양시", "사천시", "양산시", "진주시", "진해시", "창원시", "통영시", "거창군", "고성군", "남해군", "산청군", "의령군", "창녕군", "하동군", "함안군", "함양군", "합천군"];
const gyeongsangbuk = ["경산시","경주시","구미시","김천시","문경시","상주시","안동시","영주시","영천시","포항시","고령군","군위군","봉화군","성주군","영덕군","영양군","예천군","울릉군","울진군","의성군","청도군","청송군","칠곡군"];
const gwangju = ["광산구", "남구", "동구", "북구", "서구"];
const daegu = ["남구", "달서구", "동구", "북구", "서구", "수성구", "중구", "달성군"];
const daejeon = ["대덕구", "동구", "서구", "유성구", "중구"];
const busan = ["강서구","금정구","남구","동구","동래구","부산진구","북구","사상구","사하구","서구","수영구","연제구","영도구","중구","해운대구","기장군"];
const seoul = ["강남구","강동구","강북구","강서구","관악구","광진구","구로구","금천구","노원구","도봉구","동대문구","동작구","마포구","서대문구","서초구","성동구","성북구","송파구","양천구","영등포구","용산구","은평구","종로구","중구","중랑구"];
const ulsan = ["남구","동구","북구","중구","울주군"];
const incheon = ["계양구","남구","남동구","동구","부평구","서구","연수구","중구","강화군","옹진군"];
const jeonnam = ["광양시","나주시","목포시","순천시","여수시","강진군","고흥군","곡성군","구례군","담양군","무안군","보성군","신안군","영광군","영암군","완도군","장성군","장흥군","진도군","함평군","해남군","화순군"];
const jeonbuk = ["군산시", "김제시", "남원시", "익산시", "전주시", "정읍시", "고창군", "무주군", "부안군", "순창군", "완주군", "임실군", "장수군", "진안군"];
const jeju = ["서귀포시","제주시","남제주군","북제주군"];
const chungbuk = ["제천시","청주시","충주시","괴산군","단양군","보은군","영동군","옥천군","음성군","증평군","진천군","청원군"];
if (e.value == "general01") {
add = gangwon;
} else if (e.value == "general02") {
add = gyeonggi;
} else if (e.value == "general03") {
add = gyeongsangnam;
} else if (e.value == "general04") {
add = gyeongsangbuk;
} else if (e.value == "general05") {
add = gwangju;
} else if (e.value == "general06") {
add = daegu;
} else if (e.value == "general07") {
add = daejeon;
} else if (e.value == "general08") {
add = busan;
} else if (e.value == "general09") {
add = seoul;
} else if (e.value == "general10") {
add = ulsan;
} else if (e.value == "general11") {
add = incheon;
} else if (e.value == "general12") {
add = jeonnam;
} else if (e.value == "general13") {
add = jeonbuk;
} else if (e.value == "general14") {
add = jeju;
} else if (e.value == "general15") {
add = chungnam;
} else if (e.value == "general16") {
add = chungbuk;
}
state.options.length = 1;
// 군/구 갯수;
for (property in add) {
let opt = document.createElement("option");
opt.value = add[property];
opt.innerHTML = add[property];
state.appendChild(opt);
}
}
1. 군/구 를 DOM 한다.
const state = document.getElementById("state");
2. 군/구를 각각 배열 형식으로 만들어 선언해준다.
ex: const gangwon = ["강릉시","동해시","삼척시","속초시","원주시","춘천시","태백시","고성군","양구군","양양군","영월군","인제군","정선군","철원군","평창군","홍천군","화천군","횡성군"];
3. for in 문을 사용한다.
문법: for (variable in object) { ... }
developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for...in
variable
매번 반복마다 다른 속성이름(Value name)이 변수(variable)로 지정됩니다.
object
반복작업을 수행할 객체로 열거형 속성을 가지고 있는 객체.
즉, 이런 느낌이다
const object = {
a: 1,
b: 2,
c: 3
};
for (const property in object) {
console.log(`${property}: ${object[property]}`);
}
// expected output:
// "a: 1"
// "b: 2"
// "c: 3"
object[property]를 쓰면 object의 value를 반환할 수 있다.
const chungbuk = ["제천시","청주시","충주시","괴산군"];
for (const property in chungbuk) {
console.log(chungbuk[property])
}
//제천시
//청주시
//충주시
//괴산군
이를 응용해서 'option' 엘리먼트를 생성하고, 이것을 'opt' 변수에 담은 다음,
변수 opt의 value와 innerHTML을 for in 문으로 만들어진 프로퍼티로 선언한다.
이렇게 만들어진 option을 #state에 집어넣어주면 완성!
for (property in add) {
let opt = document.createElement("option");
opt.value = add[property];
opt.innerHTML = add[property];
state.appendChild(opt);
}
createElement
developer.mozilla.org/ko/docs/Web/API/Document/createElement
4. 조건문을 만들어 해당되는 시/도에 알맞는 군/구를 넣어줄 수 있게 한다.
if (e.value == "general01") {
add = gangwon;
} else if (e.value == "general02") {
add = gyeonggi;
} else if (e.value == "general03") {
add = gyeongsangnam;
} else if (e.value == "general04") {
add = gyeongsangbuk;
} else if (e.value == "general05") {
add = gwangju;
} else if (e.value == "general06") {
add = daegu;
} else if (e.value == "general07") {
add = daejeon;
} else if (e.value == "general08") {
add = busan;
} else if (e.value == "general09") {
add = seoul;
} else if (e.value == "general10") {
add = ulsan;
} else if (e.value == "general11") {
add = incheon;
} else if (e.value == "general12") {
add = jeonnam;
} else if (e.value == "general13") {
add = jeonbuk;
} else if (e.value == "general14") {
add = jeju;
} else if (e.value == "general15") {
add = chungnam;
} else if (e.value == "general16") {
add = chungbuk;
}
만약 e.value가 general01, 즉 강원이라면 우리가 3번에서 만들어준 add 객체에 2번에서 만들어준 gangwon;을 대입해주는 것이다. 이런 식으로 else if 조건문을 만들어준다.
5. 시/도 를 바꿀 때 군/구를 다시 초기화 시켜주려면
state.options.length = 1;
으로 강제로 length 값을 준다.
완성 ^^
(else if 노가다 하면서 더 효율적인 코드가 있을 거 같은데... 라는 기분을 떨쳐낼 수 없었음 .... -_-;)
See the Pen dyOdpOj by HyejinUm (@uhj1993) on CodePen.
'JS' 카테고리의 다른 글
싱글스레드 자바스크립트. (0) | 2021.04.26 |
---|---|
스코프 & 클로저 (0) | 2021.04.26 |
이벤트 위임 (0) | 2021.02.25 |
깨알 기초 지식 모음 (0) | 2021.02.14 |
끝말잇기 만들기 (0) | 2020.12.08 |