반응형

2020-01-07 수업내용 정리

 

실습예제)

 

전국 시도중 하나를 선택하면 

선택한 시도에 대한 시군구가 다음 select에 목록으로 출력되고

시군구 중 하나를 선택하면 선택한 시군구에 대한 읍면동이

다음 select에 목록으로 출력되도록함 . 

 

포인트1 : 이벤트발생시 option 태그가 동적으로 생성

포인트2 : select에서 발생가능한 이벤트는 change임

포인트3 : select에서 선택한 항목의 정보는 selectedIndex속성을 이용

포인트4 : option 태그에 텍스트를 추가하려면 createNode를 이용

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<H2>주소검색</H2>
<div>
    <select id="sido">
        <option>-시도-</option>
        <option>-서울특별시-</option>
        <option>-경기도-</option>
        <option>-인천광역시-</option>
        <option>-부산광역시-</option>
    </select>

    <select id="gugun">
        <option>-시/군/구-</option>
    </select>

    <select id="dong">
        <option>-읍/면/동-</option>
    </select>
</div>
<p id="addr"></p>


</body>
</html>
  let sd = ['', '서울특별시', '경기도', '인천광역시', '부산광역시'];
    let sgg = [['-시/군/구-'],
                    ['-시/군/구-','강남구','서초구','송파구'],
                    ['-시/군/구-','광명시','구리시','성남시','수원시','고양시'],
                    ['-시/군/구-', '연수구', '남동구'],
                    ['-시/군/구-', '동래구', '해운대구','기장군']];
    let ymd= [[ ['- 읍/면/동 -'] ],
                        [['- 읍/면/동 -'],
                            [['- 읍/면/동 -'], ['논현동'],['대치동'],['삼성동'] ],
                            [['- 읍/면/동 -'], ['반포동'], ['방배동'], ['양재동'] ],
                            [ ['가락동', '석촌동', '잠실동'] ] ],
                        [['- 읍/면/동 -'],
                            ['1'],
                            ['2'],
                            ['3'],
                            ['4'],
                            ['5'] ],
                        [['- 읍/면/동 -'],
                            ['a'],
                            ['b'],
                            ['c']],
                        [['- 읍/면/동 -'],
                            ['가'],
                            ['나'],
                            ['다'] ]
    ]

    // 변수선언
    let sido = document.getElementById('sido')
    let gugun = document.getElementById('gugun')
    let dong = document.getElementById('dong');

    sido.addEventListener('change', makegu)

    function makegu(){
        // 현재 선택한 시도의 index값을 알아냄
        let sidx = sido.selectedIndex;

        // 이미 등록된 목록은 제거
        // ex 서울시를 고르면 서울시에 해당하는 구군이 나오고
        // 또다른시를 고르면 그시에맞는 구가나올텐데 서울시의 구또한 같이 나오게된다.
        // 이를 방지하기위해 또다른시를 고른다면 while문을 추가해 전에 있던 시의 구/군을 제거해줘야한다.
        while(gugun.lastChild){ // 구군목록에 option태그가 있는가 ?
            gugun.removeChild(gugun.lastChild);
        }
        // 선택한 시도에 대한 구군목록을 배열에서 가져와서
        // 구군select에 목록option으로 추가함
        // <select><option>강남구</option></select>
        // ex 위의 배열들을 변수 초기화할때 맞춰서 초기화해놨다.
        // 시/도 의 서울시의 배열위치가 1이라면 구/군의 서울시에 해당하는 구/군의 배열도 1이 되게
        for (let gg of sgg[sidx]){
            let opt = document.createElement('option');
            let txt = document.createTextNode(gg);
            opt.appendChild(txt)
            gugun.appendChild(opt);
        }
    }

    // 두번째 SELECT 요소에 이벤트핸들러 등록
    // 첫번째 항목에서 선택한 항목값과
    // 두번째 항목에서 선택한 값을 이용해서 읍면동 출력
    //포인트 0 : 핸들러명 - makedong
    //포인트 1 : 변수명 of 배열명[시도][구군]
    gugun.addEventListener('change', makedong);

    function makedong() {
        let sidx = sido.selectedIndex;
        let gidx = gugun.selectedIndex;

        while(dong.lastChild) {
            dong.removeChild(dong.lastChild)
        }

        for ( let dg of ymd[sidx][gidx]){
            let opt = document.createElement('option')
            let txt = document.createTextNode(dg)
            opt.appendChild(txt);
            dong.appendChild(opt);
        }
    }

    // 세번째 select 요소에 이벤트핸들러 등록
    // 선택한 주소 ( 시도/구군/읍면동 ) 를 p요소를 이용해서 출력
    dong.addEventListener('change', showaddr);
    let addr = document.getElementById('addr')

    function showaddr() {
        let ymdong = ' ';
        if (dong.value != '-/읍/면/동-' ) ymdong = dong.value;
        let result = sido.value + ' ' + gugun.value + ' ' + dong.value;

        addr.innerHTML='당신이 선택한 주소는 <b>' + result +'</b>';
    }

반응형

+ Recent posts