Javascript [ 거래처등록 ]

양혜정·2024년 4월 13일
0

HTML/CSS/JS 실행

목록 보기
57/60
post-thumbnail


HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>daum 을 이용한 우편번호 및 주소 찾기</title>

<link rel="stylesheet" href="css/daum_address_search.css">

<script src="https://t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script> 
<script type="text/javascript" src="js/daum_address_search.js"></script>

</head>
<body>

	<div align="center">
		<h2 class="h2class" id="underline">거래처등록</h2>
		<table>
			<tr>
				<td class="title">거래처명</td>
				<td class="data"><input type="text" size="20" /></td>
			</tr>
			<tr>
				<td class="title">우편번호</td>
				<td class="data">
					<input type="text" id="postcode" size="5" placeholder="우편번호" />
					&nbsp;&nbsp;
					<button type="button" style="cursor: pointer;" onclick="openDaumPOST()">우편번호찾기</button> 
				</td>
			</tr>
			<tr>
				<td class="title">주소</td>
				<td class="data">
					<input type="text" id="address" size="65" placeholder="주소" /><br/>
					<input type="text" id="detailAddress" size="50" placeholder="상세주소" /><input type="text" id="extraAddress" size="50" placeholder="참고항목" /> 
				</td>
			</tr>
			<tr>
				<td class="title">전화번호</td>
				<td class="data">
				    <input type="text" size="5" maxlength="3" />&nbsp;-&nbsp;    
				    <input type="text" size="5" maxlength="4" />&nbsp;-&nbsp;
				    <input type="text" size="5" maxlength="4" />
				</td>
			</tr>
			<tr>
				<td class="title">품명(국산)</td>
				<td class="data">
					<input type="checkbox" name="product_kor" id="product_kor1" value="kor01" /><label for="product_kor1">메인보드</label>&nbsp;
					<input type="checkbox" name="product_kor" id="product_kor2" value="kor02" /><label for="product_kor2">모니터</label>&nbsp;
					<input type="checkbox" name="product_kor" id="product_kor3" value="kor03" /><label for="product_kor3">프린터</label>&nbsp;
					<input type="checkbox" name="product_kor" id="product_kor4" value="kor04" /><label for="product_kor4">하드디스크</label>&nbsp;
					<input type="checkbox" name="product_kor" id="product_kor5" value="kor05" /><label for="product_kor5">메모리</label>&nbsp;
					<input type="checkbox" name="product_kor" id="product_kor6" value="kor06" /><label for="product_kor6">CPU</label>&nbsp;
				</td>
			</tr>
			
			<!-- 
			   >>> === checkbox 제어의 기본개념 === <<<
			    - checkbox 는 동일한 이름을 가진 체크박스들이 여러개 존재하며
			      다수의 선택을 가능하게 하는 기능을 제공한다.
				  checkbox 는 배열의 개념이 필요하기 때문에 getElementById 가 아닌
				  getElementsByName 을 이용하여 제어한다.
				  그래서 id 가 아닌 name 을 이용하기 때문에 태그에 id 를 지정할 필요가 없다.
				  반드시 태그에  name 을 지정해야만 한다.  
				              
				>>> === checkbox 의 주요속성 === <<<
					1. name    => 체크박스의 이름.
					2. length  => 동일한 이름의 체크박스의 갯수.
					3. checked => 체크박스의 체크여부. 체크가 되어지면 true, 체크가 해제되면 false 를 리턴함.
					4. value   => 체크박스의 값.             
			-->
			
			<tr>
				<td class="title">품명(중고품)</td>
				<td class="data">
				    <input type="checkbox" name="product_old" id="product_old1" value="old01" /><label for="product_old1">메인보드</label>&nbsp;
					<input type="checkbox" name="product_old" id="product_old2" value="old02" /><label for="product_old2">모니터</label>&nbsp;
					<input type="checkbox" name="product_old" id="product_old3" value="old03" /><label for="product_old3">프린터</label>&nbsp;
					<input type="checkbox" name="product_old" id="product_old4" value="old04" /><label for="product_old4">하드디스크</label>&nbsp;
					<input type="checkbox" name="product_old" id="product_old5" value="old05" /><label for="product_old5">메모리</label>&nbsp;
					<input type="checkbox" name="product_old" id="product_old6" value="old06" /><label for="product_old6">CPU</label>&nbsp;
				</td>
			</tr>
			<tr>
				<td class="title">
				    <span id="allChoice">
				      <label for="allCheck">모두선택/해제</label><input type="checkbox" id="allCheck" />      
				    </span>
				    <br/>품명(미국산)
				</td>
				<td class="data">
				    <input type="checkbox" name="product_usa" id="product_usa1" value="usa01" /><label for="product_usa1">메인보드</label>&nbsp;
					<input type="checkbox" name="product_usa" id="product_usa2" value="usa02" /><label for="product_usa2">모니터</label>&nbsp;
					<input type="checkbox" name="product_usa" id="product_usa3" value="usa03" /><label for="product_usa3">프린터</label>&nbsp;
					<input type="checkbox" name="product_usa" id="product_usa4" value="usa04" /><label for="product_usa4">하드디스크</label>&nbsp; 
					<input type="checkbox" name="product_usa" id="product_usa5" value="usa05" /><label for="product_usa5">메모리</label>&nbsp;
					<input type="checkbox" name="product_usa" id="product_usa6" value="usa06" /><label for="product_usa6">CPU</label>&nbsp;
				</td>
			</tr>
			<tr align="center">
				<td colspan="2" class="bordernone">
					<button type="button">쓰기</button>&nbsp;&nbsp;
					<button type="button">취소</button>
				</td>
			</tr>
		</table>
	</div>

</body>
</html>

JS

window.onload = function(){

    // === 체크박스 여러개 중 라디오 처럼 1개만 선택되도록 만든 것 === //
    const checkbox_list = document.querySelectorAll("input[name = 'product_old']");
    
    for(let checkbox of checkbox_list){
        // checkbox 내가 클릭한 체크박스
        checkbox.addEventListener('click', () => {
            for(let checkbox_product_old of checkbox_list){
                // 클릭한 체크박스와 체크박스리스트 요소들이 다른 경우
                if(checkbox != checkbox_product_old){
                    checkbox_product_old.checked = false;
                }
            }   // end of for~of--------------------
        })
    }   // end of for~of-------------

    // === 체크박스 전체선택/전체해제 === //
    const allCheck = document.querySelector("input[id='allCheck']");

    allCheck.addEventListener('click',() =>{

        const checkbox_list = document.querySelectorAll("input[name='product_usa']");

        for(let checkbox of checkbox_list){
            checkbox.checked = allCheck.checked;
        }   // end of for~of----------------

    })

    // === 체크박스 전체선택/전체해제 에서 
    //     하위 체크박스에 체크가 1개라도 체크가 해제되면 체크박스 전체선택/전체해제 체크박스도 체크가 해제되고
    //     하위 체크박스에 체크가 모두 체크가 되어지면 체크박스 전체선택/전체해제 체크박스도 체크가 되어지도록 하는 것 === //
    const checkbox_usa_list = document.querySelectorAll("input[name='product_usa']");

    // === 이벤트 소스를 잡은것(복수개 이므로 for문을 사용함) === //
    
    for(let checkbox of checkbox_usa_list){
        checkbox.addEventListener('click', () => {
            if(!checkbox.checked){  // 체크박스에 체크를 해제한 클릭인 경우
                document.querySelector("input[id='allCheck']").checked = false;
            }
            else{   // 체크박스에 체크를 한 클릭인 경우
                // ==> name 값이 product_usa 인 모든 체크박스를 검사해서 모든 체크박스가 체크가 되어진 경우라면 
                //     체크박스 전체선택/전체해제 체크박스에 체크를 해주도록 한다. 
                let is_check_all = true;
                for(let checkbox_usa of checkbox_usa_list){

                    if(!checkbox_usa.checked){  // 다른 체크박스의 체크여부 파악
                        is_check_all = false;
                        break;
                    }

                }   // end of for~of-------------
                
                if(is_check_all){
                    document.querySelector("input[id='allCheck']").checked = true;
                }

            }   // end of if~else---------------
        }) 
    }   // end of for~of-----------


}   // end of window.onload = function()--------------------------

/////////////////////////////////////////////////////////////////////

// === 우편번호 찾기 클릭한 경우 === //
function openDaumPOST(){

    new daum.Postcode({
        oncomplete: function(data) {
            // 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.

            // 각 주소의 노출 규칙에 따라 주소를 조합한다.
            // 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
            let addr = ''; // 주소 변수
            let extraAddr = ''; // 참고항목 변수

            //사용자가 선택한 주소 타입에 따라 해당 주소 값을 가져온다.
            if (data.userSelectedType === 'R') { // 사용자가 도로명 주소를 선택했을 경우
                addr = data.roadAddress;
            } else { // 사용자가 지번 주소를 선택했을 경우(J)
                addr = data.jibunAddress;
            }

            // 사용자가 선택한 주소가 도로명 타입일때 참고항목을 조합한다.
            if(data.userSelectedType === 'R'){
                // 법정동명이 있을 경우 추가한다. (법정리는 제외)
                // 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다.
                if(data.bname !== '' && /[동|로|가]$/g.test(data.bname)){
                    extraAddr += data.bname;
                }
                // 건물명이 있고, 공동주택일 경우 추가한다.
                if(data.buildingName !== '' && data.apartment === 'Y'){
                    extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName);
                }
                // 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다.
                if(extraAddr !== ''){
                    extraAddr = ' (' + extraAddr + ')';
                }
                // 조합된 참고항목을 해당 필드에 넣는다.
                document.getElementById("extraAddress").value = extraAddr;
            
            } else {
                document.getElementById("extraAddress").value = '';
            }

            // 우편번호와 주소 정보를 해당 필드에 넣는다.
            document.getElementById('postcode').value = data.zonecode;
            document.getElementById("address").value = addr;
            // 커서를 상세주소 필드로 이동한다.
            document.getElementById("detailAddress").focus();
        }
    }).open();
    
}   // end of function openDaumPOST()----------------------------

CSS

@charset "UTF-8";

	#underline {text-decoration: underline;
	         	margin-top: 2%;
	         	margin-bottom: 2%;
	         	color: green;}
	
	#allChoice {font-size: 8pt;
	            font-weight: normal;
	            font-style: italic;
	            color: blue;}
	
	.title {width: 18%;
		    background-color: ivory;
	        font-weight: bold;
	        text-align: right;
	        color: #ff6600; }
	
	.data {padding-left: 2%;}        
	
	.bordernone {border: none;}
	
	.h2class {color: blue;}
	
	h2 {color: red;}
	
	table {width: 52%;
		   border: 1px solid red;
	       border-collapse: collapse;
	       border: none; 
	       }
	
	td {border: 1px solid gray;
	    border-collapse: collapse; 
	    padding: 1%;}
	       	   
	tr {line-height: 200%;} 
	
	input {line-height: 150%;} 
	
	body > div > table > tbody > tr:nth-child(8) > td > button {
		width: 60px;
	    height: 30px;
	    font-size: 12pt;
	    font-weight: bold; 
	    margin-top: 5%;
	    cursor: pointer;}

정리

  • 14_daum-address_search
    -> daum_address_search.html, daum_address_search.js, daum_address_search.css

0개의 댓글

관련 채용 정보