1. $(document).ready()

- 외부 리소스. 이미지와는 상관 없이 브라우저가 DOM (document object model) 트리를 생성한 직후 실행

- window.load() 보다 더 빠르게 실행되고 중복 사용하여 실행해도 선언한 순서대로 실행됨

 

 

2. $(window).load()

- DOM의 standard 이벤트

- html의 로딩이 끝난 후에 시작

- 화면에 필요한 모든 요소(css, js, image, iframe etc..)들이 웹 브라우저 메모리에 모두 올려진 다음에 실행됨

- 화면이 모두 그려진 다음의 메세징이나 이미지가 관련 요소가 모두 올려진 다음의 애니메이션에 적합함

- 전체 페이지의 모든 외부 리소스와 이미지가 브러우저에 불려운 이후 작동하게 되어 이미지가 안뜨너가 딜레이가 생길 때에는 그만큼의 시간을 기다려야 함

- 외부 링크나 파일 인크루트시 그 안에 window.load 스크립트가 있으면 둘 중 하나만 적용됨

- body onload 이벤트와 같이 body에서 onload 이벤트를 쓰게 되면 모든 window.load() 가 실행되지 않는 현상이 발생함

 

 

* window > document

- document는 window의 자식 객체

  (window의 자식 객체 : document, self, navigator, screen, forms, history, location etc..)

- document : html의 요소들이나 속성들에 접근할 시 사용하는 객체

 

 

3. 실행 순서 비교

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
$(window).load(function() {
    console.log("console> window.onloade() 첫번째");
});
 
$(window).load(function() {
    console.log("console> window.onload() 두번째");
});
 
$(document).ready(function() {
    console.log("console> document.ready() 첫번째");
});
 
$(document).ready(function() {
    console.log("console> document.ready() 두번째");
});
</script>
 
</head>
<body>
 
</body>
</html>
cs

 

 

콘솔창에서 document.ready가 먼저 실행되고 그 다음에 window.load가 실행되는 것을 확인할 수 있다.

 

 

4. document.ready() vs window.load() vs body onload 이벤트 비교

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
 $(window).load(function() {
     console.log("console> window.load()");
 });
 
 $(document).ready(function() {
     console.log("console> document.ready()");
 });
</script>
 
</head>
<body onload="console.log('console> body onload...');">
 
</body>
</html>
cs

 

document.ready() > window.load() > body onload 이벤트 순서대로 실행되는 것을 확인할 수 있다.

 

 

* window.load() vs body onload 차이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
 
<!-- <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> -->
<script>
$(window).load(function() {
     console.log("console> window.load()");
 });
</script>
 
</head>
<body onload="console.log('console> body onload...');">
 
</body>
</html>
cs

 

 

window.load()는 jquery CDN을 import 해줘야 사용할 수 있는 반면, body onload 이벤트는 jquery CDN을 import 해주지 않아도 사용할 수 있다.

 

 

* $(function() 대신 $(document).ready() 를 권장하는 이유

$(function() 을 쓰나 $(document).ready() 를 쓰나 같은 함수임에는 틀림이 없으나

$(window).load() 함수와 확실하게 구분지어주기 위해 $(document).ready() 를 사용하는 것을 권장한다.

1. text()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
$(document).ready(function() {
    $("#btn1").click(function() {
        console.log("console> btn1");
        
        $("#test1").text("Hello World!");
    });
    
    $("#btn2").click(function() {
        console.log("console> btn2");
        
        $("#test2").text("<b>Hello world!</b>");
    });
});
</script>
 
</head>
<body>
 
<p id="test1">This is a paragraph.</p>
<p id="test2">This is another paragraph.</p>
 
<button id="btn1">Set text</button>
<button id="btn2">Set html</button>
 
</body>
</html>
cs

 

text()는 안에 포함되어 있는 태그를 일반 텍스트로 인식한다(태그가 적용되지 않음)

 

 

2. html()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
$(document).ready(function() {
    $("#btn1").click(function() {
        console.log("console> btn1");
        
        $("#test1").html("Hello World!");
    });
    
    $("#btn2").click(function() {
        console.log("console> btn2");
        
        $("#test2").html("<b>Hello world!</b>");
    });
});
</script>
 
</head>
<body>
 
<p id="test1">This is a paragraph.</p>
<p id="test2">This is another paragraph.</p>
 
<button id="btn1">Set text</button>
<button id="btn2">Set html</button>
 
</body>
</html>
cs

 

 

html() 은 안에 있는 태그를 태그로 인식하여 적용시켜 준다(태그가 적용됨)

 

 

1. 문자열 배열 정렬(알파벳)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 
<p id="demo"></p>
 
<button onclick="myFunction()">Try it</button>
 
<script>
    var fruits = ["Banana""Orange""Apple""Mango"];
    
//    console.log("console> fruits.length : " + fruits.length);
 
    document.getElementById("demo").innerHTML = fruits;
    
//     sort() : 배열 요소를 알파벳 순서대로 정렬
//     reverse() : 알파벳 역순으로 정렬    
     function myFunction() {
         fruits.sort();
         fruits.reverse();
        
         document.getElementById("demo").innerHTML = fruits;
     }        
</script>
 
</body>
</html>
cs

 

 

2. 숫자 배열 정렬

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 
<p id="demo"></p>
 
<button onclick="myFunction()">Try it</button>
 
<script>
    var points = [40100152510];
    
//    console.log("console> points.length : " + points.length);
 
    document.getElementById("demo").innerHTML = points;
    
    function myFunction() {
//        sort() : 배열 요소를 알파벳 순서대로 정렬하는 메소드
//                 숫자가 올 경우 안에 callback 함수를 이용하여 정렬
//        숫자를 작은 수 > 큰 수 순으로 정렬하는 경우
        points.sort(function(a, b) {
            return a - b;
        });
 
//        숫자를 큰 수 > 작은 수 순으로 정렬하는 경우
        points.sort(function(a, b) {
            return b - a;
        });
        
        document.getElementById("demo").innerHTML = points;
    }
</script>
 
</body>
</html>
cs

1. 정의

문자열에서 문자 조합에 일치시키기 위해 사용되는 패턴

정규식 또한 객체이다

특정 규칙을 가진 문자열의 집합을 표현하는데 사용되는 형식의 언어

(단점 : 가독성이 떨어져서 표현식을 숙지하지 않으면 이해가 힘들다)

 

* 정규 표현식은 정규 표현식의 메소드를 바로 사용하는 것보다 문자열 객체의 메소드와 함께 사용하는 것이 일반적임

 

주로 js 파일에 넣어서 form이 submit 되기 전 유효성을 검사하는 데에 사용된다

 

 

2. 메소드 종류

메소드 

 의미

 test()

 일치하는 문자열이 있을 시 true, 없을 시 false

 exec()

 일치하는 문자열을 리턴

 match()

 일치하는 부분을 리턴

 search()

 일치하는 부분의 위치를 리턴

 (index : 0부터 시작, 숫자로 리턴함)

 split()

 정규 표현식을 기준으로 문자열을 잘라 배열을 리턴

 (정규 표현식과 일치하는 부분만 뺌)

 replace()

 일치하는 부분을 새로운 문자열로 바꿈

 대체 문자 사용 가능

 (default : defined)

 

ㄱ. replace() 메소드 대체 문자

- $& : 일치

- '$ : 일치하는 앞 부분

- $' : 일치하는 뒷부분

- $1, $2 : 그룹

 

* replace 메소드 대체 문자 부분에서 callback 함수 호출 가능

 

 

3. 플래그 문자

문자

 의미

 g

 전역 비교 수행

 i

 대소문자 안 가리고 비교

 m

 여러 줄 검사 수행

 

 

4. 앵커 문자

 문자

  의미

 ^ABC

 맨 앞 문자가 ABC인 경우

 ABC&

 맨 뒤 문자가 ABC인 경우

 

 

5. 메타 문자

 문자

 의미

 .

 아무거나

 [a]

 괄호 안의 글자만

 [a^]

 괄호 안의 글자를 제외한

 [a-z]

 a에서 z까지

 [A-Z]

 A에서 Z까지

 [0-9]

 0에서 9까지

 \d

 숫자만

 \w

 아무 단어

 \s

 공백 문자

 \D

 숫자를 제외한

 \W

 아무 단어가 아닌

 \S

 공백이 아닌

 

 

6. 수량문자

문자 

 의미

 a+

 1개 이상

 a*

 0개 or 여러개(1개 제외)

 a?

 0개 or 1개(여러개 제외)

 a{5}

 a가 5개

 a{2, 5}

 a가 2~5개

 a{2,  }

 a가 2개 이상

 a{  , 2}

 a가 2개 이하

 

 

7. 선택문자

 문자

의미 

 {abc | def}

 abc or def 

 

 

8. 정규식 응용

정규식

의미

var regExp = /\s/g;

모든 공백 체크

var regExp = /^[0-9]+$/;

숫자만 체크

var regExp = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i; 

이메일 유효성 검사

var regExp = /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/;

휴대폰번호 유효성 검사

var regExp = /^\d{2,3}-\d{3,4}-\d{4}$/;

전화번호 유효성 검사

var regExp = /^[a-z0-9_]{4,20}$/; 

아이디, 비밀번호 유효성 검사

 

 

9. 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
function updateMemberSave() {
//    alert('####');
    
    var form = document.update_member_form;
    
//    alert('member_update_form : ' + member_update_form);
    
    if (!form.memberEmail.value) {
        alert("이메일을 입력하세요.");
        
        form.memberEmail.focus();
        
        return false;
    }
 
//    function validateSmartEmail 함수를 불러와서 유효성 검사를     
    if (validateSmartEmail(form.memberEmail.value) == false) {
        alert("이메일 형식이 맞지 않습니다. \n ex) abcde@gmail.com");
        
        form.memberEmail.focus();
        
        return false;
    }
    
    if (!form.memberTel.value) {
        alert("전화번호를 입력하세요.");
        
        form.memberTel.focus();
        
        return false;
    }
 
//    function validateSmartPhone 함수를 불러와서 유효성 검사를 함    
    if (validateSmartPhone(form.memberTel.value) == false) {
        alert("전화번호 형식이 맞지 않습니다. \n ex) 010-1234-5678");
        
        form.memberTel.focus();
        
        return false;
    }
}
 
//휴대폰번호 체크 정규식
function validateSmartPhone(phone) {
    
    var regExp = /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/;
    
//    test() : 비교해서 문자열 있으면 true, 없으면 false
//             유효하면 true, 아니면 false
    return regExp.test(phone);
}
 
//이메일 체크 정규식
function validateSmartEmail(email) {
    
    var regExp =  /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
 
//    test() : 비교해서 문자열 있으면 true, 없으면 false
//             유효하면 true, 아니면 false
    return regExp.test(email);
}
cs

 

회원을 추가할 때, form에서 휴대폰 번호와 이메일의 유효성을 검사하는 함수로 응용해봤다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>book_insert_form_ajax_button</title>
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
<script type="text/javascript" src="./js/bookmanage.js"></script>
<body>
<center>
 
<form method="post" name="insert_book_form" action="BookInsertPro" onsubmit="return insertBookSave()">
</form>
 
</center>
</body>
</html>
cs

 

./js/bookmanage.js 경로의 파일을 받는 insert_book_form이 있다고 가정한다.

onsubmit 이벤트로 insertBookSave 함수를 호출했을 때를 비교한다.

 

 

1. return

1
2
3
4
5
6
7
8
9
10
11
12
13
function insertBookSave() {
    var insert_book_form = document.insert_book_form;
    
//    alert('bookCode value : ' + insert_book_form_bookCode.value);
 
    if (! insert_book_form_bookCode.value) {
        alert('도서 코드를 입력하세요.');
        
        insert_book_form.bookCode.focus();
        
        return;
    }
}
cs

 

return 뒤에 어떠한 값으로 return하는지 정해주지 않았기 때문에 insert_book_form_value값이 들어가 있지 않을 경우 null로 return한다.

따라서 insert_book_form은 submit을 하지 못하고 null을 반환한다.

해당 return 아래를 전부 실행하지 않고 return 줄에서 클래스를 끝내버린다.

 

 

2. return true

1
2
3
4
5
6
7
8
9
10
11
function insertBookSave() {
    var insert_book_form = document.insert_book_form;
    
    if (! insert_book_form.bookCode.value) {
        alert('도서 코드를 입력하세요.');
        
        insert_book_form.bookCode.focus();
        
        return true;
    }
}
cs

 

return값을 true로 정해줬다.

insert_book_form이 submit 하기 전에 insertBookSave 함수에서 유효성 검사를 하고 통과가 되면 true (=submit true)로 리턴한다는 뜻이다.

즉 bookCode.value 값이 들어가 있지 않아도 submit 한다.

 

 

3. return false

1
2
3
4
5
6
7
8
9
10
11
function insertBookSave() {
    var insert_book_form = document.insert_book_form;
    
    if (! insert_book_form.bookCode.value) {
        alert('도서 코드를 입력하세요.');
        
        insert_book_form.bookCode.focus();
        
        return false;
    }
}
cs

 

return값을 false로 정해준다.

bookCode.value 값이 들어가 있지 않으면 submit을 fasle로 리턴한다는 뜻이다.

 

자바스크립트 함수를 쓰면서 return 값을 true나 false로 명확하게 주지 않고 return으로만 적었었는데,

input 값 관련 오류가 나서 어떤 이유인지 한참 찾아봤었다.

 

앞으로는 return 값을 true or false로 명확하게 해야겠다.

원래 프로젝트는 자바스크립트로 버튼 클릭시 함수로 window.open() 을 걸어 팝업창을 띄웠었는데

오늘은 하이퍼링크를 이용한 팝업창 띄우기를 도전해봤다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>        
    <head></head>
    <body>
    <table>
        <tr>
            <td align=right colspan=7>
                <a href="MemberServlet.do">[전체목록]</a>
                
                <!-- 회원가입 링크를 새 창(팝업창)으로 열기 -->-->
                <a href="memberInsert_form.html"
                    onclick="window.name='MemberServlet.do';window.open(this.href, 'insert',
                    'width=450,height=320,resizable=no,scrollbars=no,status=no');return false;">[회원가입]</a>
            </td>
        </tr>
    </table>
    </body>
</html>
cs

 

href에 링크로 연결될 페이지를 입력하고 onclick에는 원래 버튼을 누르면 연결될

자바스크립트 함수 안에 들어있던 소스를 그대로 붙여넣었다.

'FrontEnd > CSS & HTML' 카테고리의 다른 글

CSS : 부트스트랩(Bootstrap) 사용시 class container 요소의 위치 차이 비교  (0) 2016.10.14
HTML :: <pre>  (0) 2016.04.02
HTML :: select optgroup  (0) 2016.03.10
HTML :: id vs name  (0) 2016.03.01

회원 가입을 받는 경우, 페이지 전체를 차지하는 큰 창이 아닌 조그마한 팝업 창을 띄워 받는 경우가 있다.

 

부모창(리스트)과 자식창(팝업창) 페이지 둘 다 자바스크립트를 걸어줘야 한다.

 

 

1. 부모창 페이지 소스

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<html>
    <head>
    <script type="text/javascript">
        function insertPopup() {
            // window.name = "부모창 이름";            
            window.name = "MemberServlet.do";
            
            // window.open("자식창 이름", "불러올 자식 창의 닉네임", "팝업창 옵션");
            window.open("memberInsert_form.html""insert",
                    "width = 450, height = 320, resizable = no, scrollbars = no, status = no");
        }
    </script>
    </head>
    <body>
        // 회원가입에 링크를 걸어 팝업창을 띄운다.
        <a href="javascript:insertPopup();">[회원가입]</a><br>
    </body>
</html>
cs

 

 

 

 

 부모창에서 회원가입 링크를 누르면 이렇게 회원가입 페이지가 팝업 창으로 뜬다.

 

 

2. 자식창 페이지 소스

 

회원가입 항목을 전부 입력한 뒤 확인 버튼을 누르면 창이 닫히면서 리스트에 회원 명단이 자동으로 추가되어야 한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<html>
    <head>
    <script type="text/javascript">
        // 자동으로 팝업 창이 닫히게 하는 함수
        function popupClose(form) {
            // form의 target을 부모 창으로 설정함            
            form.target = opener.name;
            
            form.submit();
            
            if (opener != null) {
                opener.insert = null;
                
                self.close();
            }
        }
    </script>
    </head>
    <body>
    <form method="post" name="writeform" action="memberInsert_pro.jsp" target="MemberServlet.do">
        <input type="submit" value="확인" onclick="window.close()" >
        <input type="button" value="창 닫기" onclick="window.close()">
    </form>
    </body>
</html>
cs

 

 

자바스크립트 함수에서 target을 부모 창으로 설정한 뒤 form에도 target으로 부모 창을 적어줘야 한다.

 

원래는 submit에 onclick을 설정하지 않아도 self.close();만으로 닫혀야 하는데,

 

창이 닫히지 않아서 onclick에 window.close();로 이벤트를 줬다.

회원가입 창에서 주민등록번호를 입력하는 text type 부분에 문자가 아닌 숫자만 가능하게 하도록 하는 소스이다.

 

onkeyup과 onchange 이벤트를 이용하여 text 창에 숫자가 아닌 문자나 특수문자를 입력하면 그 즉시 자동으로 삭제된다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>주민등록번호 입력 예제</title>
<script type="text/javascript">
    function getTypeCheck(s, spc) {
        var i;
        
        for (i = 0; i < s.length; i++) {
            if (spc.indexOf(s.substring(i, i + 1)) < 0) {
                return false;
            }
        }
        
        return true;
    }
    
    function onlyNum(obj,n) {
        var re = /[^0-9]/gi;
        var NUM = "0123456789";
        var str_space = /\s/;
     
        if(n == undefined || n == null) {
            var n = "";
            var n2 = "";
        } 
        else {
            if(n == "") {
                var n = "";
                var n2 = "";
            } 
            else {
                var n = eval(n);
                var n2 = n;
            }
        }
     
        if(!getTypeCheck(obj.value, NUM)) {
            alert("숫자를 입력해주세요.");
            
            obj.value = obj.value.replace(re,"");
            obj.value = n2;
            
            obj.focus();
            
            return false;
        }
    }
</script>
</head>
<body>
    <h2>주민등록번호 입력 예제</h2>
    <input type="text" name="juminA" id="juminA" onkeyup="onlyNum(this, '');" onchange="onlyNum(this, '');" /> -
    <input type="text" name="juminB" id="juminB" onkeyup="onlyNum(this, '');" onchange="onlyNum(this, '');" />
</body>
</html>
cs

 

 

 

alert 창이 뜨면서 onkeyup 이벤트를 걸어놓았기 때문에 공백으로 문자가 지워진다.

-

검색 버튼을 누르면 키워드 검색을 하는 부분이다.

onkeydown을 이용하여 Enter키를 누름과 동시에 이벤트가 발생되도록 작성했다.

 

* onkeydown : 키를 누르는 즉시 발생하는 이벤트를 설계하는 용도이다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<html>
<head>
<script type="text/javascript">
    // 검색 기능
    function searchCheck(form) {
            
        if (form.keyword.value == "") {
            alert("검색할 단어를 입력하세요.");
 
            form.keyword.focus();
            
            return;
        }
 
        // form.action으로 url 주소를 추가하는 방식으로 더함
        form.action += "personServlet.do";
        form.action += "?keyfield=" + form.keyfield.value;
        form.action += "&compare=" + document.querySelector("input[name = 'compare']:checked").value;
        form.action += "&keyword=" + form.keyword.value;
 
        form.submit();
    }        
</script>
</head>
<body>
<table>
    <tr>
        <td>
            <form method="post" name="search">
            <!-- onkeydown 이벤트 : 키보드 키를 누르는 즉시 발생하는 이벤트. -->
            <!-- event.keyCode == 13 : Enter 키의 코드가 13번임. 즉 Enter키를 누르면 발생하는 이벤트 함수. -->
            <input type="text" name="keyword" value="${cri.keyword}" 
                onkeydown = "if (event.keyCode == 13)
                                document.getElementById('btnSearch').click()" />
            <!-- 검색 기능을 하는 searchCheck function으로 이동-->
            <input type="button" id="btnSearch" value="검색" onclick="searchCheck(form)" />
            </form>
        </td>
    </tr>
</table>
</body>
</html>
cs

+ Recent posts