jineecode

지역 선택 JS로 제어하기 본문

JS

지역 선택 JS로 제어하기

지니코딩 2021. 2. 26. 15:23

개요: 매장 map을 구현하다가 각 지역 시/군/구의 option 값을 하드코딩하는 게 비효율적이라서 JS를 찾아보았다.

 

imivory.tistory.com/9

 

[javascript] selectbox 선택에 따라 두번째 selectbox 값 변화

[javascript] selectbox 선택에 따라 두번째 selectbox 값 변화 selectbox의 선택에 따라 두번째 selectbox의 값이 변해야하는 경우가 있습니다. 지역 선택을 해야할 때나 품목 선택을 해야할 때가 그런 경우죠.

imivory.tistory.com

위 코드를 참고했다.

 

 

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

 

for...in - JavaScript | MDN

for...in문은 상속된 열거 가능한 속성들을 포함하여 객체에서 문자열로 키가 지정된 모든 열거 가능한 속성에 대해 반복합니다. (Symbol로 키가 지정된 속성은 무시합니다.) for (variable in object) { ...

developer.mozilla.org

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

 

Document.createElement() - Web API | MDN

HTML 문서에서, Document.createElement() 메서드는 지정한 tagName의 HTML 요소를 만들어 반환합니다. tagName을 인식할 수 없으면 HTMLUnknownElement를 대신 반환합니다.let element = document.createElement(tagName[, options])

developer.mozilla.org

 

 

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
Comments