[JavaScript] 자바스크립트 기초 배우기 ②
by 효기’s
사이트 제목 변경하기
<!-- 제목 바꾸기 -->
<html>
<head>
<title>제목바꾸기</title>
<script language ="javascript">
var title = window.prompt("제목을 입력하세요.", "");
document.title = title;
</script>
</head>
</html>
배경색 변경하기
<!-- 배경색 바꾸기 -->
<html>
<head>
<title>배경색 바꾸기</title>
<script language ="javascript">
function changeBg(color){
document.bgColor = color;
}
</script>
</head>
<body>
<input type="radio" name="bgColor" value="lightyellow" onclick="changeBg(this.value)">노란색<br>
<input type="radio" name="bgColor" value="lightgreen" onclick="changeBg(this.value)">녹색<br>
<input type="radio" name="bgColor" value="lightblue" onclick="changeBg(this.value)">파란색<br>
<input type="radio" name="bgColor" value="red" onclick="changeBg(this.value)">빨간색<br>
</body>
</html>
getElementById, getElementsByname, getElementsByTagName
getElementById → html태그의 id 특정값을 이용하여 객체를 찾는다.
getElementsByname → name 특성값을 이용하여 객체를 찾는다.
getElementsByTagName → 태그 이름으로 객체를 찾는다.
<!--
getElementById html태그의 id 특정값을 이용하여 객체를 찾는다.
getElementsByname name 특성값을 이용하여 객체를 찾는다.
getElementsByTagName 태그 이름으로 객체를 찾는다.
-->
<html>
<head>
<title>배경색 바꾸기</title>
<script language ="javascript">
function sayHello(){
var textBox = document.getElementById("name");
if(textBox != null){
alert(textBox.value + "님 안녕하세요!");
}
}
</script>
</head>
<body>
<input type="text" name="text" id="name">
<button type="button" value="인사하기" onclick="sayHello()">인사하기</button>
</body>
</html>
getElementsByName 메서드로 객체 찾기
<!--getElementsByName 메서드로 객체 찾기 -->
<html>
<head>
<title>제일 좋아하는 과목은</title>
<script language ="javascript">
function submit(){
var textBox = document.getElementsByName("text");
for(var i = 0; i < textBox.length; i++){
if(textBox[i].checked){
alert(textBox[i].value + "과목을 좋아하시는군요!");
break;
}
}
}
</script>
</head>
<body>
<h2>제일 좋아하는 과목은?</h2>
<input type="checkbox" name="text" value="HTML">HTML<br>
<input type="checkbox" name="text" value="CSS">CSS<br>
<input type="checkbox" name="text" value="javascript">자바스크립트<br>
<input type="button" value="답안지 제출" onclick="submit()">
</body>
</html>
getElementsByTagName 메서드로 객체 찾기
<!-- getElementsByTagName 메서드로 객체 찾기 -->
<html>
<head>
<title>제일 좋아하는 과목은</title>
<script language ="javascript">
function submit(){
var textBox = document.getElementsByTagName("input");
for(var i = 0; i < textBox.length; i++){
if(textBox[i].type == "checkbox" && textBox[i].checked){
alert(textBox[i].value + "과목을 좋아하시는군요!");
break;
}
}
}
</script>
</head>
<body>
<h2>제일 좋아하는 과목은?</h2>
<input type="checkbox" name="text" value="HTML">HTML<br>
<input type="checkbox" name="text" value="CSS">CSS<br>
<input type="checkbox" name="text" value="javascript">자바스크립트<br>
<input type="button" value="답안지 제출" onclick="submit()">
</body>
</html>
createElement과 appendChild 사용하기
<!-- createElement과 appendChild 사용하기-->
<html>
<head>
<title>동적으로 테이블 만들기</title>
<script>
function makeFriends() {
var myFriends = window.prompt("친구가 몇 명 ?", "");
for (var i = 0; i < parseInt(myFriends); i++) {
var textBox = document.createElement("input");
var newLine = document.createElement("br");
textBox.type = "text";
document.body.appendChild(textBox);
document.body.appendChild(newLine);
}
}
</script>
</head>
<body onload="makeFriends()">
<h2>내 친구 나열</h2>
</body>
</html>
덧셈
<!-- 덧셈 -->
<html>
<head>
<title>내 친구 나열하기</title>
<script language="javascript">
function add() {
let num1 = document.getElementById("num1").value;
let num2 = document.getElementById("num2").value;
let result = parseInt(num1) + parseInt(num2);
document.getElementById("result").value = result;
}
</script>
</head>
<body onload="makeFriends()">
<input name="add" id="num1"> +
<input name="add" id="num2">
<input type="button" name="add" value="=" onclick="add()">
<input name="add" id="result">
</body>
</html>
리스트 제어하기
<!-- 리스트 제어하기 -->
<html>
<head>
<title>내 친구 나열하기</title>
<script language="javascript">
let arrayWindowVersion = new Array();
let arrayOfficeVersion = new Array();
arrayWindowVersion.push("윈도우 2000");
arrayWindowVersion.push("윈도우 XP");
arrayWindowVersion.push("윈도우 비스타");
arrayOfficeVersion.push("오피스 xp");
arrayOfficeVersion.push("오피스 2003");
arrayOfficeVersion.push("오피스 2007");
function setVersion(){
let objProduct = document.getElementById("product");
let objVersion = document.getElementById("version");
let selectedValue = objProduct.options[objProduct.selectedIndex].value;
while(objVersion.options.length > 1){
objVersion.options[1] = null;
}
switch(selectedValue){
case "Windows":
for(var i = 0; i < arrayWindowVersion.length; i++){
objVersion.options[objVersion.options.length] =
new Option(arrayWindowVersion[i], arrayWindowVersion[i]);
new Option(arrayWindowVersion[i], arrayWindowVersion[i]);
}
break;
case "Office":
for(var i = 0; i < arrayOfficeVersion.length; i++){
objVersion.options[objVersion.options.length] =
new Option(arrayOfficeVersion[i], arrayOfficeVersion[i]);
new Option(arrayOfficeVersion[i], arrayOfficeVersion[i]);
}
}
}
</script>
</head>
<body onload="makeFriends()" onchange="setVersion()">
<select id="product">
<option value="제품을 선택하세요.">제품을 선택하세요.</option>
<option value="Windows">윈도우</option>
<option value="Office">오피스</option>
</select>
<select id="version">
<option value="버전을 선택하세요.">버전을 선택하세요.</option>
</select>
</body>
</html>
시계
<!-- 시계 -->
<html>
<head>
<style>
#divClock{
font-size: 50;
font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
color: aquamarine;
}
</style>
<script>
function showClock(){
let currentDate = new Date();
let divClock = document.getElementById("divClock");
let hours = currentDate.getHours();
let ampm = hours >= 12 ? '오후' : '오전';
if (hours > 12) {
hours -= 12;
} else if (hours === 0) {
hours = 12;
}
let msg = "현재 시간: " + ampm + " " + currentDate.getHours() + "시 "
msg += currentDate.getMinutes() + "분 ";
msg += currentDate.getSeconds() + "초 ";
divClock.innerText = msg;
setTimeout(showClock, 1000);
}
</script>
</head>
<body onload="showClock()">
<div id="divClock" class="clock"></div>
</body>
</html>
접속시간 표시하기
<!-- 접속시간 표시하기 -->
<html>
<head>
<title>접속시간 표시하기</title>
<style>
.clock{
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
font-size: 24pt;
color: aqua;
}
</style>
<script>
let connectedDate = new Date;
function showElapsedTime(){
let divClock = document.getElementById("divClock");
let currentDate = new Date();
let result = Math.ceil((currentDate - connectedDate) / 1000);
divClock.innerText = "이 페이지에 접속 후 " + result;
divClock.innerText += "초가 지났습니다.";
setTimeout(showElapsedTime, 1000);
}
</script>
</head>
<body onload="showElapsedTime()">
<div id="divClock" class="clock"></div>
</body>
</html>
글자 하나씩만 나오게하기
<!-- 글자 하나씩만 나오게하기 -->
<html>
<head>
<script>
let text = "안녕하세요? 만나서 반갑습니다.";
let index = 0;
let intervalId;
function showText() {
let divText = document.getElementById("divText");
if (index < text.length) { // 인덱스가 text 길이보다 작아야 출력
divText.innerHTML += text[index];
index++;
} else {
divText.innerHTML = ' ';
index = 0; // 초기화하면서 반복
}
}
window.onload = function () {
intervalId = setInterval(showText, 500); // 애니매이션 같이 반복해서 실행하는 함수의 지연설정
}
</script>
<style>
#divText {
color: aqua;
font-size: 50pt;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
</style>
</head>
<body>
<div id="divText"></div>
</body>
</html>
방문할 때마다 변하는 이미지
<!-- 방문할 때마다 변하는 이미지 -->
<html>
<head>
<title>방문할 때마다 변하는 이미지</title>
</head>
<script>
let imgArray = new Array();
imgArray[0] = "1.jpg";
imgArray[1] = "2.jpg";
imgArray[2] = "3.jpg";
imgArray[3] = "4.jpg";
imgArray[4] = "5.jpg";
function show(){
let imgNum = Math.round(Math.random() * 5);
let objImg = document.getElementById("introImg");
objImg.src = imgArray[imgNum];
}
</script>
<body onload="show()">
<img id="introImg" border="0">
</body>
</html>
실습
<html>
<head>
<style>
#divText{
font-family:Arial, Helvetica, sans-serif
}
</style>
<script>
function nameshow(){
let divText = document.getElementById("divText")
let inputText = document.querySelector("input[type='text']");
let colorSelect = document.querySelector("select[name='color']");
let sizeSelect = document.querySelector("select[name='size']");
let lineCheckbox = document.querySelector("input[value='취소선']");
let bigCheckbox = document.querySelector("input[value='크게']");
let smallCheckbox = document.querySelector("input[value='작게']");
let thickCheckbox = document.querySelector("input[value='두껍게']");
let gtCheckbox = document.querySelector("input[value='기울임']");
let supCheckbox = document.querySelector("input[value='위첨자']");
let subCheckbox = document.querySelector("input[value='아래첨자']");
let lowerCheckbox = document.querySelector("input[value='소문자로']");
let upperCheckbox = document.querySelector("input[value='대문자로']");
divText.innerText = inputText.value;
divText.style.color = colorSelect.value;
if(lineCheckbox.checked){
divText.style.textDecoration = "line-through";
}else{
divText.style.textDecoration="none"
}
if (bigCheckbox.checked) {
divText.style.fontSize = "500pt"; // example size for big text
} else if (smallCheckbox.checked) {
divText.style.fontSize = "10pt"; // example size for small text
} else {
divText.style.fontSize = sizeSelect.value + 'pt'; // revert to selected size if not checked
}
if(thickCheckbox.checked){
divText.style.fontWeight = "bold";
}else{
divText.style.fontWeight="normal";
}
if(gtCheckbox.checked){
divText.style.fontStyle = "italic";
}else{
divText.style.fontStyle="none"
}
if (supCheckbox.checked) {
divText.innerHTML = '<sup>' + divText.innerText + '</sup>';
}
if (subCheckbox.checked) {
divText.innerHTML = '<sub>' + divText.innerText + '</sub>';
}
if(lowerCheckbox.checked){
divText.innerText = divText.innerText.toLowerCase();
}
if(upperCheckbox.checked){
divText.innerText = divText.innerText.toUpperCase();
}
}
</script>
</head>
<body onload="nameshow()">
<input type="text">
<input type="button" value="미리 보기" onclick="nameshow()"><br>
색상:
<select name="color">
<option value="blue">파랑</option>
<option value="red">빨강</option>
<option value="green">초록색</option>
</select>
<br>
크기:
<select name="size">
<option value="50">50</option>
<option value="100">100</option>
<option value="150">150</option>
</select>
<br>
<input type="checkbox" value="취소선">취소선
<input type="checkbox" value="크게">크게
<input type="checkbox" value="작게">작게
<input type="checkbox" value="두껍게">두껍게
<input type="checkbox" value="기울임">기울임
<br>
<input type="checkbox" value="위첨자">위첨자
<input type="checkbox" value="아래첨자">아래첨자
<input type="checkbox" value="소문자로">소문자로
<input type="checkbox" value="대문자로">대문자로
<div id="divText"></div>
</body>
</html>
회원가입 페이지 만들기
day03_index.html
<!DOCTYPE html>
<html>
<head>
<title>회원 가입 페이지</title>
<style>
table,
th,
td {
border: 1px solid black;
border-collapse: collapse;
border-color: #baebff;
}
</style>
<script>
function execDaumPostcode() {
new daum.Postcode({
oncomplete: function (data) {
document.getElementById('zip-code').value = data.zonecode;
document.getElementById('address-1').value = data.address;
document.getElementById('address-1-1').value = data.jibunAddress;
document.getElementById('address-2').focus();
}
}).open();
}
</script>
</head>
<body>
<script src="day03_index.js"></script>
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<form onsubmit="return isThatRight()">
<table width="650" height="500" border="1" align="center" name="table">
<tr>
<td align="center" bgcolor="#baebff" colspan="2">회원 기본 정보</b></td>
</tr>
<tr>
<td align="center"><b>아이디:</b> </td>
<td><input type="text" id="id" maxlength="12" minlength="4"> 4~12자의 영문 대소문자와 숫자로만 입력</td>
</tr>
<tr>
<td align="center"><b>비밀번호: </b></td>
<td><input type="password" id="pw" maxlength="12" minlength="4"> 4~12자의 영문 대소문자와 숫자로만 입력</td>
</tr>
<tr>
<td align="center"><b>비밀번호 확인: </b></td>
<td><input type="password" id="pwCheck"></td>
</tr>
<tr>
<td align="center"><b>메일주소: </b></td>
<td><input type="email" id="email"> 예) id@domain.com</td>
</tr>
<tr>
<td align="center"><b>이름: </b></td>
<td><input type="text" id="name"></td>
</tr>
<tr>
<td align="center"><b>주소: </b></td>
<td>
<input type="text" id="zip-code" placeholder="우편번호" readonly>
<input type="button" onclick="execDaumPostcode()" value="주소찾기"><br>
<input type="text" id="address-1" placeholder="도로명주소" size="30" readonly>
<input type="text" id="address-1-1" placeholder="지번주소" size="30" readonly><br>
<input type="text" id="address-2" placeholder="상세주소" size="30">
</td>
</tr>
<tr>
<td align="center" bgcolor="#baebff" colspan="2">개인 신상 정보</td>
</tr>
<tr>
<td align="center"><b>주민등록번호: </b></td>
<td><input type="text" id="RRN"> 예) 1234561234567</td>
</tr>
<tr>
<td align="center"><b>생일: </b></td>
<td>
<input size="4" id="year">년
<select type="month" id="month">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
<option>9</option>
<option>10</option>
<option>11</option>
<option>12</option>
</select>
월
<select id="day">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
<option>9</option>
<option>10</option>
<option>11</option>
<option>12</option>
<option>13</option>
<option>14</option>
<option>15</option>
<option>16</option>
<option>17</option>
<option>18</option>
<option>19</option>
<option>20</option>
<option>21</option>
<option>22</option>
<option>23</option>
<option>24</option>
<option>25</option>
<option>26</option>
<option>27</option>
<option>28</option>
<option>29</option>
<option>30</option>
<option>31</option>
</select>
일
</td>
</tr>
<tr>
<td align="center"><b>관심분야: </b></td>
<td>
<input type="checkbox" name="관심분야">컴퓨터
<input type="checkbox" name="관심분야">인터넷
<input type="checkbox" name="관심분야">여행
<input type="checkbox" name="관심분야">영화감상
<input type="checkbox" name="관심분야">음악감상
</td>
</tr>
<tr>
<td align="center" height="300"><b>자기소개: </b></td>
<td><textarea id="intro" name="intro" rows="10" cols="50"></textarea></td>
</tr>
</table>
<br>
<div align="center">
<input type="submit" value="회원가입">
<input type="reset" value="다시입력" align="center">
</div>
</form>
</body>
</html>
day03_index.js
function isValidId(id) {
// 아이디의 길이가 4에서 12 사이인지 확인
if (id.length < 4 || id.length > 12) {
return false;
}
// 모든 문자가 알파벳 대소문자 또는 숫자인지 확인
for (let i = 0; i < id.length; i++) {
let char = id[i];
if (!(char >= 'a' && char <= 'z') && !(char >= 'A' && char <= 'Z') && !(char >= '0' && char <= '9')) {
return false;
}
}
// 위의 조건들을 모두 만족하면 유효한 아이디로 판단
return true;
}
function isValidPw(pw) {
// 아이디의 길이가 4에서 12 사이인지 확인
if (pw.length < 4 || pw.length > 12) {
return false;
}
// 모든 문자가 알파벳 대소문자 또는 숫자인지 확인
for (let i = 0; i < pw.length; i++) {
let char = pw[i];
if (!(char >= 'a' && char <= 'z') && !(char >= 'A' && char <= 'Z') && !(char >= '0' && char <= '9')) {
return false;
}
}
// 위의 조건들을 모두 만족하면 유효한 아이디로 판단
return true;
}
function isValidName(name) {
// 이름의 길이가 2에서 4 사이인지 확인
if (name.length < 2 || name.length > 4) {
return false;
}
// 모든 문자가 한글인지 확인
for (let i = 0; i < name.length; i++) {
let charCode = name.charCodeAt(i);
if (!(charCode >= 0xAC00 && charCode <= 0xD7A3)) { // '가'와 '힣'의 유니코드 범위
return false;
}
}
// 위의 조건들을 모두 만족하면 유효한 이름으로 판단
return true;
}
function isValidEmail(email) {
// '@' 기호를 기준으로 분리
let parts = email.split('@');
// '@'가 하나만 있는지, 그리고 아이디와 도메인 부분이 존재하는지 확인
if (parts.length !== 2 || parts[0] === '' || parts[1] === '') {
return false;
}
// 도메인 부분을 '.'으로 분리
let domainParts = parts[1].split('.');
// '.'가 적어도 하나 있으며, 마지막 도메인 부분이 1~3글자인지 확인
if (domainParts.length < 2 || domainParts[domainParts.length - 1].length < 1 || domainParts[domainParts.length - 1].length > 3) {
return false;
}
// 위의 조건들을 모두 만족하면 유효한 이메일로 판단
return true;
}
function isThatRight(){
//id 유효성 검사
const inputId = document.getElementById("id");
if (inputId.value == "") {
alert("아이디를 입력하세요.");
inputId.focus();
return false;
} else if (!isValidId(inputId.value)) {
alert("아이디는 영문 대소문자와 숫자 4~12자리로 입력해야 합니다!");
inputId.value = "";
inputId.focus();
return false;
}
//pw 유효성 검사
const inputPw = document.getElementById("pw");
if (inputPw.value == "") {
alert("비밀번호를 입력하세요.");
inputPw.focus();
return false;
} else if (!isValidPw(inputPw.value)) {
alert("비밀번호는 영문 대소문자와 숫자 4~12자리로 입력해야 합니다!");
inputPw.value = "";
inputPw.focus();
return false;
}
//pwCheck 유효성 검사
const inputPwCheck = document.getElementById("pwCheck");
if (inputPw.value !== inputPwCheck.value) {
alert("비밀번호와 비밀번호 확인이 일치하지 않습니다.");
inputPwCheck.value = "";
inputPwCheck.focus();
return false;
}
//이름 유효성 검사
const inputName = document.getElementById("name");
if (inputName.value == "") {
alert("이름을 입력하세요.");
inputName.value = "";
inputName.focus();
return false;
} else if (!isValidName(inputName.value)) {
alert("이름이 올바르지 않습니다.");
inputName.value = "";
inputName.focus();
return false;
}
const inputAdress1 = document.getElementById("zip-code");
if (inputAdress1.value == "") {
alert("우편번호를 입력하세요.");
inputAdress1.value = "";
inputAdress1.focus();
return false;
}
const inputAdress2 = document.getElementById("address-2");
if (inputAdress2.value == "") {
alert("상세주소를 입력하세요.");
inputAdress2.value = "";
inputAdress2.focus();
return false;
}
// 주민등록번호
const userInfo = document.getElementById("RRN");
// 아무것도 입력하지 않았을때
if (userInfo.value == "") {
alert("주민번호를 입력하세요.");
userInfo.focus();
return false;
};
// 주민번호 13자리인지 확인한다.
if (userInfo.value.length != 13) {
alert("주민번호가 올바르지 않습니다.");
return false;
}
let sum = 0;
const weights = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5];
// 마지막 자리 제외하고 반복
for (let i = 0; i < userInfo.value.length - 1; i++) {
// 숫자인지 확인
if (userInfo.value.charAt(i) < '0' || userInfo.value.charAt(i) > '9') {
alert("주민번호가 올바르지 않습니다.");
return false;
}
// 각 자리수에 가중치 곱해서 합산
sum += parseInt(userInfo.value.charAt(i)) * weights[i];
}
sum = (11 - (sum % 11)) % 10; // %10으로 한자리 체크 디지트를 만듬
// 체크디지트랑 주민번호 끝자리랑 비교
if (sum !== parseInt(userInfo.value.charAt(12))) {
alert("주민번호가 올바르지 않습니다.");
return false;
}
// 생년월일 검사 및 자동입력
const yearcheck = document.getElementById("year");
const monthcheck = document.getElementById("month");
const daycheck = document.getElementById("day");
// 앞에 숫자가 19인경우 1, 2
let birthYearPrefix = "19";
// 앞에 숫자가 20인경우 3, 4
if(parseInt(userInfo.value.charAt(6)) > 2){
birthYearPrefix="20";
}
yearcheck.value = birthYearPrefix + userInfo.value.substring(0, 2);
if(userInfo.value.substring(2, 3) == 0){
monthcheck.value = userInfo.value.substring(3 ,4);
}
else{
monthcheck.value = userInfo.value.substring(2 ,4);
}
if(userInfo.value.substring(4, 5) == 0){
daycheck.value = userInfo.value.substring(5 ,6);
}
else{
daycheck.value = userInfo.value.substring(4 ,6);
}
//이메일 유효성 검사
const inputEmail = document.getElementById("email");
if (inputEmail.value == "") {
alert("이메일을 입력하세요.");
inputEmail.focus();
return false;
} else if (!isValidEmail(inputEmail.value)) {
alert("이메일이 올바르지 않습니다.");
inputEmail.value = "";
inputEmail.focus();
return false;
}
//자기소개 유효성 검사
const inputIntro = document.getElementById("intro");
if (inputIntro.value == "") {
alert("자기소개를 입력하세요.");
inputIntro.focus();
return false;
} else if (!(inputIntro.value.length >= 10 && inputIntro.value.length <= 300)) {
alert("자기소개는 10자 이상 300자 이하로 입력해야 합니다.");
inputIntro.focus();
return false;
}
let checkboxes = document.querySelectorAll('input[type="checkbox"][name="관심분야"]');
let checkedOne = Array.prototype.slice.call(checkboxes).some(x => x.checked);
if (!checkedOne) {
alert("적어도 하나 이상의 관심 분야를 선택해주세요.");
return false;
}
}
유효성 검사를 적용한 회원가입 페이지 만들기
index.html (일반 표현식)
<!DOCTYPE html>
<html>
<head>
<title>회원 가입 페이지</title>
<style>
table,
th,
td {
border: 1px solid black;
border-collapse: collapse;
border-color: #baebff;
}
</style>
<script>
function execDaumPostcode() {
new daum.Postcode({
oncomplete: function (data) {
document.getElementById('zip-code').value = data.zonecode;
document.getElementById('address-1').value = data.address;
document.getElementById('address-1-1').value = data.jibunAddress;
document.getElementById('address-2').focus();
}
}).open();
}
</script>
</head>
<body>
<script src="index.js"></script>
<script action="mailto:gmldus0814@naver.com?subject=안녕하세요"
src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<form onsubmit="return isThatRight()">
<table width="650" height="500" border="1" align="center" name="table">
<tr>
<td align="center" bgcolor="#baebff" colspan="2">회원 기본 정보</b></td>
</tr>
<tr>
<td align="center"><b>아이디:</b> </td>
<td><input type="text" id="id" maxlength="12" minlength="4"> 4~12자의 영문 대소문자와 숫자로만 입력</td>
</tr>
<tr>
<td align="center"><b>비밀번호: </b></td>
<td><input type="password" id="pw" maxlength="12" minlength="4"> 4~12자의 영문 대소문자와 숫자로만 입력</td>
</tr>
<tr>
<td align="center"><b>비밀번호 확인: </b></td>
<td><input type="password" id="pwCheck"></td>
</tr>
<tr>
<td align="center"><b>메일주소: </b></td>
<td><input type="email" id="email"> 예) id@domain.com</td>
</tr>
<tr>
<td align="center"><b>이름: </b></td>
<td><input type="text" id="name"></td>
</tr>
<tr>
<td align="center"><b>주소: </b></td>
<td>
<input type="text" id="zip-code" placeholder="우편번호" readonly>
<input type="button" onclick="execDaumPostcode()" value="주소찾기"><br>
<input type="text" id="address-1" placeholder="도로명주소" size="30" readonly>
<input type="text" id="address-1-1" placeholder="지번주소" size="30" readonly><br>
<input type="text" id="address-2" placeholder="상세주소" size="30">
</td>
</tr>
<tr>
<td align="center" bgcolor="#baebff" colspan="2">개인 신상 정보</td>
</tr>
<tr>
<td align="center"><b>주민등록번호: </b></td>
<td><input type="text" id="RRN"> 예) 1234561234567</td>
</tr>
<tr>
<td align="center"><b>생일: </b></td>
<td>
<input size="4" id="year">년
<select type="month" id="month">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
<option>9</option>
<option>10</option>
<option>11</option>
<option>12</option>
</select>
월<select id="day">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
<option>9</option>
<option>10</option>
<option>11</option>
<option>12</option>
<option>13</option>
<option>14</option>
<option>15</option>
<option>16</option>
<option>17</option>
<option>18</option>
<option>19</option>
<option>20</option>
<option>21</option>
<option>22</option>
<option>23</option>
<option>24</option>
<option>25</option>
<option>26</option>
<option>27</option>
<option>28</option>
<option>29</option>
<option>30</option>
<option>31</option>
</select>
일
</td>
</tr>
<tr>
<td align="center"><b>관심분야: </b></td>
<td>
<input type="checkbox" name="관심분야">컴퓨터
<input type="checkbox" name="관심분야">인터넷
<input type="checkbox" name="관심분야">여행
<input type="checkbox" name="관심분야">영화감상
<input type="checkbox" name="관심분야">음악감상
</td>
</tr>
<tr>
<td align="center" height="300"><b>자기소개: </b></td>
<td><textarea id="intro" name="intro" rows="10" cols="50"></textarea></td>
</tr>
</table>
<br>
<div align="center">
<input type="submit" value="회원가입">
<input type="reset" value="다시입력" align="center">
</div>
</form>
</body>
</html>
index.js (일반표현식)
// 유효성 검사를 함수로 정의
function isValidId(id) {
// 아이디의 길이가 4에서 12 사이인지 확인
if (id.length < 4 || id.length > 12) { // 아이디 길이가 4 이하거나 12 이상일때 false
return false;
}
// 모든 문자가 알파벳 대소문자 또는 숫자인지 확인
for (let i = 0; i < id.length; i++) {
let char = id[i]; // 인덱스 i에 해당하는 문자를 char에 할당하고
if (!(char >= 'a' && char <= 'z') && !(char >= 'A' && char <= 'Z') && !(char >= '0' && char <= '9')) {
// 대소문자, 숫자가 아니면 false를 합니다.
return false;
}
}
// 위의 조건들을 모두 만족하면 유효한 아이디로 판단
return true;
}
function isValidPw(pw) {
// 같은 방식으로 아이디의 길이가 4에서 12 사이인지 확인
if (pw.length < 4 || pw.length > 12) {
return false;
}
// 모든 문자가 알파벳 대소문자 또는 숫자인지 확인
for (let i = 0; i < pw.length; i++) {
let char = pw[i];
if (!(char >= 'a' && char <= 'z') && !(char >= 'A' && char <= 'Z') && !(char >= '0' && char <= '9')) {
return false;
}
}
// 위의 조건들을 모두 만족하면 유효한 아이디로 판단
return true;
}
function isValidName(name) {
// 이름의 길이가 2에서 4 사이인지 확인
if (name.length < 2 || name.length > 4) {
return false;
}
// 모든 문자가 한글인지 확인
for (let i = 0; i < name.length; i++) {
let charCode = name.charCodeAt(i); // name에 있는 문자의 유니코드 값을 charCode 변수에 넣습니다.
if (!(charCode >= 0xAC00 && charCode <= 0xD7A3)) { // '가'와 '힣'의 유니코드 범위를통해 문자가 한글인지 확인합니다.
return false;
}
}
// 위의 조건들을 모두 만족하면 유효한 이름으로 판단
return true;
}
function isValidEmail(email) {
// '@' 기호를 기준으로 분리해서 parts 변수에 넣습니다.
let parts = email.split('@');
// '@'가 하나만 있는지, 그리고 아이디와 도메인 부분이 존재하는지 확인
// parts[0]부분이 아이디부분이고 parts[1]부분이 도메인 부분입니다.
if (parts.length !== 2 || parts[0] === '' || parts[1] === '') {
return false;
}
// 도메인 부분을 '.'으로 분리
let domainParts = parts[1].split('.');
// '.'가 적어도 하나 있으며, 마지막 도메인 부분이 비어있지 않은지 확인
if (domainParts.length < 2 || domainParts[domainParts.length - 1] === '') {
return false;
}
// 위의 조건들을 모두 만족하면 유효한 이메일로 판단
return true;
}
function isThatRight() {
//id 유효성 검사
const inputId = document.getElementById("id"); // 아이디를 가져와서 inputId 변수에 넣고
if (inputId.value == "") { // id 텍스트가 비어있으면
alert("아이디를 입력하세요."); // 아이디 입력 경고창 팝업
inputId.focus();
return false;
} else if (!isValidId(inputId.value)) { // 아이디 유효성 검사 함수가 아닌경우
alert("아이디는 영문 대소문자와 숫자 4~12자리로 입력해야 합니다!"); // 경고창 팝업
inputId.value = ""; // 텍스트 비움
inputId.focus(); // 입력 필드에 자동으로 포커스 이동
return false;
}
//pw 유효성 검사
const inputPw = document.getElementById("pw"); // pw 아이디를 가져와서 inputpw 변수에 넣고
if (inputPw.value == "") { // 비밀번호가 비어있을경우
alert("비밀번호를 입력하세요."); // 경고창 팝업
inputPw.focus();
return false;
} else if (!isValidPw(inputPw.value)) { // 비밀번호 유효성 검사 함수가 아닌경우
alert("비밀번호는 영문 대소문자와 숫자 4~12자리로 입력해야 합니다!"); // 경고창 팝업
inputPw.value = ""; // 텍스트 비움
inputPw.focus(); // 입력 필드에 자동으로 포커스 이동
return false;
}
if (inputId.value === inputPw.value) { // 텍스트에 아이디와 비밀번호가 같은경우
alert("아이디와 비밀번호가 같을 수 없습니다."); // 경고창 팝업
inputPw.value = ""; // 텍스트 비움
inputPw.focus(); // 입력 필드에 자동으로 포커스 이동
return false;
}
//pwCheck 유효성 검사
const inputPwCheck = document.getElementById("pwCheck"); // pwCheck 아이디로 내용을 가져와서 inputPwcheck 변수에 넣습니다.
if (inputPw.value !== inputPwCheck.value) { // 일치여부를 확인하고 경고창을 띄웁니다.
alert("비밀번호와 비밀번호 확인이 일치하지 않습니다.");
inputPwCheck.value = ""; // 일치하지 않으면 비밀번호 확인 내용을 지웁니다.
inputPwCheck.focus(); // 입력 필드에 자동으로 포커스 이동
return false;
}
//이메일 유효성 검사
const inputEmail = document.getElementById("email"); // email 아이디로 내용을 가져와서 inputEmail 변수에 넣습니다.
if (inputEmail.value == "") { // 이메일 칸에 비어 있을 경우
alert("이메일을 입력하세요."); // 경고창 팝업
inputEmail.focus(); // 입력 필드에 자동으로 포커스 이동
return false;
} else if (!isValidEmail(inputEmail.value)) { // 이메일 유효성 검사에서 아닌경우
alert("이메일이 올바르지 않습니다."); // 경고창 팝업
inputEmail.value = ""; // 텍스트 비움
inputEmail.focus(); // 입력 필드에 자동으로 포커스 이동
return false;
}
//이름 유효성 검사
const inputName = document.getElementById("name"); // name 아이디로 내용을 가져와서 inputName 변수에 넣습니다.
if (inputName.value == "") { // 이름 칸에 비어 있을 경우
alert("이름을 입력하세요."); // 경고창 팝업
inputName.value = ""; // 텍스트 비움
inputName.focus(); // 입력 필드에 자동으로 포커스 이동
return false;
} else if (!isValidName(inputName.value)) { // 이름 유효성 검사에서 아닌경우
alert("이름이 올바르지 않습니다."); // 경고창 팝업
inputName.value = ""; // 텍스트 비움
inputName.focus(); // 입력 필드에 자동으로 포커스 이동
return false;
}
const inputAdress1 = document.getElementById("zip-code"); // zip-code 아이디로 내용을 가져와서 inputAdress1 변수에 넣습니다.
if (inputAdress1.value == "") { // 우편변호 칸에 비어 있을 경우
alert("우편번호를 입력하세요."); // 경고창 팝업
inputAdress1.value = ""; // 텍스트 비움
inputAdress1.focus(); // 입력 필드에 자동으로 포커스 이동
return false;
}
const inputAdress2 = document.getElementById("address-2"); // address-2 아이디로 내용을 가져와서 inputAdress2 변수에 넣습니다.
if (inputAdress2.value == "") { // 상세주소 칸에 비어 있을 경우
alert("상세주소를 입력하세요."); // 경고창 팝업
inputAdress2.value = ""; // 텍스트 비움
inputAdress2.focus(); // 입력 필드에 자동으로 포커스
return false;
}
// 주민등록번호
const userInfo = document.getElementById("RRN"); // RRN 아이디로 내용을 가져와서 userInfo 변수에 넣습니다.
if (userInfo.value == "") { // 아무것도 입력하지 않았을때
alert("주민번호를 입력하세요."); // 경고창 팝업
userInfo.focus();
return false; // 입력 필드에 자동으로 포커스 이동
};
// 주민번호 13자리인지 확인한다.
if (userInfo.value.length != 13) {
alert("주민번호가 올바르지 않습니다."); // 경고창 팝업
return false;
}
let sum = 0;
const weights = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5]; // weights 변수에 값을 입력
// 마지막 자리 제외하고 반복
for (let i = 0; i < userInfo.value.length - 1; i++) {
// 숫자인지 확인
if (userInfo.value.charAt(i) < '0' || userInfo.value.charAt(i) > '9') {
alert("주민번호가 올바르지 않습니다."); // 경고창 팝업
return false;
}
// 각 자리수에 가중치 weights를 각각 곱해서 합산
sum += parseInt(userInfo.value.charAt(i)) * weights[i];
}
sum = (11 - (sum % 11)) % 10; // 합을 11로 나눈 나머지값에 11을빼고 10나머지로 한자리수 체크 디지트를 만듬
// 체크디지트랑 주민번호 끝자리랑 비교
if (sum !== parseInt(userInfo.value.charAt(12))) {
alert("주민번호가 올바르지 않습니다."); // 경고창 팝업
return false;
}
// 생년월일 검사 및 자동입력
// 각각 년 월 일별로 아이디를 가져옵니다.
const yearcheck = document.getElementById("year");
const monthcheck = document.getElementById("month");
const daycheck = document.getElementById("day");
// 19년도는 남자가 1, 여자가2이고 20년도에는 2보다 이상입니다.
let birthYearPrefix = "19";
if (parseInt(userInfo.value.charAt(6)) > 2) {
birthYearPrefix = "20";
}
// birthYearPrefix와 문자열 처음 두글자를 합쳐서 yearcheck 값으로 설정
yearcheck.value = birthYearPrefix + userInfo.value.substring(0, 2);
// userInfo의 세번째 글자가 0이면
if (userInfo.value.substring(2, 3) === 0) {
monthcheck.value = userInfo.value.substring(3, 4); // 4번째 글자를 가져와서 monthcheck에 설정
}
else { // 아닐경우
monthcheck.value = userInfo.value.substring(2, 4); // 3번째와 4번째 글자를 가져와서 설정한다.
} // 0으로 시작하는 사람과 1로 시작하는 사람을 구분하기 위함이다.
// 일도 같은 방식으로 설정한다.
if (userInfo.value.substring(4, 5) === 0) { // 4번째 글자가 0이면
daycheck.value = userInfo.value.substring(5, 6); //5번째 글자를 가져와서 day에 설정
}
else { // 또는
daycheck.value = userInfo.value.substring(4, 6); // 5번째와 6번째 글자를 가져와서 설정.
}
// 관심분야라는 이름을 가진 체크박스 요소를 선택한다.
let checkboxes = document.querySelectorAll('input[type="checkbox"][name="관심분야"]');
// 선택된 체크박스 중 최소 하나 이상 선택되어 있는지 확인
let checkedOne = Array.prototype.slice.call(checkboxes).some(x => x.checked);
if (!checkedOne) { // 최소 하나 이상 선택되어있지 않다면
alert("적어도 하나 이상의 관심 분야를 선택해주세요."); // 경고창 팝업
return false;
}
//자기소개 유효성 검사
const inputIntro = document.getElementById("intro"); // intro 아이디를 가져와서 inputIntro 변수에 설정한다.
if (inputIntro.value == "") { // 비어있을경우
alert("자기소개를 입력하세요."); // 경고창 팝업
inputIntro.focus(); // 입력 필드에 자동으로 포커스 이동
return false;
// 10 이상 300 이하로 입력이 되지 않았을때
} else if (!(inputIntro.value.length >= 10 && inputIntro.value.length <= 300)) {
alert("자기소개는 10자 이상 300자 이하로 입력해야 합니다."); // 경고창 팝업
inputIntro.focus(); // 입력 필드에 자동으로 포커스 이동
return false;
}
alert("회원가입이 완료되었습니다."); // 마무리 경고창
}
정규표현식 index.html
<!DOCTYPE html>
<html>
<head>
<title>회원 가입 페이지</title>
<style>
table,
th,
td {
border: 1px solid black;
border-collapse: collapse;
border-color: #baebff;
}
</style>
</head>
<body>
<script src="script.js"></script>
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<form action="mailto:gmldus0814@naver.com?subject=안녕하세요" onsubmit="return validateform();">
<table width="650" height="500" border="1" align="center" name="table">
<tr>
<td align="center" bgcolor="#baebff" colspan="2">회원 기본 정보</b></td>
</tr>
<tr>
<td align="center"><b>아이디:</b> </td>
<td><input type="text" id="id" maxlength="12" minlength="4"> 4~12자의 영문 대소문자와 숫자로만 입력</td>
</tr>
<tr>
<td align="center"><b>비밀번호: </b></td>
<td><input type="password" id="pw" maxlength="12" minlength="4"> 4~12자의 영문 대소문자와 숫자로만 입력</td>
</tr>
<tr>
<td align="center"><b>비밀번호 확인: </b></td>
<td><input type="password" id="pwCheck"></td>
</tr>
<tr>
<td align="center"><b>메일주소: </b></td>
<td><input type="email" id="email"> 예) id@domain.com</td>
</tr>
<tr>
<td align="center"><b>이름: </b></td>
<td><input type="text" id="name"></td>
</tr>
<tr>
<td align="center"><b>주소: </b></td>
<td>
<input type="text" id="zip-code" placeholder="우편번호" readonly>
<input type="button" onclick="execDaumPostcode()" value="주소찾기"><br>
<input type="text" id="address-1" placeholder="도로명주소" size="30" readonly>
<input type="text" id="address-1-1" placeholder="지번주소" size="30" readonly><br>
<input type="text" id="address-2" placeholder="상세주소" size="30">
</td>
</tr>
<tr>
<td align="center" bgcolor="#baebff" colspan="2">개인 신상 정보</td>
</tr>
<tr>
<td align="center"><b>주민등록번호: </b></td>
<td><input type="text" id="RRN"> 예) 1234561234567</td>
</tr>
<tr>
<td align="center"><b>생일: </b></td>
<td>
<input type="text" size="4" id="year">년
<select type="month" id="month">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
<option>9</option>
<option>10</option>
<option>11</option>
<option>12</option>
</select>
월
<select id="day">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
<option>9</option>
<option>10</option>
<option>11</option>
<option>12</option>
<option>13</option>
<option>14</option>
<option>15</option>
<option>16</option>
<option>17</option>
<option>18</option>
<option>19</option>
<option>20</option>
<option>21</option>
<option>22</option>
<option>23</option>
<option>24</option>
<option>25</option>
<option>26</option>
<option>27</option>
<option>28</option>
<option>29</option>
<option>30</option>
<option>31</option>
</select>
일
</td>
</tr>
<tr>
<td align="center"><b>관심분야: </b></td>
<td>
<input type="checkbox" name="관심분야">컴퓨터
<input type="checkbox" name="관심분야">인터넷
<input type="checkbox" name="관심분야">여행
<input type="checkbox" name="관심분야">영화감상
<input type="checkbox" name="관심분야">음악감상
</td>
</tr>
<tr>
<td align="center" height="300"><b>자기소개: </b></td>
<td><textarea id="intro" name="intro" rows="10" cols="50"></textarea></td>
</tr>
</table>
<br>
<div align="center">
<input type="submit" value="회원가입">
<input type="reset" value="다시입력" align="center">
</div>
</form>
</body>
</html>
정규표현식 script.js
function validateform() {
var id = document.getElementById("id");
var idRegExp = /^[a-zA-Z0-9]{4,12}$/;
var pw = document.getElementById("pw");
var pwRegExp = /^[a-zA-Z0-9]{4,12}$/;
var pwCheck = document.getElementById("pwCheck");
var name = document.getElementById("name");
var nameRegExp = /^[가-힣]{2,4}$/;
var RRN = document.getElementById("RRN");
var RRNRegExp = /^[0-9]{6,6}[0-9]{7,7}$/;
var year = document.getElementById("year");
var month = document.getElementById("month");
var day = document.getElementById("day");
var email = document.getElementById("email");
var emailRegExp = /^[a-zA-Z0-9_]+[A-Za-z0-9]*[@]{1}[A-Za-z0-9]+[A-Za-z0-9]*[.]{1}[A-Za-z]{1,3}$/;
var intro = document.getElementById("intro");
//아이디 유효성 검사
if (id.value == "") {
alert("아이디를 입력하세요");
id.focus();
return false;
}
if (!idRegExp.test(id.value)) { // 정규표현식 idRegExp를 사용하여 입력된 id값이 조건을 만족하는지 테스트하는데 조건이 만족하지않으면 참.
alert("아이디는 4~12자의 영문 대소문자와 숫자로만 입력해야 합니다.");
id.focus();
id.value = "";
return false;
}
//비밀번호 유효성검사
if (pw.value == "") {
alert("비밀번호를 입력하세요");
pw.focus();
return false;
}
if (!pwRegExp.test(pw.value)) {
alert("비밀번호는 4~12자의 영문 대소문자와 숫자로만 입력해야 합니다.");
pw.focus();
pw.value = "";
return false;
}
if (pw.value == id.value) {
alert("아이디와 비밀번호를 다르게 입력하세요.");
pw.value = "";
pwCheck.value = "";
pw.focus();
return false;
}
//비밀번호 확인 유효성검사
if (pwCheck.value == "") {
alert("비밀번호 확인을 입력하세요");
pwCheck.focus();
return false;
}
if (pw.value != pwCheck.value) {
alert("비밀번호가 일치하지 않습니다.");
pwCheck.focus();
return false;
}
//이메일 유효성검사
if (email.value == "") {
alert("이메일을 입력하세요");
email.focus();
return false;
}
if (!emailRegExp.test(email.value)) {
alert("이메일 형식이 올바르지 않습니다.");
email.focus();
return false;
}
//이름 유효성검사
if (name.value == "") {
alert("이름을 입력하세요");
name.focus();
return false;
}
if (!nameRegExp.test(name.value)) {
alert("이름은 2~4자의 한글로만 입력해야 합니다.");
name.focus();
return false;
}
//주소 검사
const inputAdress1 = document.getElementById("zip-code");
if (inputAdress1.value == "") {
alert("우편번호를 입력하세요.");
inputAdress1.value = "";
inputAdress1.focus();
return false;
}
const inputAdress2 = document.getElementById("address-2");
if (inputAdress2.value == "") {
alert("상세주소를 입력하세요.");
inputAdress2.value = "";
inputAdress2.focus();
return false;
}
//주민등록번호 유효성검사
if (RRN.value == "") {
alert("주민등록번호를 입력하세요");
RRN.focus();
return false;
}
if (!RRNRegExp.test(RRN.value)) {
alert("주민등록번호는 13자리로 입력해야 합니다.");
RRN.focus();
return false;
}
if (RRN.value != "") {
var birthYear = RRN.value.substring(0, 2); // 주민등록번호 앞 2자리
var birthMonth = RRN.value.substring(2, 4); // 주민등록번호 3번째부터 4자리
var birthDay = RRN.value.substring(4, 6); // 주민등록번호 5번째부터 6자리
// 1900년대 출생자와 2000년대 출생자 구분
parseInt(birthYear) > 30 ? birthYear = "19" + birthYear : birthYear = "20" + birthYear;
year.value = birthYear;
RRN.value.substring(2, 3) == 0 ? birthMonth = RRN.value.substring(3, 4) : birthMonth = RRN.value.substring(2, 4);
RRN.value.substring(4, 5) == 0 ? birthDay = RRN.value.substring(5, 6) : birthDay = RRN.value.substring(4, 6);
month.value = birthMonth;
day.value = birthDay;
}
//주민등록번호 마지막자리 유효성검사
var lastnum = RRN.value.charAt(12);
var weights = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5];
var sum = 0;
for (var i = 0; i < 12; i++) {
sum += parseInt(RRN.value.charAt(i), 10) * weights[i];
}
var lastnumCheck = (11 - (sum % 11)) % 10;
if (lastnum != lastnumCheck) {
alert("주민등록번호가 올바르지 않습니다.");
RRN.focus();
return false;
}
// 관심분야 체크박스 검사
var interestCheckboxes = document.getElementsByName("관심분야");
var interestChecked = false;
for (var i = 0; i < interestCheckboxes.length; i++) {
if (interestCheckboxes[i].checked) {
interestChecked = true;
break;
}
}
if (!interestChecked) {
alert("관심분야를 최소 1개 이상 선택하세요.");
return false;
}
//자기소개 유효성검사
if (!(intro.value.length >= 10 && intro.value.length <= 300)) {
alert("자기소개는 10자 이상 300자 이하로 입력해야 합니다.");
intro.focus();
return false;
}
alert("회원가입이 완료되었습니다.");
}
// 주소
function execDaumPostcode() {
new daum.Postcode({
oncomplete: function (data) {
document.getElementById('zip-code').value = data.zonecode;
document.getElementById('address-1').value = data.address;
document.getElementById('address-1-1').value = data.jibunAddress;
document.getElementById('address-2').focus();
}
}).open();
}
블로그의 정보
감성 개발자 효기
효기’s