복습

XML & JSON

- 데이터를 저장하는 포맷 중 하나

 

비동기 요청 함수

ajax()

- 많은 옵션이 있다, 전송방식 선택 가능

- 키:밸류 형태

 

getJSON()

- JSON 데이터를 가져오기 위한 함수

- get 방식 사용

 

getScript()

- 자바스크립트 코드를 return 구문으로 돌려받아서 값을 구해옴

 

get()

- get 방식으로 파일을 요청하고 돌려받음

 

응답을 받은 후

- 결과를 조작해서 원하는 형태로 사용

- XML 파일을 돌려받은 후 언어마다 조작하는 방법은 다르다

 


JSON

- XML 을 대신하기위해 등장, XML 보다 다루기 수월

- 자바의 맵 구조 (키:밸류 형태) 로 되어있다

- 키값을 알면 밸류를 구할 수 있다.

- 가장 바깥쪽엔 [ ] 대괄호가 있고 안엔 { } 중괄호들이 있다

 

JSON 파일 예시

- 아까의 xml 형태의 파일을 json 형태로 바꿔둔 것이다

- item.json

- id가 키고 "1" 이 밸류 값

 

JSON 데이터를 요청하고 결과를 콜백으로 받아서 가져오는 방법

1. getJSON() 함수

2. ajax() 함수로도 가능

 

비동기로 서버에 요청하는 함수

$.getJSON() 함수

	$.getJSON('item.json', function(data, textStatus) {
	 });

- json 데이터를 요청하고 받을 수 있다

- get 방식을 사용한다

getJSON() 매개변수

- 첫번째 매개변수에는 요청할 json 파일명

- 두번째 매개변수에 오는 function 은 콜백함수이다.

function() 매개변수

- data는 item.json 전체 내용을 받음

- textStatus 에서 잘 돌려받으면 success란 문자가 출력됨

 

Ajax 예제 6

 getJSON() 함수 예제 1

1. getJSON() 함수로 json 데이터 가져오기

- example09_05.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSON 이용하기</title>
<style>
td {
  border: 1px solid gray;
}
</style>
<script src="http://code.jquery.com/jquery-1.11.1.js" type="text/javascript"></script>
<script type="text/javascript">
/*  
	- JSON은 JavaScript Object Notation 의 약어로 XML 데이터를 대신하기 위해서 사용된다.
	- JSON은 키와 값을 쌍으로 가지는 구조이다.
	- 배열을 사용할 때는 대괄호([ ])안에 중괄호({ })를 사용하여 조합한다.
	- jQuery에서는 JSON으로 표현한 데이터를 파일에 저장해 두었다가 필요할 때 이를 로드할 수 있는 $.getJSON()함수를 제공한다.

	- 서버로 부터 get방식의 요청을 하고, 응답을 JSON 형식으로 받기 위해서 $.getJSON()함수를 사용한다.
	- $.getJSON()함수의 첫번째 매개변수는 서버의 URL주소를 지정한다. ('item.json')
	- 서버로 요청이 성공적으로 완료되면, 두번째 매개변수로 기술한 콜백함수가 호출된다. (function(data, textStatus))
	  콜백함수의 첫번째 매개변수인 data는 서버에서 돌려받은 JSON 객체 형식의 데이터이고, 두번째 매개변수인 textStatus는 성공일때
	  "success" 라는 문자열이 전달된다.

*/

$(function() {
	
	$.getJSON('item.json', function(data, textStatus) {
//		alert(data);
//		alert(textStatus);		success
        $("#treeData").append(
                 "<tr><td>id</td>" + "<td>name</td>" 
               + "<td>price</td>" + "<td>description</td>" + "</tr>");
        $.each(data, function() {
              $("#treeData").append("<tr>" + "<td>"                 
                      + this.id + "</td>" + "<td>"
                      + this.name + "</td>" + "<td align='right'>"
                      + this.price + "</td>" + "<td>"
                      + this.description + "</td>" + "</tr>");
          });
	 });
	
});

</script>
</head>
<body>
  <table id="treeData"></table>
</body>
</html>

- getJSON() 함수로 item.json 파일을 요청한다

- 그 다음의 function 전체가 두번째 매개변수이고, 이 function 은 콜백함수이다

- each() 함수로 더이상 데이터가 없을때까지 data 를 한개씩 가져와서 반복적인 작업을 함

- each() 함수에서 첫번째로 가져오는건 

- 첫번째 중괄호 {} 안의 내용이다,

- 다음에는 두번째 {} 를 가져온다

- this 는 현재 가져와진 이 {} 데이터를 의미한다

 

밸류 value 가져오기

                      + this.id + "</td>" + "<td>"
                      + this.name + "</td>" + "<td align='right'>"
                      + this.price + "</td>" + "<td>"
                      + this.description + "</td>" + "</tr>");

- 키값 id, name, price, description 으로 밸류를 가져오고 있다

 

+ data와 textStatus

- data는 item.json 전체 내용을 받음

- textStatus 에서 잘 돌려받으면 success란 문자가 출력됨

- 어떤 것인지 alert 로 찍어보기

 

- 결과 출력

 

Ajax 예제 7

ajax() 함수 예제 2

2. 아까의 예제를 getJSON() 대신 ajax() 로 구현하기

- example09_05_02.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSON 이용하기</title>
<style>
td {
  border: 1px solid gray;
}
</style>
<script src="http://code.jquery.com/jquery-1.11.1.js" type="text/javascript"></script>
<script type="text/javascript">
/*
	$.getJSON()함수 대신에 $.ajax()함수를 이용해서 JSON 형식의 데이터를 얻을 수 있다.

*/

$(function() {
    $.ajax({
         url : "item.json",
         dataType : "json",
         success : function(data) {
             $("#treeData").append(
                    "<tr><td>id</td>" + "<td>name</td>" 
                  + "<td>price</td>" + "<td>description</td>" + "</tr>");
             $.each(data, function() {
                 $("#treeData").append("<tr>" + "<td>"                 
                         + this.id + "</td>" + "<td>"
                         + this.name + "</td>" + "<td align='right'>"
                         + this.price + "</td>" + "<td>"
                         + this.description + "</td>" + "</tr>");
             });
         }
    });
});

</script>
</head>
<body>
  <table id="treeData"></table>
</body>
</html>

- $.ajax({}); 함수 안에 모든 것이 들어간다

- url 은 요청할 파일명, 여기서는 item.json 파일이 적혀있다, 나중에는 이 자리에 jsp, spring 파일등이 온다

- function() 콜백함수로 item.json 전체를 돌려받고 data 에 값이 있다

- 콜백함수로 받은 데이터 data를 each() 를 통해 하나씩 {} 단위로 가져오고 있다

+ append() 함수로 테이블에 <tr></tr> 과 <td></td> 를 추가하고 있다

+ get 방식이더라도 페이지가 바뀌지 않기때문에 url 주소창에 뭔가 나타나지는 않고 내부적인 방식이다

 

ajax() 함수 옵션

- url, success 는 생략해선 안된다

- type은 생략가능하고 생략시 type은 get 방식이다

- data 를 가져갈때는 json 데이터를 가져갈 수 있다, 지금은 가져갈 데이터가 없으므로 생략되어있음

- dataType 도 생략 가능하다

- success는 결과(응답)를 잘 돌려받았을때만 실행된다

 

- 결과 출력

- 아까의 예제와 같은 결과이다.

 

비동기로 서버에 요청하는 함수

$.post() 함수

- post 방식으로 비동기로 서버에 요청하는 함수

- 간단한 형식

                $.post(
                 "요청페이지명",
                 "전달될값",        
                  function (msg) {	// 콜백함수
                });

- 매개변수가 3개, 첫번째엔 요청할 페이지명, 두번째는 전달될 값, 세번째는 콜백함수

- 이때 전달될값에서 변수명=변수 로 보내야한다

- 데이터를 전달할 때 문자열 형식의 데이터를 보낸다

 

Ajax 예제 8

ajax() 함수 예제 3 / post() 함수 예제 1

- 같은 내용을 ajax() 로 먼저 구현하고 다음에 post() 부분의 주석을 풀고 설명

1. ajax() 함수로 post 방식 비동기 통신

2. post() 함수로 post 방식 비동기 통신

- example09_08.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>$.ajax로 jsp 파일 로드하기</title>
<style>
td {
  border: 1px solid gray;
}
</style>
<script src="http://code.jquery.com/jquery-1.11.1.js" type="text/javascript"></script>

<script type="text/javascript">
/*
	- $.post() 함수는 post방식으로 서버와 통신하는 jQuery 함수이다.
    - $.post() 함수는 서버의 welcome.jsp 페이지를 post방식으로 요청한다.
*/

$(function() {
    $('#submit').click(function () {
            var username = $('.username').val();	// 서버로 보낼 데이터를 입력창에서 얻어온다.
            var sendData = 'username=' + username;  // 입력창에서 입력받은 데이터를 문자열 형식으로 변환한다.
            
            /* $.post(									// 문자열 형식의 데이터를 welcome.jsp 파일로 보낸다.
                 "welcome.jsp",						// 서버의 welcome.jsp 에서는 받은 데이터를 인사말을 덧붙여서 돌려준다.
                  sendData,        
                  function (msg) {					// 콜백함수는 서버에서 보내온 데이터를 매개변수로 얻어온다.
                	alert(msg);
            	    $('#message').html(msg);			// 서버로부터 받은 데이터를 id가 message인 엘리먼트에 설정한다.
                });    */
            
            	$.ajax({
            		url :"welcome.jsp",
            		type :"post",
            		data : {"username": username},
            		success : function(msg){
            			alert(msg);
            			$('#message').html(msg);
            		} 
            	}); 
            
            return false;      
    });
});

</script>
</head>
<body>
    <form>  
    <label> 이름을 입력하세요 : </label>  
    <input type="text" name="username" class="username"/>  <br/>
    <input type="button" id="submit"  value="전송"/>  
  </form>  
  <div id="message"></div>
</body>
</html>

- 같은 내용이 ajax() 함수로도 구현되어있고, post() 함수로도 구현되어있다, 비교하기

- 요청하는 파일이 welcome.jsp 임

- 사용자 이름을 입력하고 전송버튼을 누르면 지정된 요청을 하는데, 요청하는 페이지가 jsp 페이지이다.

- 요청하면서 사용자가 입력한 이름을 서버측으로 전달한다 

- 전송 버튼을 누르면 페이지가 바뀌지 않고 값을 뿌려준다

+ input type=text 에 class 속성값이 있다 -> 이 태그를 구해올 때 . 으로 구해온다

+ input type=button 이므로 click 이벤트가 발생하므로 click() 을 사용

 

1. ajax() 함수로 post 방식 비동기 통신 (example09_08.html 부분)

            var username = $('.username').val();	// 서버로 보낼 데이터를 입력창에서 얻어온다.
            var sendData = 'username=' + username;  // 입력창에서 입력받은 데이터를 문자열 형식으로 변환한다.
                   	
                $.ajax({
            		url :"welcome.jsp",
            		type :"post",
            		data : {"username": username},
            		success : function(msg){
            			alert(msg);
            			$('#message').html(msg);
            		} 
            	});

- .username으로 input 태그를 구해와서 val() 을 통해 사용자가 입력한 값을 username 변수에 저장

- 서버측에 값을 전달할떄 JSON 형태로 값을 전달해야하기 때문에 username 변수에 따로 저장했다

- url 자리에 요청할 파일명이 들어가는데 여기선 welcome.jsp 라는 JSP 파일이 왔다, 이 welcome.jsp 파일을 요청하겠다는 의미

- data 속성은 서버측으로 값을 가져갈때만 사용되는 속성으로서 JSON 형태, 즉 키:밸류 형태로 값을 가져가야한다

- 그래서 {"username" : username} 라는 JSON 형태로 값을 저달하고 있다

- welcome.jsp 파일에서는 전달된 값을 받을때 JSP의 내장객체 중 클라이언트의 요청을 받는 객체인 request 객체의 getParameter() 로 전달된 값을 받고 표현식 형태 <%= %> 로 출력함, 브라우저에 출력되는 이 내용이 통째로 콜백함수로 돌아가는 것임

- welcome.jsp 파일에서 환영합니다 ~님 을 두번 출력한다, 그 출력하는 값을 function의 msg 매개변수로 받아서 여기서 html()로 id가 message인 태그 사이에 뿌려주는 것

* 아래에 welcome.jsp 파일 설명

 

콜백함수로 돌려받은 값

- alert(msg)로 출력해본 값

- welcome.jsp 파일에서 브라우저에 출력되는 내용들이 통째로 넘어왔음을 알 수 있다

- 이 내용이 msg 변수에 저장된 것

 

welcome.jsp 파일

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>

<!-- welcome.jsp 파일에서 브라우저에 출력되는 결과를 callback 함수로 돌려준다-->
 환영합니다. <%=request.getParameter("username") %>님  <br>
 환영합니다. ${param.username}님  <br>
 
</body>
</html>

- <%= %> = "표현식 태그" = 브라우저에 출력시킬 값

- ${} = "표현언어"

- username 은 example09_08.html 에서 json 으로 전달되었던 키값

- 이렇게 브라우저에 출력되는 값을 통째로 callback 함수로 돌려주게 되는것

- 위에선 표현식 태그로 한번 출력하고 아래에선 표현 언어로 한번 출력, 여기서 총 출력을 두번하고 있다

 

2. post() 함수로 post 방식 비동기 통신 (example09_08.html 부분)

- 위에서 ajax() 로 구현된 내용을 이번엔 post() 를 사용

- 위의 ajax() 함수와 같은 기능

            var username = $('.username').val();	// 서버로 보낼 데이터를 입력창에서 얻어온다.
            var sendData = 'username=' + username;  // 입력창에서 입력받은 데이터를 문자열 형식으로 변환한다. 
            	
                // $.post("요청페이지명","전달될값","콜백함수");                
                $.post(									// 문자열 형식의 데이터를 welcome.jsp 파일로 보낸다.
                 "welcome.jsp",						// 서버의 welcome.jsp 에서는 받은 데이터를 인사말을 덧붙여서 돌려준다.
                  sendData,        
                  function (msg) {					// 콜백함수는 서버에서 보내온 데이터를 매개변수로 얻어온다.
                	alert(msg);
            	    $('#message').html(msg);			// 서버로부터 받은 데이터를 id가 message인 엘리먼트에 설정한다.
                });

- post 방식으로 welcome.jsp 를 요청하면서 값을 전달하고 있다

- sendData에서 'username=입력받은 이름' 형식으로 값을 전달

- 이렇게 값을 전달하면 jsp 파일에서는 username 이라는 변수명을 통해 값을 받는다

- 브라우저에 출력되는 결과 전체를 콜백함수로 받게 되고 그 값을 msg 변수에 저장

 

- 결과 캡처

 

$.getScript() 함수

- Javascript 파일을 불러온다, 확장자가 js 인 파일을 불러오는 함수이다

- 자바 스크립트 파일을 로드한다

 

Ajax 예제 9

getScript() 예제

- example09_10.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>스크립트 로드하기</title>
<script src="http://code.jquery.com/jquery-1.11.1.js" type="text/javascript"></script>
<script type="text/javascript">
/*
	- 현재파일에서 자바스크립트 파일(test.js)을 get방식으로 요청하는 예제
	- 자바스크립트 파일을 로드하기 위해서 $.getScript() 함수를 사용함.

*/

  $(document).ready(function() {

    $.getScript("test.js");				//자바스크립트 파일(test.js)을 $.getScript()함수로 호출한다.
    $('#submit').click(function() {
    	var msg=call($('.username').val());	// 자바스크립트 파일(test.js)에 정의한 자바스크립트 함수 call()함수를 호출한다.
    	$('#message').html(msg);			// call()함수 호출한 결과를 돌려 받아서 msg변수에 저장한다.
    	 return false;
    });

  });

</script>
</head>
<body>
  <form>  
    <label> 이름을 입력하세요 : </label>  
    <input type="text" name="username" class="username"/>  <br/>
    <input type="button" id="submit" value="전송"/>
    <div id="message"></div> 
  </form>  
</body>
</html>

- $.getScript() 함수로 확장자가 .js 인 파일을 불러온다

- 이 파일을 불러와야만 test.js 안의 함수 call() 을 호출 할 수 있다

- call() 함수를 호출하며 사용자가 입력한 값을 매개변수로 호출한다

- 호출된 call() 에서 return 으로 돌려받은 값을 출력한다

 

- test.js 파일

function call(param){
	return ("Hello, " + param);
}

- 매개변수가 있으므로 이 함수를 호출할 때는 매개변수 param 을 통해서 값을 전달해야함

- 전달될 값을 return 으로 Hello 를 붙여서 돌려줌

 

Ajax 가 자주 사용되는 곳

- ID중복검사에서 팝업창을 띄우지 않고 비동기적인 방식으로 ID중복검사 가능

- war 파일을 import 해서 ID중복검사 구현되어있는 내용을 살펴보자 (자세한 내용은 JSP 를 공부할때)

 

실습준비

1. ajax.war 파일을 이클립스에서 import 하여 ajax 프로젝트 추가

 

2. DB 연동

- 한명이 가입되어있어야만 새로운 ID값으로 중복인지 아닌지 판별 가능하므로 오라클을 활성화시키기

- 계정명 scott

 

3. DB 에 회원 데이터 삽입 (한명 가입시키기)

- DB 연동을 처리해주는 DAO 클래스이다

- DB 연결을 하고 select 문으로 그런 아이디가 있는지 검색해줌

- scott 계정으로 테이블을 만들어야함

- 여기서 테이블을 만들고 강제로 한명을 등록할 것이다

- create 부분을 실행하여 join_member 테이블과 sequence를 생성

- 이 부분을 블럭으로 잡고 실행해서 강제로 데이터를 넣는다

- 그리고 아래의 select 문으로 데이터 삽입 확인하기

- 회원 1명이 등록되었음을 알 수 있다, 아이디는 aaaaa

 

4. ID중복검사 실행

- WebContent/jsp/member/member_join.jsp 을 실행

- member_join.jsp 실행 시

 

1. 중복된 ID를 입력했을때

- 중복된 ID를 입력했을때 1을 전달한다

 

2. 중복이 아닌 ID를 입력했을때

- 중복된 ID를 입력했을때 -1을 전달한다

 

흐름(거꾸로) 설명

 

MemberDAOImpl.java

-id를 매개변수로 받아서 중복된 ID 이면 1 을 리턴하고 중복이 아닌 ID 이면 -1 을 리턴하는 MemberDAOImpl.java의 checkMemberId() 함수가 있다

- DB 와 연동하여 DB에 이미 저장된 ID면 1 을 리턴, 기존에 없는 ID이면 -1 을 리턴

 

member_idcheck.jsp

- 아래의 member.js 파일에서 요청하게되는 파일이다

- member.js 파일에서 전달한 id 값을 키인 memid 로 받고 id 변수에 저장 후 checkMemberId(id) 처럼 매개변수로 넣음

- member_idcheck.jsp 에서 이 checkMemberId() 함수를 호출하며 DB 연결을 하면서 DB 에 ID 가 있는지 없는지 select로 확인 후 return 해준 값을 여기서 받음

 

member.js

- 이 member_idcheck.jsp 파일을 post 방식으로 요청하는 member.js

- 브라우저에 출력되는 값인 <%=re %> 에서 돌려받은 값 re 를 콜백함수 function 의 data 로 받음

- member_idcheck.jsp 를 요청하고 있다

- 전달하는 값인 memid 는 사용자가 입력한 id 값이다

+ success : : 콜백함수로 결과를 잘 돌려받았을때 실행

+ error: :  콜백함수로 결과를 잘 돌려받지 못했을때는 보통 아무것도 안뜨므로 에러를 확인하기 위해 에러 출력하기위해 사용

- 그리고 콜백함수를 통해 data 를 받는다

- 그 data 가 1이라면 중복된 아이디라는 메세지를 띄움

- 그 data 가 -1이라면 사용가능한 아이디라는 메세지를 띄움

+ 이 id_check() 에서 ID 중복검사 버튼을 누르면 ID 중복검사 뿐 아니라 유효성검사까지 해줌

 

member_join.jsp

- 여기서 member.js 를 불러오고 있다

- 그래서 이 member_join.jsp 를 실행하면 된다

- 회원가입할때 실행하는 양식 폼이다

- 버튼을 눌렀을때 member.js 의 id_check() 함수를 실행한다

+ ID 중복검사 버튼을 누르면 ID 중복검사 뿐 아니라 유효성검사까지 해줌

 

+ DB 쪽 테이블 join_member.sql

- 사용자의 아이디는 primary key 즉 기본키이므로 중복되어선 안됨

- 그래서 ID 중복검사를 하는 것

 

흐름 정리

1. member_join.jsp 를 실행시켜 회원가입 폼을 실행함

2. ID중복검사 버튼 클릭 시 onClick 에 의해 member.js의 id_check()가 호출됨

3. member.js 에서의 id_check()가 호출되며 사용자가 input 창에 입력한 id 값을 변수 memid 로 받은 후 member_idcheck.jsp 을 ajax()로 비동기 요청하며 memid 값을 전달함, (나중에 콜백 받음)

4. member_idcheck_jsp 파일에서 키값인 memid 를 통해 값을 받아서 id 변수에 저장한 후 MemberDAOImpl 이라는 DAO 클래스로 객체를 만들고 그 멤버함수인 checkMemberId(id); 를 실행하며 id 를 매개변수로 전달

5. MemberDAOImpl 클래스 멤버함수인 checkMemberId() 에서 DB 연결을 하고, DB select 를 통해 기존의 ID가 있는지 없는지 확인하고 있으면 return 으로 1을 돌려주고, 없으면 -1 을 돌려줌

6. 그럼 4번에서 이 checkMemberId()를 호출했던 member_idcheck.jsp 에서 리턴값을 re 로 받아서 브라우저에 출력한다

7. 이렇게 브라우저에 출력되는 값이 콜백함수로 리턴이 되므로 이 출력된 값 1 또는 -1 이 ajax() 를 썼던 3번의 member.js 로 돌아가서 data 로 값을 받은 후 1이면 중복된 아이디라고 출력하고 -1 이면 사용가능하다고 출력

 

 

+ JSP 파일에서 결과 출력하는 법

- 이렇게 웹 브라우저에 출력되는 값이 callback 함수로 리턴되는 것임!

1. JSP 내장객체 9가지 중 out 객체 사용 out.println(re); 로 출력

2. <%= => 표현식 태그로 출력

3. 표현 언어로 출력

 

+ JSP 파일에서 자바클래스를 쓰기 위해선 import 해야한다

 

+ Ajax 통신시에는 오류시 어디서 잘못되었는지 확인이 힘드므로 값이 어디까지 출력되었는지를 중간에 찍어봐야한다


jQuery 로 맵 출력

- 사이트를 만들때 찾아오는 길 등을 맵으로 보여주게 됨

- 네이버 맵, 다음 맵(카카오), 구글 맵 등을 사용

- 맵 사용을 위해선 회원가입 후 키를 인증받아서 하루동안 맵을 요청할 수 있는 횟수가 정해져있고 그 횟수까지만 맵을 요청할 수 있다

- 브라우저창에 맵을 출력하는 방법을 구글 맵으로 설명할 것

 

실습 준비

- 구글 맵에 대한 인증 파일이 있다 (키 포함)

- 해당사이트로가서 키 인증을 받아야만 사용 가능

 

맵 가져오기 예제 1

- map1.html

<!DOCTYPE html>
<html>
<body>

<h1>My First Google Map</h1>

<div id="googleMap" style="width:100%;height:400px;"></div>

<script>
function myMap() {
var mapProp= {  // 37.4965202,127.0279245
  center:new google.maps.LatLng(37.497975, 127.027506),
  zoom:18,
};
var map = new google.maps.Map(document.getElementById("googleMap"),mapProp);
}
</script>

<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDEM3FEmY5ecJzAkXH9TDRAs1MaXpSWtME&callback=myMap"></script>

</body>
</html>

- myMap() 함수의 mapProp 변수에서는 맵을 출력할 center 의 위치를 위도 경도로 설정하고 zoom 속성으로 맵의 크기 설정

- google.maps.Map(); 으로 map 객체 생성

- getElementById() 로 div 태그를 구해온다, 두번째 매개변수에는 mapProp, 즉 아까의 변수를 넣음

 

키값 불러오기 (map1.html 부분)

<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDEM3FEmY5ecJzAkXH9TDRAs1MaXpSWtME&callback=myMap"></script>

- 해당사이트로가서 키 인증을 받아야만 사용 가능

- 키가 포함되어있으므로 지도가 실행된다

- 마지막 부분에 callback=myMap 으로 되어있다, myMap() 함수를 호출하는 것임

 

 

+ zoom 크기를 줄인다면?

- zoom:10

+ 위도 경도 찾기

- 위도 경도는 Google 지도 등에서 찾는다

+ 네이버, 카카오 맵에서는 위도,경도를 알 수 없음

- URL 주소 창에 위도, 경도가 나온다

https://www.google.co.kr/maps/place/%EC%9D%B4%EB%8C%80%EC%97%AD/data=!4m5!3m4!1s0x357c989a4d840017:0x652b08b73c59c6dd!8m2!3d37.556761!4d126.945857?hl=ko

- 이 위치로 center 를 설정해보자

 

맵 가져오기 예제 2

- map01.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDEM3FEmY5ecJzAkXH9TDRAs1MaXpSWtME"
  type="text/javascript"></script> -->
<script src="http://code.jquery.com/jquery-latest.js"></script>

<script src="http://maps.googleapis.com/maps/api/js"></script>

<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDEM3FEmY5ecJzAkXH9TDRAs1MaXpSWtME"
  type="text/javascript"></script>

<script>
function initialize() {
  var mapProp = {
    center:new google.maps.LatLng(37.497975, 127.027506),
    zoom:18,
    mapTypeId:google.maps.MapTypeId.ROADMAP
  };
  var map=new google.maps.Map(document.getElementById("googleMap"), mapProp);
}
//google.maps.event.addDomListener(window, 'load', initialize);
</script>
<script>
	$(document).ready(function(){
		$("button").click(function(){
//			reload();
			initialize();
		});
	});

</script>

</head>

<body>
<button>지도</button>
<div id="googleMap" style="width:500px;height:380px;"></div>

</body>
</html>

 

- 자동으로 실행되지 않고 클릭을 해야만 맵이 나타나도록 구현했다

- initialize() 함수에서 원하는 위치와 크기를 지정하고 map 객체를 만들고 document.getElementById() 를 통해서 맵을 나타나게할 영역(div)을 지정

- mapTypeId 로 맵의 타입을 설정

 

키값을 인증받는 코드 (map01.html 부분)

<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDEM3FEmY5ecJzAkXH9TDRAs1MaXpSWtME"
  type="text/javascript"></script>

- 그리고 initialize() 함수를 정의하고 있고, 아래쪽에서 버튼을 클릭시 호출할 함수이다

+ 키를 인증받는 이유 : 하루에 조회할 수 있는 횟수에 제약을 걸기위해

+ 이번엔 url에 callback 은 없다

 

- 위,경도를 강남역 기준으로 center 위치를 지정

- 마우스로 드래그시 맵이 움직인다

 

맵 가져오기 예제 3

- 마크 표시 나타나게 하기

- map02.html

<!DOCTYPE html>
<html>
<head>
<script src="http://maps.googleapis.com/maps/api/js">
</script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDEM3FEmY5ecJzAkXH9TDRAs1MaXpSWtME"
  type="text/javascript"></script>
  
<script>
var myCenter=new google.maps.LatLng(37.497975, 127.027506);

function initialize(){
var mapProp = {
  center:myCenter,
  zoom:18,
  mapTypeId:google.maps.MapTypeId.ROADMAP
  };

var map=new google.maps.Map(document.getElementById("googleMap"),mapProp);

var marker=new google.maps.Marker({
  position:myCenter,
  });

marker.setMap(map);
}

google.maps.event.addDomListener(window, 'load', initialize);
</script>
</head>

<body>
<div id="googleMap" style="width:500px;height:380px;"></div>
</body>
</html>

- 특정지역을 가리키는 마크표시를 나타나게 하는 방법이 추가되었다

- myCenter 변수에 위도 경도를 저장해서 center:myCenter 로 간단하게 위치 설정

 

마크 표시 나타나게 하기 (map02.html 부분)

var marker=new google.maps.Marker({
  position:myCenter,
  });

marker.setMap(map);
}

- marker 객체를 만들어서 마크를 만든다

- marker 를 어느위치에 출력할건지 position 에서 설정해야한다, 지금은 강남역으로 설정되었다

- 이후 아래에서 마커객체.setMap(맵객체) 메소드로 map에 marker 를 붙이는 작업을하고 있다

 

+ DOM Level 2 방식의 이벤트 처리 (map02.html 부분)

google.maps.event.addDomListener(window, 'load', initialize);

- 매개변수로 window 객체, 이벤트명, 호출할 함수

- load 이벤트는 현재 문서가 브라우저에 로딩될때 발생

- load 이벤트 발생시 initialize() 함수를 호출하하라는 의미

 

Map 객체 생성 (map02.html 부분)

var map=new google.maps.Map(document.getElementById("googleMap"),mapProp);

- 첫번째 매개변수로 맵을 나타낼 곳의 Element 를 구하고, 두번째 매개변수로 위치나 크기를 지정한 변수명을 넣는다

 

키 인증 코드

<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDEM3FEmY5ecJzAkXH9TDRAs1MaXpSWtME"
  type="text/javascript"></script>

 

 

맵 가져오기 예제 4

- 맵 마커에 애니메이션 주기

- map03.html

<!DOCTYPE html>
<html>
<head>
<script src="http://maps.googleapis.com/maps/api/js">
</script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDEM3FEmY5ecJzAkXH9TDRAs1MaXpSWtME"
  type="text/javascript"></script>
  
<script>
var myCenter=new google.maps.LatLng(37.497975, 127.027506);
var marker;

function initialize(){
var mapProp = {
  center:myCenter,
  zoom:18,
  mapTypeId:google.maps.MapTypeId.ROADMAP
  };

var map=new google.maps.Map(document.getElementById("googleMap"),mapProp);

var marker=new google.maps.Marker({
  position:myCenter,
  animation:google.maps.Animation.BOUNCE 
  });

marker.setMap(map);
}

google.maps.event.addDomListener(window, 'load', initialize);
</script>
</head>

<body>
<div id="googleMap" style="width:500px;height:380px;"></div>
</body>
</html>

- 마커가 바운스로 움직이는 타입으로 되어있다

- 나머지는 이전 예제 map02.html 과 같다

 

마커 바운스로 설정 (map03.html 부분)

var marker=new google.maps.Marker({
  position:myCenter,
  animation:google.maps.Animation.BOUNCE 
  });

- 마커에 대한 애니메이션 기능을 쓰고 있기때문에 마커객체를 만들때 animation 속성을 지정해줌

 

마커가 위아래로 움직이고 있다

 

+ DOM Level 2 방식 대신 onLoad 이벤트 핸들러로 이벤트 처리를 한다면?

<body onLoad="initialize()"></body>

- 이벤트 핸들러 방식으로 이벤트 처리

- 아래의 코드와 같은 기능

google.maps.event.addDomListener(window, 'load', initialize);

 

+ w3schools.com 에도 구글맵 관련 내용이 있다

 

맵 가져오기 예제 5

- map04.html

<!DOCTYPE html>
<html>
<head>
<script src="http://maps.googleapis.com/maps/api/js">
</script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDEM3FEmY5ecJzAkXH9TDRAs1MaXpSWtME"
  type="text/javascript"></script>
  
<script>
var myCenter=new google.maps.LatLng(37.497975, 127.027506);

function initialize(){
var mapProp = {
  center: myCenter,
  zoom:18,
  mapTypeId: google.maps.MapTypeId.ROADMAP
  };

var map = new google.maps.Map(document.getElementById("googleMap"),mapProp);

var marker = new google.maps.Marker({
  position: myCenter,
  title:'Click to zoom'
  });

marker.setMap(map);

// Zoom to 9 when clicking on marker
google.maps.event.addListener(marker,'click',function() {
  map.setZoom(20);
  map.setCenter(marker.getPosition());
  });
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>
</head>

<body>
<div id="googleMap" style="width:500px;height:380px;"></div>

</body>
</html>

- marker 를 클릭시 맵이 확대가 된다

- marker 객체 생성 시 title 속성을 지정했다, 마커에 마우스를 올리면 Click to zoom 이 나타남

 

marker (마커) 클릭 시 줌 하기 (map04.html 부분)

// Zoom to 9 when clicking on marker
google.maps.event.addListener(marker,'click',function() {
  map.setZoom(20);
  map.setCenter(marker.getPosition());
  });
}

- marker 를 클릭하면 클릭이벤트가 발생하고 그 이벤트를 DOM Level 2 방식으로 처리하고 있다

- map 객체에서 setZoom(20); 을 통해 클릭시 크기를 20 으로 확대

- map 객체의 setCenter() 메소드와 marker 객체의 getPosition() 메소드로 확대가 되더라도 marker 의 position 값을 다시 center 로 지정하고 있다

 

 

+ 프로젝트 시에 혼자서 자세히 공부하기, 구글 맵 외에도 카카오 맵으로도 만들어보자

- API 관련 내용도 공부

- 웹과 앱을 따로 인증 받아야함


jQuery UI

- jQuery 에는 기능이 많다, jQuery UI 와 jQuery Mobile 등이 있다

- 이미 다 만들어진 기능들을 가져다 쉽게 쓸 수 있다

 

실습 준비

+ https://jqueryui.com 에도 같은 내용이 있다

 

jQuery UI 예제 1

- index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Chapter 11. jQuery UI</title>
</head>
<body>
	<h1>Chapter 11. jQuery UI</h1>
	<ul>
		<li> <a href="example11_01.html"> 드래그 앤 드랍 기능 구현하기-draggable, droppable      </a> </li>
		<li> <a href="example11_02.html"> 엘리먼트의 크기 변경하기-resizable      </a> </li>
		<li> <a href="example11_03.html"> 엘리먼트를 선택 할 수 있게 하기-selectable         </a> </li>
		<li> <a href="example11_04.html"> 엘리먼트 이동하기-Sortable         </a> </li>
		<li> <a href="example11_05.html"> 헤더는 보이고 클릭했을때 내용이 보이도록 하는 아코디언 컨트롤-accordion         </a> </li>
		<li> <a href="example11_06.html"> 텍스트 박스 자동 완성 기능-Autocomplete         </a> </li>
		<li> <a href="example11_07.html"> 데이터 픽커로 날짜 선택하기-datepicker         </a> </li>
		<li> <a href="example11_08.html"> 탭 컨트롤-tabs                                                                   </a> </li>
	</ul>
</body>
</html>

- jQuery UI 기능 일부를 볼 수 있다

- 여러 예제들이 a 태그로 연결되어있어서 클릭 시 다양한 기능을 볼 수 있다

* jQuery UI 정리 아래에


jQuery UI 정리

* jQuery UI
- jQuery UI는 인터렉티브한 웹을 제공할 수 있도록 하는 인터페이스 개발 도구

- jQuery UI는 애니메이션 효과, 위젯을 쉽게 사용할 수 있도록 있도록 탭을 만들거나 경고 창을 띄우는 등의 효과를 줄 수 있다.

- jQuery UI 관련 웹 사이트
    http://jqueryui.com
 - jQuery UI 데모 사이트
    http://jquery.com/demos

 

- jQuery UI에서 제공하는 기능 (카테고리별)


1. 인터렉션(Interaction)
- Draggable
- Droppable
- Resizable
- Selectable
- Sortable

2. 위젯(Widgets)
- Accordion
- Autocomplate
- Button
- Datepicker
- Dialog
- Progressbar
- Slider
- Tabs

3. 유틸리티(Utilities)
  - Position

4. 이펙트(Effects)
 - Effect
 - Show
 - Hide
 - Toggle
 - Color animation
 - Add class, Remove class, Toggle class, Switch class

 

jqueryui.com 에서 기능 확인

ex) Draggable

 

소스 보기와 기능 적용하는 방법

- jQuery 라이브러리와 jQuery UI 라이브러리를 둘 다 불러와야한다

- 기능이 나타나게 할 태그의 id 값만 적고 draggable() 함수만 적용시 드래그 가능하게 된다

 

ex) Accordion 메뉴

소스 보기와 기능 적용하는 방법

- 내용을 감싼 태그를 가져와서 accordion() 함수만 사용하면 아코디언 메뉴가 적용된다

- jQuery 라이브러리와 jQuery UI 라이브러리를 둘 다 불러오고 있고 CSS 도 불러오고 있다

+ 부트스트랩에서도 아코디언 메뉴 지원함

 

ex) Autocomplete

- 특정 단어 입력시 그 단어 포함하는 단어들 보여줌

- 등록된 단어 중에서만 가능

- availableTags 배열안에 들어간 단어들 중에서 자동완성 가능

- input 태그를 구한 후 autocomplete() 함수만으로 자동완성 가능

- autocomplete() 함수 안에 source: 로 아까의 배열명인 availableTags 를 쓰기

 

ex) Datapicker

- 입력양식 클릭 시 달력모양을 보여줌

+ jquery UI 를 쓰지 않더라도 input type=text 가 아닌 input type=date 로 하면 기본적으로 캘린더가 나타남

* input type=date 사용시 설명 아래

+ 하지만 쓰지못하는 브라우저도 있으므로 어떤 브라우저든 캘린더가 잘 나타나는 jquery UI로 구현

 

 

ex) Tabs

- 먼저 윗부분에서 레이블값들을 출력한다

- 레이블값 태그의 a 태그 #을 통해서 클릭시 어떤 영역을 보여줄지 영역의 id값을 통해서 연결 가능하다 

+ 부트스트랩에서도 지원

 

그 외 효과들

확대

지우기

- 클릭 시 삭제

 

토글


* input type=date 사용시

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<br><br>
<input type=date></input>
</body>
</html>

크롬

- 하지만 웹 표준을 잘 지키지 않는 브라우저에서는 잘 나타나지 않는다



jQuery Mobile

실습 준비

- ch12/index.html

- 다양한 기능들이 많다

- ch13/index.html

- ch14/index.html

 

- jQuery UI 처럼 찾아보고 사용하기

- jQuery mobile 사이트 : https://jquerymobile.com

 

jQuery Mobile

Developer Links Seriously cross-platform with HTML5 jQuery Mobile framework takes the "write less, do more" mantra to the next level: Instead of writing unique applications for each mobile device or OS, the jQuery mobile framework allows you to design a si

jquerymobile.com


JSP

JSP

- HTML 로 만들어진 양식에 Javascript 로 유효성 검사를 하고 유효한 값을 전달, 그 값을 JSP 가 받아서 DB 연동 수행

- 게시판, 댓글 게시판, 자료실 등의 기능을 JSP로 처리 가능

 

JSP 방식

- Model1 방식과 Model2 방식이 있다

 

Model1 방식

- JSP 만으로 프로그램 개발, 단, DB 연동을 수행하는 경우엔 자바 클래스를 사용 DTO 클래스와 DAO 클래스를 사용

- 실무에서 많이 사용하지 않음

 

Model2 방식

- JS 파일에는 디자인 적 요소와 프로그램적 요소가 둘 다 있으므로 사이트 규모가 커지거나 사이트가 많아지면 관리가 힘들고 수정시 신경써야할 것이 많다 이런것들을 효율적으로 처리하기 위해 실무에서는 Model2 방식을 많이 사용

- Model2 : 크게 3가지 영역으로 기능을 분리시켜 개발하는 방식 MVC 패턴

- 70% 이상 자바코드로 작성, 인터페이스, 상속, 메소드 오버라이딩 개념 많이 사용

- 우리가 보는 페이지 View 페이지는 디자이너가 개발

- Model 과 Controller 는 개발자가 개발

- 디자인 요소와 개발 요소가 구분

 

학습 방향

- Model 1 먼저 배우고 Model 2 를 배울것

- Model 2 를 빠르게 구현하기 위해서 Spring 이나 Spring 부트를 사용한다

- 그 후 Spring 을 학습할 것, Spring 은 앞의 내용을 모두 알아야한다

 

+ Spring

- 어노테이션, 환경설정 때문에 어렵다

- 코드는 간결하게 처리되는 반면 값이 어떤식으로 리턴되는지 볼수 없다, 이해가 어렵다

+ 파이썬에서 Spring 과 비슷한 역할인 django

+ Springboot 는 환경설정이 자동인 부분이 많아서 쉽다


JSP 기초

- Java Server Pages 의 약자이며, HTML 코드에 JAVA 코드를 넣어 동적 웹페이지를 생성하는 웹어플리케이션 프로그램

- JSP 가 실행되면 작성한 JSP 파일들은 내부적으로는 자바 서블릿(Servlet) 형태로 변환되며, 웹 어플리케이션 서버에서 동작되면서 필요한 기능을 수행하고, 그렇게 생성된 데이터를 웹페이지와 함께 클라이언트로 응답한다.

- "자바" 기반 웹 프로그램

 

JSP 흐름

- 클라이언트측에서 값을 입력하고 서비스를 요청

- JSP를 쓰기 위해서는 아파치 톰캣같은 JSP Container 가 필요하다

- JSP Container 에서 서비스를 하는데 대표적인 Container 는 Apache Tomcat

- JSP 파일 생성시 클라이언트의 요청을 받게되고 내부적으로 JAVA Servlet 으로 변환

- Java Servlet 으로 변환시 확장자가 .java 로 변환

- 이때, 컴파일러를 통해서 바이트 코드로 변환(.class) 이 파일을 tomcat 이 실행함, 자바 서블릿 코드를 이용해서 처리하고 처리된결과를 HTML 로 바꿔서 HTML 로 뿌려줌(= 클라이언트 웹 브라우저에 응답)

 

+ 자바시간에 공부한건 JAVA application(내 컴에서만 실행, 안에 HTML 코드 추가 불가) 이고, JAVA Servlet 은 JAVA 로 만든 웹 프로그램으로서 안엔 HTML, Javascript 코드들이 들어감 

 

Model 1 방식

- 클라이언트가 JSP 로 요청시 대부분의 코드는 JSP만으로 처리

+ 물론 이때도 JavaBean(DTO, DAO 클래스 사용) 즉 일부 자바 사용

- 유지 보수를 쉽게하기 위해 Model 2 방식을 실무에서 많이 사용

 

Model 2

- MVC 패턴으로 분리, Model, View, Controller 로 3가지 영역으로 구분

- Controller 클래스는 Java Servlet 으로 만들고 중간의 흐름을 제어 어떤 서비스 콘텐츠를 넘겨줄건지

- Model 은 DB쪽의 데이터를 처리해줌, Service 클래스와 DAO 클래스가 주로 해당

- View 는 처리한 결과가 나타남

- 70% 이상 Java 코드 (View 페이지 제외 거의 Java 코드)

 

WAS

- 웹 어플리케이션 서버

- 오픈 소스 WAS 중 대표적인게 Apache Tomcat (무료)

 

WAS(Web Application Server) 종류

1. 오픈소스

- Apache Tomcat : 아파치 재단에서 관리하는 WAS

- Jetty : 이클립스 재단에서 관리하며, 임베디드 자바 애플리케이션에서 웹 서비스를 제공한다.

 

2. 상용 소프트웨어

- WebLogic : 오라클에서 관리하는 WAS

- JBoss : 레드헷에서 관리하는 WAS

- Jeus : 티맥스소프트에서 관리하는 제품으로써, 국내에서 많이 사용하고 있다

 

JSP 다운 방법

- 공식사이트 : https://tomcat.apache.org

- 이미 Tomcat 9점대 다운받았다, jre 에서 지원되는 라이브러리를 쓰므로 jre가 설치되어야만 apache tomcat 설치 가능

+ 우리가 쓰는 이클립스 버전이 낮은 버전이라 Tomcat 10점대 지원하지 않음

- 포트번호 설정시 이미 사용하고 있는 포트번호 사용하지 않도록 주의

+ 나는 8080 을 오라클에서 쓰고 있으므로 다른 포트번호 80으로 설정

+ 설치된 위치 알고 있기 

C:\Program Files\Apache Software Foundation\Tomcat 9.0

 

환경 구축 했던 글

https://laker99.tistory.com/86?category=1075935

 

웹브라우저로 접속

- http://localhost:80 로 접속시 C:\Program Files\Apache Software Foundation\Tomcat 9.0\webapps\ROOT\index.jsp 가 실행됨실행

 

개발시 주의

- 이클립스에서 작업시에 이 서비스를 중지시켜야함

- 중지하지 않으면 포트 충돌 발생

 

JSP 실습 준비

- 이미 Tomcat v9.0 설정된 상태다, 저번에 설정했음

- 확장자가 .java 인 자바 파일은 반드시 src 폴더 안에 저장되어야만 정상 동작한다

+ 바이트코드는 build\classes 에 저장됨

- 자바파일을 제외한 나머지 파일은(HTML, CSS, JS, JSP 파일) Content directory 하위에 모든 것을 저장해야 정상 접근 가능하다

- Generate web.xml deployment descriptor 에 체크해서 web.xml 파일 생성

-모든 .java 자바파일은 src 에 나머지 파일은 web.xml 에 저장해야만 정상 동작한다

 

- web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>jspproject</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

- WebContent 폴더 안의 파일을 찾는 순서이다.
ex) index.html 을 찾고 없으면 index.htm 을 찾고 없으면 index.jsp 를 찾고 없으면 default.html 을 찾는다

- 파일명을 생략하더라도 자동으로 실행되는 파일들의 이름이 적혀있다

- 파일명 생략시 default.jsp 에도 없으면 404 에러를 뿌림

 

- 그래서 첫 페이지는 index 를 파일명으로 주로 적음

- 위의 파일들은 파일명을 생략하더라도 실행이 잘 됨

 

 

+ 네이버 URL

http://www.naver.com/index.html
로 접속해야하지만 포트번호와 파일명을 생략하는 것임

 

JSP 파일 생성

- WebContent 하위에 index.jsp 파일 생성해보자

 

JSP 파일 작성

- index.jsp

- web.xml 파일에 있었으므로 index.jsp 는 생략해도 실행된다

 

URL 분석

http://localhost:80/jspproject/index.jsp

- localhost : 로 요청

- 80 : 포트번호 (80 이므로 생략 가능)

- jspproject : 프로젝트명, 이클립스로 실행할때는 즉 개발상에서는 jspproject 가 경로상에 포함되지만 나중엔빠짐

- index.jsp : 파일명 (index.jsp 이므로 생략 가능)

 

+ 프로젝트는 개발시에 필요한 것

 

환경설정 : 포트번호 설정 방법 2가지

1. Servers/server.xml 에서 포트번호 설정 가능, 현재 80 으로 설정되어있다

2. Servers 뷰에서 하위의 Tomcat 을 더블클릭 후 뜨는 창에서 포트 설정/수정 가능

 

폴더 및 파일 설명

- META-INF 폴더는 DB 접속 방법 중 Connection Pool 이 저장되어있는 폴더이다

- WEB-INF 폴더는 가장 먼저 실행되는 곳이므로 web.xml 은 여기 있어야한다

- WEB-INF 폴더의 lib 폴더에 라이브러리를 저장함, import / export 시 이 lib 파일도 같이 import / export 됨

- 당분간 라이브러리들을 WEB-INF/lib 폴더에 저장할 것

- 나중엔 라이브러리를 Maven 으로 관리할 것 (pom.xml)


JSP 5대 태그 소개

- 자세한 내용은 나중에 학습

- JSP 의 태그는 크게 5가지 종류가 있다

1. 스크립틀릿 태그

- <% %>

-  Java 코드나 JSP 코드가 들어감

- 거의 대부분의 코드가 들어감

 

2. 선언 태그

- <%! %>

- 매서드를 정의할 때는 반드시 선언태그에 쓴다

- 매서드를 만드는 규칙은 JAVA 문법을 따른다, 메서드를 만드는 일은 드뭄

 

3. 표현식 태그

- <%= %>

- 변수나 값을 브라우저에 출력가능

 

4. 지시어 태그

- 3가지 종류가 있다

1) 페이지 태그

2) 포함 태그 <%@ include %>

+ 부트스트랩에서 외부파일을 불러올때 사용했었다

3) 사용자 정의 태그

- taglib

 

5. 액션 태그

- 주로 페이지를 이동시킬때 쓰는 액션태그가 있고 자바와 연동할때 쓰는 액션태그가 있다

include, forward 는 페이지 이동이나 다른 페이지를 이동시킬때 사용하는 액션태그

usebeen, setProperty, getProperty 는 자바와 연동할때 사용하는 액션태그

 

JSP 내장객체

- Javascript 의 내장객체처럼 JSP 에서도 내장객체가 9개 있다

- JSP 에서 기본적으로 정의되기때문에 따로 정의없이 사용가능한 객체

 

 

1. request 객체

- 클라이언트가 get/post 로 요청할때 요청을 처리해주는 객체

- 지원되는 메소드 중 getParamenter() 메소드를 통해 넘어온 값을 받을 수 있다

 

2. response 객체

- 서버측에서 응답하는 객체

- 쿠키를 발행할때 사용하는 객체

 

3. session 객체

- 서버와 클라이언트 사이 연결을 유지하기 위한 객체

- 주로 회원관리 할때 사용됨

 

4. out 객체

- 브라우저에 출력시켜주는 객체

- 지원되는 메소드 중 println() 메소드를 통해 출력 가능

 

앞으로 학습할 것

- JSP

- JSP와 DB 연동

- Model 1 으로 각종 회원가입, 게시판 페이지 만들어볼 것

- Model2에선 MVC 패턴 배울것

- Java Servlet 으로 Container 클래스 만들고 값 전달하는 법

- Model 2 넘어가기 전에 표현언어 EL 공부, JSTL 공부(새로운 태그, 사용자 정의 태그)

- Model 2 로 회원가입, 게시판 등 만들것

 

 

jQuery 예제 52

유효성 검사 예제 직접 작성 3

- 유효성 검사

- ID중복검사에서 팝업창 띄워서 사용자의 아이디값을 전달하는 것을 jQuery 로 구현

- 주민번호 앞자리 6자리 입력하고 손을 떼면 key up 이벤트로 포커스를 뒤로 넘기는 것을 jQuery 로 구현

- E-Mail 입력에서 도메인명을 select 에서 선택하면 그 도메인이 입력양식에 나타나도록 하기

- 우편검색 버튼을 누르면 팝업에서 우편번호 검색이 가능하고 검색 후 회원가입 페이지로 값 가지고 돌아오기(API 사용)

- memberform.html 에 코드 추가

실습 준비

- select 에 id 값 부여, select 태그를 구해와야 하고 select 태그가 여러개이므로 구분이 필요

- 이 라디오버튼의 input 태그를 구해와야하므로 각각 id 값을 다르게 설정

- 각 취미도 input 태그를 구해오기 위해 각각 id 값을 다르게 설정

- 이미지 버튼 주석처리

- ID중복검사 버튼의 id 값 추가

- 취미 체크박스에 초기에 선택된 상태로 나타나지 않게 checked 속성 없애기

 

1. 라이브러리 불러오고 기본 jQuery 함수 쓰기

- 라이브러리 불러오기

- 기본 jQuery 함수 쓰기

- 라이브러리를 잘 불러왔는지 확인

 

2. 아이디 중복검사

0) 먼저 이벤트를 발생시키는 태그인 ID중복검사 버튼 태그의 id값을 구해야함

1) 아이디를 입력하지 않았을때는 입력하라는 메세지를 띄우고

- if~else문으로 아이디를 입력했는지 안했는지 확인 후 분기

2) 아이디를 입력했을때는 팝업창을 띄우기 window.open()

open("팝업창에 실행될 문서명", "윈도우 이름", "옵션"); // window.open

- 팝업창 문서는 idcheck.jsp 

3) 사용자가 입력한 아이디값을 팝업창으로 전달

- get 방식으로만 전달 가능하다

- 값은 ?변수명=값 으로 idcheck.jsp 로 전달됨

- $("#id").val()은 사용자가 입력한 값이고 그걸 'id' 변수에 전달하고 있다

 

+ Javascript 에서는 onClick 등으로 처리를 하거나 요소를 구하려면 getElementById() 사용

+ jQuery 에서는 먼저 이벤트를 발생시키는 태그를 구해야함

 

4) idcheck.jsp 파일 생성

- idcheck.jsp

- 자바나 JSP 를 쓸때는 스크립트 태그인 <% %> 안에 써야한다

- request 객체의 getParameter() 함수로 값을 받는다

- 함수 안의 "id" 는 아까 저장했던 변수명

- 가장 아래코드는 출력할때 코드

+ 나중에 팝업창 부분에서 DB 연동해서 select 해서 중복인지 확인해야함

- 결과 캡처

 

동기적 통신방식 vs 비동기적 통신방식

- 이건 동기적 통신방식이다

- 동기적인 통신 방식 : 한가지 요청이 끝나야 다음 요청 가능

- 동기적인 통신 방식 : 부모창에서 팝업창으로 페이지가 바뀌었다

- AJAX 는 비동기적인 방식

- AJAX에선 팝업창을 띄우지 않고 비동기적인 방식으로 ID중복검사 한다, 콜백함수로 값을 돌려받음

- AJAX에서 페이지를 바꾸지 않고 댓글달면 바로 DB에 insert 되고, 바로 콜백함수로 가져와서 뿌려줌

 

id 중복검사 부분 전체

- memberform.html id 중복검사 부분

- idcheck.jsp

 

3. 주민번호 뒷자리로 포커스 이동

- 주민번호 앞자리 입력한 후 손을 떼면 뒷자리로 포커스 이동

- keyup 이벤트 사용

- 값의 길이값이 정해져있는 경우에만 사용 가능 (ex) 카드번호, 주민등록번호)

 

0) 가장 먼저 이벤트를 발생시킨 태그 구하기

- keyup 이벤트는 주민번호 앞자리 input 태그에서 일어난다

 

1) 이벤트 처리

- 이벤트가 발생하는 태그는 주민번호 앞자리 input 태그

- 키를 눌렀다가 뗐을때 keyup 이벤트 발생

- focus() 통해 뒷자리에 focus 주기

 

2) 주민번호 앞자리 6자리가 모두 입력된 후에 뒷자리로 포커스가 가도록 하기

- 이렇게 if문 쓰지 않으면 한자리만 입력해도 손을 떼게 되므로 뒷자리로 focus가 넘어가버림

- length 속성을 통해 값이 6자리일때만 뒷자리에 focus가 넘어간다

- 이처럼 값의 길이값이 정해져 있는 경우에만 사용 가능

 

주민번호 뒷자리로 포커스 이동 전체

- memberform.html 주민번호 뒷자리로 포커스 이동 부분

 

4. Email 에서 도메인

- 도메인명을 직접입력하는 경우, 도메인명을 선택하는 경우가 있다, 나눠서 처리해야한다

- 직접 입력하는 경우 도메인명을 입력하는 곳에 포커스가 들어가야한다

- select 에서 도메인을 선택시 해당 도메인을 화면에 출력시키기

ex) 구글 선택시 google.com 을 입력양식에 나타나게 하기

 

0) 가장 먼저 이벤트를 발생시키는 태그를 구하기

- 이벤트를 발생시키는 태그는 위의 select 태그이다, select 태그가 여러개 이므로 id값을 통해 구해온다

 

1) change 이벤트로 처리

- 이벤트를 발생시키는 태그인 select 태그를 구해왔다

- select 에서 옵션 선택시 값의 변화가 일어나므로 change 이벤트 발생

 

2) 도메인을 직접 입력하는 경우 ('직접입력' 을 선택한 경우)

- if~else문으로 도메인을 직접 입력하는 경우와 선택하는 경우를 나눠서 처리한다

- select-option 에서 '직접입력'을 선택시 value 는 "" 이된다.

- '직접입력' 선택시 도메인 명을 입력하는 곳의 값을 지우고 focus 해야한다

- 도메인 입력하는 곳의 input 태그 id는 domain, 이 id로 태그를 구해온다

 

3) 도메인을 선택하는 경우

- 구글을 선택하는 경우 google.com 을 도메인 입력양식에 출력해야한다

- 도메인 입력양식 input 태그의 id는 domain

- 그리고 $("#email").val() 을 통해 선택된 옵션의 value 값을 구한 후 그 값을 도메인 입력양식에 설정

 

4) 도메인 영역의 값을 수정하지 못하도록 비활성화

- 도메인명을 선택한 후 이 값이 지워진다

- 도메인 지워지지 않도록 비활성화, readOnly 나 disabled 로 비활성화시키기

- 결과 캡처

- 선택된 도메인이 지워지지 않는다

- 문제는 다시 '직접입력' 을 선택했을때 값은 지워지지만 포커스가 들어가지 않음

- 설정된 readOnly 속성이 해제되지 않았기 때문이다

- 포커스(깜빡임)가 들어가지 않음

- 직접입력 을 선택했을때 readOnly 속성을 해제해줘야한다

- readOnly 속성을 해제해주면 다시 '직접입력' 선택시 포커스가 들어간다

 

+ readOnly (읽기전용) 설정 두가지 방법

+ readOnly (읽기전용) 해제 두가지 방법

 

+ readOnly vs disabled

- readOnly : name 값이 변수가 되어서 사용자가 입력한/선택한 값이 form 태그 action 의 페이지로 넘어감

- disabled : 값이 안넘어감

- 지금은 회원가입 버튼을 통해 이메일 주소값을 넘겨야하므로 readOnly 속성으로 비활성화 시키기

 

주민번호 뒷자리로 포커스 이동 전체

- memberform.html 주민번호 뒷자리로 포커스 이동 부분

 

5. 유효성 검사

0) 이벤트를 발생시키는 태그 구해오기

- 다른 이벤트와 달리 submit 버튼은 submit 버튼이 아니라 form 태그에 이벤트 처리를 해야한다

- 그리고 폼 관련 코드를 안에 넣어야한다

 

1) id, 비밀번호, 이름 유효성 검사

- id 유효성 검사를 한 뒤 나머지는 복사해서 만든다

- id 유효성 검사 완료

- 비밀번호,성명 부분도 복사, id값과 alert 메세지만 바꾸기

 

2) 주민번호 유효성 검사

- 주민번호 앞자리는 3가지를 검사

- 값이 입력되어야함

- 값의 길이값이 6자리 여야함

- 값이 숫자값이어야함

- 유효성 검사에 맞지 않으면 값을 지우고 focus 함

- 결과 캡처

- 주민번호 뒷자리도 복사해서 적용

- alert 메세지나 길이값만 수정

 

3) email 유효성 검사

- id, 비밀번호 유효성 검사와 비슷

- 도메인 부분도 복사해서 비슷하게 작성

 

3) 전화번호 유효성 검사

- 입력되었는지 확인

- 문자인지 숫자인지 확인

+ 숫자만 입력되도록 하기 위해 정규표현식을 쓰는 방법도 있다

- 전화번호 중간자리, 끝자리도 똑같이 처리를 한다

- 결과 캡처

 

 

4) 핸드폰 앞자리 유효성 검사

- 입력되었는지 확인

- 핸드폰 앞자리는 번호를 선택하는 곳

- 번호선택이 나타난 다는 것은 번호를 선택하지 않았다는 의미, 이때 value 가 ""이다

- 이걸 이용해서 유효성 검사를 한다

- 휴대폰 번호 중간자리와 끝자리도 똑같이 작성하고, 중간자리와 끝자리는 숫자인지 문자인지도 검사한다

- 결과 캡처

 

5) 우편검색 기능

- 카카오 API 를 활용해서 팝업창에서 우편번호와 주소를 검색 후 팝업창에서 부모창으로 값 가져오기

- 이전에 만들었던 javascript/member/memberform.html 의 내용을 가져와서 적용

- 이부분을 복사해서 가져오기

- 지금 작업하는 파일에 복붙

- 이 함수 openDaumPostcode() 를 '우편검색' 버튼 누르면 호출해야함

- 이건 자바스크립트로 처리하기, onClick 사용

- 이러면 '우편검색' 버튼 클릭시 함수 실행되며 팝업창이 뜸

 

- 주소 검색 후 클릭시 부모창으로 값이 넘어온다

- 이때 검색한 결과를 받는 함수가 콜백함수 oncomplete : function(data) {}

- 이 콜백함수의 매개변수가 data 이다, 이 data 가 값을 받고 data 통해서 부모창으로 전달

- data 에서 우편번호를 뽑아오는게 zonecode 이고 id값이 post 인 곳의 value 값으로 우편번호를 설정하라는 의미

- data 에서 주소를 뽑아오는게 address 이고 id값이 address 인 곳의 value 값으로 주소를 설정하라는 의미

+ 주석처리된 것은 과거 우편번호가 xx-xxx 였을때 앞자리, 뒷자리 따로 구했던 것

 

6) 우편번호, 주소 유효성 검사

- 기본적인 형식으로 입력값이 없는경우의 유효성 검사를 한다

 

6) 성별 라디오버튼 유효성 검사

- 두 라디오버튼 모두 선택하지 않은 경우

- is() 함수를 사용해서 is(":checked")로 체크가 되었는지 확인 가능

- 선택되었으면 true, 선택되지 않았으면 false 리턴

- 결과 캡처

 

6) 취미 체크박스 유효성 검사

- 두개이상을 선택하도록 한다

- 두가지 방법이 있다

1. 기존 자바스크립트에서 사용했던 방식

- id 값으로 해당 input 태그를 구해오고 is() 함수로 체크 유무를 파악하고 변수값에 +1 증가시켜 누적후 if문으로 확인

+ 사용자가 확인버튼을 눌렀을때 함수를 return false 로 빠져나감

2. 더욱 간결한 방식

- 체크가 되어있는 체크박스를 구해오는 내용이 jQuery 함수 안에 들어감

1. input:checkbox

- :checkbox 필터선택자로 input type=checkbox인 모든 체크박스를 구해옴 (input 태그 중)

2. input:checkbox[name='hobby']

- 체크박스가 다른 곳에도 있을 수 있으므로 체크박수 중 name 값이 hobby 로 되어있는 체크박스만을 모두 구해줌

3. input:checkbox[name='hobby']:checked

- name값이 hobby 인 체크박스 중에서도 :checked 로 체크되어있는 체크박스의 input 태그를 구해오라는 의미

- 그 후 length 속성으로 구해진 체크박스의 개수를 구한다 (가능)

 

7) 자기소개 textarea 유효성 검사

- id 값으로 태그를 구해와도 되고 textarea 태그는 하나이므로 textarea 태그로 구해와도 된다

- 입력되었는지 검사한다

- 100 자 이내여야 한다

- 결과 캡처

 

+ reset 버튼은 이벤트 처리를 하지 않아도 자체적으로 지워주는 기능 있다

 

8) 작성한 내용을 외부파일로 빼기

- .js 파일이어야한다

- member.js 파일 생성

- 자바스크립트에서는 .js 외부파일에 함수단위로 내용이 들어갔지만 제이쿼리에서는 작성한 전체가 들어감

- $(document).ready() 부터 마지막 까지 복사 후 주석 처리

- member.js 파일에 붙여넣기

- 이 member.js 에는 <script></script> 하면 안되고 내용만 들어가야 한다

- memberform.html 에서 외부파일 불러오기

- 결과 캡처

- 외부파일 member.js 를 잘 불러왔음을 알 수 있다

 

위 예제 전체코드

- memberform.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입 폼</title>

<script src="http://dmaps.daum.net/map_js_init/postcode.v2.js"></script>
<script>
	function openDaumPostcode() {
		new daum.Postcode({
			oncomplete : function(data) {
				// 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.
				// 우편번호와 주소 정보를 해당 필드에 넣고, 커서를 상세주소 필드로 이동한다.
//				document.getElementById('join_zip1').value = data.postcode1;
//				document.getElementById('join_zip2').value = data.postcode2;
				document.getElementById('post').value = data.zonecode;
				document.getElementById('address').value = data.address;
				
			}
		}).open();
	}
</script>

<script src="http://code.jquery.com/jquery-latest.js"></script>

<!-- 외부 jQuery 파일 불러오기 -->
<script src="member.js"></script>

<script>
/* 	$(document).ready(function(){

		// ID 중복검사
		$("#idcheck").click(function(){
			
			if($("#id").val() == "") {
				alert("ID를 입력하세요.")
				$("#id").focus();
				return false;
			} else {
				// open("팝업창에 실행될 문서명", "윈도우 이름", "옵션");
				var ref="idcheck.jsp?id="+$("#id").val();
				window.open(ref,"mywin","width=250, height=150");
			}
			
		});
		
		// 주민번호 뒷자리로 포커스 이동
		$("#jumin1").keyup(function(){
			
			if($("#jumin1").val().length == 6)
				$("#jumin2").focus();
		});
		
		// 도메인 선택
		$("#email").change(function(){
			if($("#email").val() == "") {	// '직접입력' 선택
				$("#domain").val("").focus();
				$("#domain").attr("readOnly", false);	//읽기 전용 해제
				// $("#domain").removeAttr("readOnly");	// 위와 같다
			}else {							// '도메인' 선택
				$("#domain").val($("#email").val());
				$("#domain").attr("readOnly", "readOnly");	// 읽기 전용
				// $("#domain").attr("readOnly", true)	// 위와 같다
			}
		});
		
		// 유효성 검사
		$("form").submit(function(){
			
			if($("#id").val() == ""){
				alert("ID를 입력하세요.");
				$("#id").focus();
				return false;
			}
			if($("#passwd").val() == ""){
				alert("비밀번호를 입력하세요.");
				$("#passwd").focus();
				return false;
			}
			if($("#name").val() == ""){
				alert("이름을 입력하세요.");
				$("#name").focus();
				return false;
			}
			if($("#jumin1").val() == ""){
				alert("주민번호 앞자리를 입력하세요.");
				$("#jumin1").focus();
				return false;
			}
			if($("#jumin1").val().length != 6){
				alert("주민번호 앞자리 6자리를 입력하세요.");
				$("#jumin1").val("").focus();
				return false;
			}
			// isNaN() : 문자가 포함되면 true를 리턴
			if(isNaN($("#jumin1").val())){
				alert("숫자만 입력하세요.");
				$("#jumin1").val("").focus();
			}
			if($("#jumin2").val() == ""){
				alert("주민번호 뒷자리를 입력하세요.");
				$("#jumin2").focus();
				return false;
			}
			if($("#jumin2").val().length != 7){
				alert("주민번호 뒷자리 7자리를 입력하세요.");
				$("#jumin2").val("").focus();
				return false;
			}
			// isNaN() : 문자가 포함되면 true를 리턴
			if(isNaN($("#jumin2").val())){
				alert("숫자만 입력하세요.");
				$("#jumin2").val("").focus();
			}
			if($("#mailid").val() == ""){
				alert("EMail 주소를 입력하세요.");
				$("#mailid").focus();
				return false;
			}
			if($("#domain").val() == ""){
				alert("도메인명을 입력하세요.");
				$("#domain").focus();
				return false;
			}
			if($("#tel1").val() == ""){
				alert("전화번호 앞자리를 입력하세요.");
				$("#tel1").focus();
				return false;
			}
			if(isNaN($("#tel1").val())){
				alert("숫자만 입력하세요.");
				$("#tel1").val("").focus();
				return false;
			}
			if($("#tel2").val() == ""){
				alert("전화번호 중간자리를 입력하세요.");
				$("#tel2").focus();
				return false;
			}
			if(isNaN($("#tel2").val())){
				alert("숫자만 입력하세요.");
				$("#tel2").val("").focus();
				return false;
			}
			if($("#tel3").val() == ""){
				alert("전화번호 끝자리를 입력하세요.");
				$("#tel3").focus();
				return false;
			}
			if(isNaN($("#tel3").val())){
				alert("숫자만 입력하세요.");
				$("#tel3").val("").focus();
				return false;
			}
			if($("#phone1").val() == "") {
				alert("핸드폰 번호 앞자리를 선택하세요.");
				$("#phone1").focus();
				return false;
			}
			if($("#phone2").val() == "") {
				alert("핸드폰 번호 중간자리를 선택하세요.");
				$("#phone2").focus();
				return false;
			}
			if(isNaN($("#phone2").val())) {
				alert("숫자만 입력하세요.");
				$("#phone2").val().focus();
				return false;
			}
			if($("#phone3").val() == "") {
				alert("핸드폰 번호 뒷자리를 선택하세요.");
				$("#phone3").focus();
				return false;
			}
			if(isNaN($("#phone3").val())) {
				alert("숫자만 입력하세요.");
				$("#phone3").val().focus();
				return false;
			}
			if($("#post").val() == "") {
				alert("우편번호를 선택하세요.");
				$("#post").focus();
				return false;
			}
			if($("#address").val() == "") {
				alert("주소를 선택하세요.");
				$("#address").focus();
				return false;
			}
			if($("#male").is(":checked") == false &&
				$("#female").is(":checked") == false ){
				alert("성별을 선택하세요.");
				return false;
			}
			
//			var cnt = 0;
//			if($("#h1").is(":checked")) cnt++;
//			if($("#h2").is(":checked")) cnt++;
//			if($("#h3").is(":checked")) cnt++;
//			if($("#h4").is(":checked")) cnt++;
//			if($("#h5").is(":checked")) cnt++;
//			
//			if(cnt < 2) {
//				alert("취미를 2개 이상 선택하세요.");
//				return false;
//			}
			
			if($("input:checkbox[name='hobby']:checked").length < 2){
				alert("취미를 2개 이상 선택하세요.");
				return false;
			}
			
			if($("#intro").val() == "") {
				alert("자기소개를 선택하세요.");
				$("#intro").focus();
				return false;
			}
			if($("#intro").val().length > 100) {
				alert("자기소개를 100자 이내로 입력하세요.");
				$("#intro").focus();
				return false;
			}
			
		});	// submit() end
		
		
	}); */
</script>

</head>
<body>

<form method="post" action="member.jsp">
<table border=1 width=600 align=center>
	<caption>회원 가입폼</caption>
	<tr>
		<th>ID</th>
		<td><input type=text name="id" id="id" autofocus="autofocus">
			<input type="button" value="ID중복검사" id="idcheck">
		</td>
	</tr>
	<tr>
		<th>비밀번호</th>
		<td><input type=password name="passwd" id="passwd">
		</td>
	</tr>
	<tr>
		<th>성명</th>
		<td><input type=text name="name" id="name">
		</td>
	</tr>
	<tr>
		<th>주민번호</th>
		<td><input type=text size=6 maxlength=6 name="jumin1" id="jumin1">-
			<input type=text size=7 maxlength=7 name="jumin2" id="jumin2">
		</td>
	</tr>
	<tr>
		<th>E-Mail</th>
		<td><input type=text size=10 name="mailid" id="mailid">@
			<input type=text size=15 name="domain" id="domain">
			<select id="email">
				<option value="">직접입력</option>
				<option value="naver.com">네이버</option>
				<option value="daum.net">다음</option>
				<option value="nate.com">네이트</option>
				<option value="gmail.com">구글</option>
			</select>
		</td>
	</tr>
	<tr>
		<th>전화번호</th>
		<td>
			<input type=text size=4 maxlength=4 name="tel1" id="tel1">-
			<input type=text size=4 maxlength=4 name="tel2" id="tel2">-
			<input type=text size=4 maxlength=4 name="tel3" id="tel3">
		</td>
	</tr>
	<tr>
		<th>핸드폰</th>
		<td><select name="phone1" id="phone1">
				<option value="">번호선택</option>
				<option value="010">010</option>
				<option value="011">011</option>
				<option value="016">016</option>
				<option value="018">018</option>
				<option value="019">019</option>
			</select>-
			<input type=text size=4 maxlength=4 name="phone2" id="phone2">-
			<input type=text size=4 maxlength=4 name="phone3" id="phone3">
		</td>
	</tr>
	<tr>
		<th>우편번호</th>
		<td><input type=text size=5 maxlenth=5 name="post" id="post">
			<input type="button" value="우편검색" onClick="openDaumPostcode()">
		</td>
	</tr>
	<tr>
		<th>주소</th>
		<td><input type=text size=70 name="address" id="address">
		</td>
	</tr>
	<tr>
		<th>성별</th>
		<td><input type="radio" id="male" name="gender" value="남자">남자
			<input type="radio" id="female" name="gender" value="여자">여자
		</td>
	</tr>
	<tr>
		<th>취미</th>
		<td><input type="checkbox" id="h1" name="hobby" value="공부">공부
			<input type="checkbox" id="h2" name="hobby" value="등산">등산
			<input type="checkbox" id="h3" name="hobby" value="게임">게임
			<input type="checkbox" id="h4" name="hobby" value="낚시">낚시
			<input type="checkbox" id="h5" name="hobby" value="쇼핑">쇼핑
		</td>
	</tr>
	<tr>
		<th>자기소개</th>
		<td><textarea rows="5" cols="70"
				name="intro" id="intro"
				placeholder="자기소개를 100자 이내로 입력하세요"></textarea>
		</td>
	</tr>
	<tr>
		<td colspan=2 align=center>
			<input type="submit" value="회원가입">
			<input type="reset" value="취소">
			
			<!-- 이미지 버튼 : 전송 기능 있음 -->
			<!-- <input type="image" src="img/clock.jpg" width=30> -->
		</td>
	</tr>
</table>
</form>

</body>
</html>

- member.js

	$(document).ready(function(){

		// ID 중복검사
		$("#idcheck").click(function(){
			
			if($("#id").val() == "") {
				alert("ID를 입력하세요.")
				$("#id").focus();
				return false;
			} else {
				// open("팝업창에 실행될 문서명", "윈도우 이름", "옵션");
				var ref="idcheck.jsp?id="+$("#id").val();
				window.open(ref,"mywin","width=250, height=150");
			}
			
		});
		
		// 주민번호 뒷자리로 포커스 이동
		$("#jumin1").keyup(function(){
			
			if($("#jumin1").val().length == 6)
				$("#jumin2").focus();
		});
		
		// 도메인 선택
		$("#email").change(function(){
			if($("#email").val() == "") {	// '직접입력' 선택
				$("#domain").val("").focus();
				$("#domain").attr("readOnly", false);	//읽기 전용 해제
				// $("#domain").removeAttr("readOnly");	// 위와 같다
			}else {							// '도메인' 선택
				$("#domain").val($("#email").val());
				$("#domain").attr("readOnly", "readOnly");	// 읽기 전용
				// $("#domain").attr("readOnly", true)	// 위와 같다
			}
		});
		
		// 유효성 검사
		$("form").submit(function(){
			
			if($("#id").val() == ""){
				alert("ID를 입력하세요.");
				$("#id").focus();
				return false;
			}
			if($("#passwd").val() == ""){
				alert("비밀번호를 입력하세요.");
				$("#passwd").focus();
				return false;
			}
			if($("#name").val() == ""){
				alert("이름을 입력하세요.");
				$("#name").focus();
				return false;
			}
			if($("#jumin1").val() == ""){
				alert("주민번호 앞자리를 입력하세요.");
				$("#jumin1").focus();
				return false;
			}
			if($("#jumin1").val().length != 6){
				alert("주민번호 앞자리 6자리를 입력하세요.");
				$("#jumin1").val("").focus();
				return false;
			}
			// isNaN() : 문자가 포함되면 true를 리턴
			if(isNaN($("#jumin1").val())){
				alert("숫자만 입력하세요.");
				$("#jumin1").val("").focus();
			}
			if($("#jumin2").val() == ""){
				alert("주민번호 뒷자리를 입력하세요.");
				$("#jumin2").focus();
				return false;
			}
			if($("#jumin2").val().length != 7){
				alert("주민번호 뒷자리 7자리를 입력하세요.");
				$("#jumin2").val("").focus();
				return false;
			}
			// isNaN() : 문자가 포함되면 true를 리턴
			if(isNaN($("#jumin2").val())){
				alert("숫자만 입력하세요.");
				$("#jumin2").val("").focus();
			}
			if($("#mailid").val() == ""){
				alert("EMail 주소를 입력하세요.");
				$("#mailid").focus();
				return false;
			}
			if($("#domain").val() == ""){
				alert("도메인명을 입력하세요.");
				$("#domain").focus();
				return false;
			}
			if($("#tel1").val() == ""){
				alert("전화번호 앞자리를 입력하세요.");
				$("#tel1").focus();
				return false;
			}
			if(isNaN($("#tel1").val())){
				alert("숫자만 입력하세요.");
				$("#tel1").val("").focus();
				return false;
			}
			if($("#tel2").val() == ""){
				alert("전화번호 중간자리를 입력하세요.");
				$("#tel2").focus();
				return false;
			}
			if(isNaN($("#tel2").val())){
				alert("숫자만 입력하세요.");
				$("#tel2").val("").focus();
				return false;
			}
			if($("#tel3").val() == ""){
				alert("전화번호 끝자리를 입력하세요.");
				$("#tel3").focus();
				return false;
			}
			if(isNaN($("#tel3").val())){
				alert("숫자만 입력하세요.");
				$("#tel3").val("").focus();
				return false;
			}
			if($("#phone1").val() == "") {
				alert("핸드폰 번호 앞자리를 선택하세요.");
				$("#phone1").focus();
				return false;
			}
			if($("#phone2").val() == "") {
				alert("핸드폰 번호 중간자리를 선택하세요.");
				$("#phone2").focus();
				return false;
			}
			if(isNaN($("#phone2").val())) {
				alert("숫자만 입력하세요.");
				$("#phone2").val().focus();
				return false;
			}
			if($("#phone3").val() == "") {
				alert("핸드폰 번호 뒷자리를 선택하세요.");
				$("#phone3").focus();
				return false;
			}
			if(isNaN($("#phone3").val())) {
				alert("숫자만 입력하세요.");
				$("#phone3").val().focus();
				return false;
			}
			if($("#post").val() == "") {
				alert("우편번호를 선택하세요.");
				$("#post").focus();
				return false;
			}
			if($("#address").val() == "") {
				alert("주소를 선택하세요.");
				$("#address").focus();
				return false;
			}
			if($("#male").is(":checked") == false &&
				$("#female").is(":checked") == false ){
				alert("성별을 선택하세요.");
				return false;
			}
			
//			var cnt = 0;
//			if($("#h1").is(":checked")) cnt++;
//			if($("#h2").is(":checked")) cnt++;
//			if($("#h3").is(":checked")) cnt++;
//			if($("#h4").is(":checked")) cnt++;
//			if($("#h5").is(":checked")) cnt++;
//			
//			if(cnt < 2) {
//				alert("취미를 2개 이상 선택하세요.");
//				return false;
//			}
			
			if($("input:checkbox[name='hobby']:checked").length < 2){
				alert("취미를 2개 이상 선택하세요.");
				return false;
			}
			
			if($("#intro").val() == "") {
				alert("자기소개를 선택하세요.");
				$("#intro").focus();
				return false;
			}
			if($("#intro").val().length > 100) {
				alert("자기소개를 100자 이내로 입력하세요.");
				$("#intro").focus();
				return false;
			}
			
		});	// submit() end
		
		
	});

 

+ '회원가입' 버튼을 누르면 member.jsp 로 값이 넘어가고, 이 양식을 사용해서 JSP 를 공부할때 한다

+ DB의 제약조건에 위배되지 않는 값만 입력되므로 프론트엔드에서 조건에 맞는 값만 전달하도록 하는 것


Ajax

- 비동기적으로 처리하는 통신 기술

- 자주 사용되는 경우가 정해져 있다

ex) ID중복검사 시 팝업창 띄우지 않고 바로 ID중복검사, 댓글달때 페이지를 바꾸지 않고 댓글달기

- ajax.war 파일 다운 후 import 하면 안에 비동기적으로 ID중복검사 하는 것들이 구현되어있음

 

Ajax 정리

- 새로운 언어는 아니다, 자바스크립트가 가진 기본적인 기능

- Asynchronous JavaScript + XML (비동기 자바스크립트와 XML 을 결합한 기술)

- JavaScript와 XML을 이용한 비동기 통신처리를 구현하는 기술

 

동기적 통신 방식

- 클라이언트가 서버측에 요청 후, 서버측에서 응답을 해야만 다음 요청 가능

- 특징 : 페이지가 바뀐다

- action 값으로 지정된 페이지로 post/get 방식으로 요청, 서버측에서는 request 객체로 요청을 받는다(응답), 변수에 저장하고 insert 시킴, 이런 작업이 완전히 끝나야만 다시 요청하고 응답 가능 우리가 쓰고 있는 방법

- 팝업창을 띄우는것도 부모창에서 팝업창으로 페이지가 바뀐 것

 

비동기적 통신 방식

- 클라이언트가 서버에 요청하고, 서버측에서 응답을 하기 전에 (응답이 오기 전에) 클라이언트에서 또 요청을 할 수 있다

- 특징 : 페이지가 바뀌지 않는다

- 페이지를 바꾸지 않고, 콜백함수로 결과를 돌려받아서 사용가능/사용중 메세지 뿌림

 

 

XML

- 클라이언트가 요청하면 서버측에서 결과를 돌려줄때 xml 형태로 결과를 많이 돌려줌

- 일반적인 태그와 다른 점은 태그들을 직접 임의로 만들어 쓸 수 있다는 점

- 지금은 xml 을 대신하는 포멧으로 json 을 많이 쓴다

- xml 과 json은 데이터 포멧, 저장 포멧이다

- 공공데이터는 xml 이나 json 중 하나로 많이 돌려줌

ex) 기상청 날씨정보는 xml 로 많이 돌려준다, 그걸 조작해서 필요한 형태로 바꿔서 사용하는 것

+ 직접 xml 파일을 만드는 경우는 적다, 문법은 공부할 것

 

JSON

- JavaScript Object Notation

- 자바스크립트 객체를 표기하기 위한 표기법 중 한가지, 새로운 언어가 아님

 - JSON은 JavaScript Object Notation 의 약어로 XML 데이터를 대신하기 위해서 사용된다.
- JSON은 키와 값을 쌍으로 가지는 구조이다, 자바의 Map 자료구조와 비슷

- 자바에선 Map, 파이썬에선 딕셔너리, Javascript 에선 JSON
- 배열을 사용할 때는 대괄호([ ])안에 중괄호({ })를 사용하여 조합한다.
- jQuery에서는 JSON으로 표현한 데이터를 파일에 저장해 두었다가 필요할 때 이를 로드할 수 있는  $.getJSON()함수를 제공한다.

- 비동기적으로 서버에 요청하고, 콜백함수를 통해 결과를 돌려받을때 사용

 

jQUery 지원 함수

- 아래 함수 모두 비동기적으로 서버측에 요청을 하는 함수이고 콜백함수를 통해 결과를 받을 수 있는 함수이다

$.ajax() : get 방식으로 요청할지, post 함수로 요청할지 선택 가능
$.get() : get 방식으로 서버측에 비동기로 요청하는 함수 / get 방식으로 Ajax을 수행한다.
$.post() : post 방식으로 서버측에 비동기로 요청하는 함수 / post 방식으로 Ajax을 수행한다.
$.getJSON() : get 방식으로 서버측에 요청하고 (Ajax를 수행하고) JSON 데이터를 가져온다.
$.getScript() : get 방식으로 (Ajax를 수행하고) Script 데이터를 가져온다.
$(selector).load() : Ajax를 수행한 후에 선택한 문서 객체안에 응답받을 파일(문자열)을 불러온다 / load() 안에 쓰인 파일명의 문서를 한꺼번에 불러와서 앞의 선택자 자리에 출력시킴

* Ajax 를 수행 = 서버측에 요청하고 응답을 받음

- 이 함수들로 서버측에 비동기적으로 요청

- 사용 예시

$.ajax({
    url : "전송 페이지",
    type : "전송 방식(get, post방식),
    data : "전송할 데이터(값 가져갈때/json 형태 키밸류형태로 전달)",
    dataType : "요청한 데이터 타입("html","xml","json","text"),
    success : function(result){ 전송 성공하면 실행될 문장; // 응답을 받는 곳 이 함수를 콜백함수라고 함
   }
});

- 콜백함수의 매개변수 result 로 값을 돌려받음

- 이 값을 조작해서 사용해야함
+ React 등 언어가 바뀌더라도 비동기로 처리해야하는 기술들은 익혀야함

 - Ajax 실습 준비

- 다 설명한 후 Ajax(6) 폴더 안의 ajax.war 파일을 다운받아 import 하면 구현 되어있다

 

비동기로 서버에 요청하는 함수

load() 함수

- $("출력시킬 태그").load("요청할 파일명");

- 특정 서버측의 문서를 불러옴, 안에는 특정 파일명이 들어간다

- 서버측에 비동기적으로 요청하고, 서버측의 지정된 파일의 내용을 모두 불러와서 앞의 태그에 결과 출력 시켜주는 역할

 

Ajax 예제 1

load() 함수 예제 1

 

- sample1.html

<!DOCTYPE html>
<html>
<head>
	<title>sample1</title>
	<meta charset="UTF-8">
		
		<script src="http://code.jquery.com/jquery-1.11.1.js">
		</script>

		<script type="text/javascript">

$(function(){
	$("button").click(function(){
		// sample1.txt 파일의 결과를 load 함수로 불러와서 p 태그 사이에 출력
		$("p").load("sample1.txt");
	});
});
		</script>
	</head>
	<body>
		<button>변경</button>
		<p>변경전</p>
	</body>
</html>

sample1.txt 내용

+ jQuery 라이브러리를 불러옴, 버튼이 클릭되어 click 이벤트 발생시 안의 내용 실행

- 페이지를 바꾸지 않고 load() 함수를 이용해서 서버에 sample1.txt 란 파일을 요청을 함

- 그럼 sample1.txt 파일의 내용을 모두 불러와서 앞쪽의 선택한 태그 안에 출력시켜라는 의미

- sample1.txt 가 브라우저에 출력되는 결과(내용)를 load() 로 불러와서 p 태그 안에 출력

- load() 함수 : 서버측의 지정된 파일의 내용을 모두 불러와서 앞의 태그에 결과 출력 시켜주는 역할, 비동기적으로 요청해주는 함수

 

+ 나중엔 sample1.txt 자리에 jsp 파일이나 html 파일 등 들어감

 

Ajax 예제 2

load() 함수 예제 2

- sample09_02.html

- 이전의 예제와 다른 점 : sample1.txt 대신 resource.html 파일을 불러오고 있다

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>서버의 데이터를 대상 엘리먼트에 삽입하기</title>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>

<script type="text/javascript">
$(function() {	
	$('button').click(function() {
		// resource.html 파일의 출력 결과를 load함수로 불러와서 div영역에 출력
		$('#container').load('resource.html');
	});   
});
</script>

</head>
<body>
	<button> 서버로부터 데이터 가져오기 </button>
	<div id="container"> 데이터 가져오기 전 </div>
</body>
</html>

resource.html 내용

- resource.html 을 불러오면 이 resource.html 파일이 브라우저에 출력되는 내용(결과)을 load() 함수로 불러와서 id값이 container인 div 태그 영역에 출력된다.

- load() 함수로 resource.html 의 내용을 불러와서 출력해줌

- 비동기로 요청하거 있으므로 페이지가 바뀌지 않음

 

Ajax 예제 3

load() 함수 예제 3

- 파일 내용 중 특정 태그의 내용만 불러오기

- sample09_03.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>서버의 데이터를 대상 엘리먼트에 삽입하기</title>
<style type="text/css">
div {
  width: 180px;  height: 80px;
  margin: 3px;   float: left;
}
</style>
<script src="http://code.jquery.com/jquery-1.11.1.js" type="text/javascript"></script>
<script type="text/javascript">

/*
	- jQuery에서 제공해주는 load()함수를 사용해서 서버의 menu.html 페이지의 데이터를 가져와서 특정 엘리먼트에 추가한다.
*/

$(function() {	
	   $('#menu1').click(function () {           
		  	 $('#message1').load('menu.html');     // load()함수를 이용해서 menu.html 문서전체를 로드하여 id가 message1인
		  	 return false;						   // 엘리먼트에 추가한다.
		});
	   
	   $('#menu2').click(function () {          
		  	 $('#message2').load('menu.html li'); // load()함수를 이용해서 menu.html 문서의 내용중 li 엘리먼트만 읽어서 id가
			 return false;                        // message2인 엘리먼트에 추가한다.
		});
});
</script>
</head>
<body>
<div>
	<a href="#" id="menu1">메뉴 보기 1</a><p>
	<span id="message1"></span>
</div>
<div>
	<a href="#" id="menu2">메뉴 보기 2</a><p>
	<span id="message2"></span>
</div>	
</body>
</html>

menu.html 내용

- '메뉴 보기1' 과 '메뉴 보기 2' 를 a 태그로 링크를 걸어둠, a 태그 구분을 위해 id 값을 설정

- '메뉴 보기1' 을 클릭시 click() 함수 안에서 load() 함수를 통해 menu.html 전체 내용을 불러와서 id값이 message1 인 span 태그 사이에 출력

		  	 $('#message1').load('menu.html');

- '메뉴 보기2' 을 클릭시 click() 함수 안에서 load() 함수를 통해 menu.html 중에서 li 태그에 있는 내용만 불러와서 id값이 message2 인 span 태그 사이에 출력

		  	 $('#message2').load('menu.html li');

- menu.html 다음 한칸 띄우고 태그명을 쓰면 -> menu.html 내용 중에서 그 태그(li 태그)만 load() 함수로 불러온다

- 한칸 띄운다는 건 자손태그를 의미

+ return false; 를 통해 클릭을 해도 하이퍼링크가 실행되지 않도록 막아줌

- 비동기로 요청하거 있으므로 페이지가 바뀌지 않음

- menu.html 파일의 모든 내용을 불러와서 출력

- menu.html 파일의 내용 중 일부만 불러와서 출력 (li 태그 안의 내용만 불러와서 출력)

- 비동기로 요청하거 있으므로 페이지가 바뀌지 않음

 

비동기로 서버에 요청하는 함수

$.ajax() 함수

- load() 함수와 다르게 많은 옵션들이 있다, 다양한 기능 쓸 수 있다

ex) 옵션들

- ajax() 함수 특징 :  get 방식으로 요청할지 post 방식으로 요청할지 type : 에서 선택 가능

 

 

Ajax 예제 4

ajax() 함수 예제 1

- Ajax 요청 직접 제어하기

- ajax() 함수로 요청 하고 값을 받기

- load() 함수로 처리했던 것과 같은 결과를 ajax() 로 처리

- sample09_04.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>서버의 데이터를 대상 엘리먼트에 삽입하기</title>
<style type="text/css">
div {
  width: 200px;  height: 80px;
  margin: 3px;  float: left;
}
</style>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script type="text/javascript">

/*
	- load()를 이용했던 예제를 $.ajax() 함수를 사용해서 구현
	- $.ajax()함수는 Ajax 요청을 설정하고 제어할 수 있도록 jQuery에서 제공하는 유틸리티 함수이다.i

*/

$(function() {	

/*   
	- $.ajax()함수를 실행할 때 옵션으로 URL값(menu.html)을 지정하면 해당 URL서버로 Ajax요청을 한다.
	- success 옵션에 지정한 콜백함수(function(data))는 요청이 성공했을 때 호출된다.
    - 서버로부터 응답받은 데이터는 콜백함수의 매개변수로 전달된다.
	- $.ajax()함수는 서버에서 반환되는 데이터의 형식에 따라 다르게 동작한다.
	  서버측에서 html데이터를 반환하면 html을 받아와 처리하기 위해서 데이터 타입(dateType) 옵션에 html을 지정한다.
*/
	   $('#menu1').click(function () {     
		   $.ajax({								
			    url:'menu.html', // 서버의 불러올 파일명
			    dataType:"html",
			    success: function(data){        // 서버로부터 응답받은 데이터는 콜백함수의 매개변수로 전달된다.
			    	$('#message1').html(data);  // 콜백함수로 전달된 data를 id가 message1인 엘리먼트에 설정한다.
			    }
		   });
		   return false;   
		});
	   
	   $('#menu2').click(function () {   
		   $.ajax({
			    url:'menu.html',
			    dataType:"html",
			    success: function(data){	     // 서버로부터 응답받은 데이터는 콜백함수의 매개변수로 전달된다.	    	
		$('#message2').html($(data).find('li')); // menu.html문서의 내용중 li엘리먼트만 읽어서 id가 message2인
			    }										     // 엘리먼트에 설정한다.
		    });
			return false;   
		});
});
</script>
</head>
<body>
<div>
	<a href="#" id="menu1">메뉴 보기 1</a><p>
	<span id="message1"></span>
</div>
<div>
	<a href="#" id="menu2">메뉴 보기 2</a><p>
	<span id="message2"></span>
</div>	
</body>
</html>

 

ajax 함수 (sample09_04.html '메뉴 보기 1' 부분)

		   $.ajax({								
			    url:'menu.html', // 서버의 불러올 파일명
			    dataType:"html",
			    success: function(data){        // 서버로부터 응답받은 데이터는 콜백함수의 매개변수로 전달된다.
			    	$('#message1').html(data);  // 콜백함수로 전달된 data를 id가 message1인 엘리먼트에 설정한다.
			    }
		   });

- $.ajax({ }); 형태 안에 옵션들을 넣는다

- url 다음에는 서버에 요청할 파일명, 여기선 menu.html 파일을 서버에 요청한다

- dataType 다음에 쓰는 것은 요청할 파일의 확장자가 html 파일이므로 dataType을 html으로 쓴다

- type 에서 어떤 전송 방식을 사용할지 설정

- type 이 생략되면 디폴트는 get 방식

- 서버에 요청을 하고 값(응답)을 잘 받으면 success 다음의 내용이 실행된다

- success 옆의 function 을 callback 함수라고 함, 그리고 매개변수 (임의의 이름) data 로 값을 돌려받음

- 돌려받는 값은 menu.html 파일의 내용 중에 브라우저에 출력되는 값, 즉 전체내용을 콜백함수로 돌려받음

 

콜백함수로부터 값을 잘 돌려받았는지 확인하기위해 alert 코드 추가

- 이 매개변수 data 가 돌려받은 값임

- 결과 캡처

- 이렇게 돌려받은 데이터를 조작해서 뿌려줘야함

- 이떄 뿌려주는 코드는

- 안의 태그를 인식해야하므로 html() 함수를 사용해서 앞의 선택된 태그 영역에 뿌려줌

 

+ html() 함수는 안의 html 태그를 인식하고 <li></li> 를 디스크 모양으로 출력

+ text() 함수는 html 태그 인식불가하고 <li></li>까지 그대로 출력

 

ajax 함수 (sample09_04.html '메뉴 보기 2' 부분)

		   $.ajax({
			    url:'menu.html',
			    dataType:"html",
			    success: function(data){	     // 서버로부터 응답받은 데이터는 콜백함수의 매개변수로 전달된다.
			    	alert(data);
					$('#message2').html($(data).find('li')); 
					// menu.html문서의 내용중 li엘리먼트만 읽어서 id가 message2인 엘리먼트에 설정한다.
			    }										    
		    });

- url : 요청할 파일명, 돌려받는 값은 브라우저에 출력되는 전체 내용을 통째로 콜백함수를 통해 돌려받음

<콜백함수 내부>

- find() 함수 : 특정 태그를 찾는 함수

- data 중에서 즉 menu.html 전체 내용 중에서 li 태그만 찾아서 id값이 message2인 span 태그 사이에 뿌려라는 의미

 

콜백함수로부터 값을 잘 돌려받았는지 확인하기위해 alert 코드 추가

- 이 매개변수 data 가 돌려받은 값임

 

- 결과 캡처

 

- load() 함수로 처리했던 것과 같은 결과를 ajax() 로 처리

 

+ load() 함수로 특정 태그만의 내용을 불러올 때는 load('menu.html li'); 로 불러오기

+ ajax() 함수로 특정 태그만의 내용을 불러올 때는 $(data).find('li') 함수 사용

 

xml 파일 만드는 규칙

- item.xml 파일 열어보기

- 태그들이 정해진 것이 아니라 만들 수 있고 바꿀 수 있다

- xml 파일의 시작

<?xml version="1.0" encoding="UTF-8"?>

- 가장 바깥쪽에 해당되는 태그(엘리먼트)가 반드시 "1개" 있어야한다 = 루트 엘리먼트

- 0개도 2개도 아닌 딱 1개여야 한다

<?xml version="1.0" encoding="UTF-8"?>
<items>
</items>

- 여기선 items 가 루트 엘리먼트

- 그 루트 엘리먼트 안에 부모 엘리먼트인 item 들이 있다

<?xml version="1.0" encoding="UTF-8"?>
<items>
  <item id="1" name="레몬">
    <price>3000</price>
    <description> 레몬에 포함되어 있는 쿠엔산은 피로회복에 좋다. 비타민C도 풍부하다. </description>
   </item>
   
   <item id="2" name="키위">
    <price>2000</price>
    <description> 비타민C가 매우 풍부하다. 다이에트와 미용에도 매우 좋다. </description>
   </item>
</items>

- 그 부모 엘리먼트 안에 child element 들이 있다

- 아이디 값을 구분하기 위해 item id 가 1,2,3,4.. 로 설정되어있다

- web.xml 파일 열어보기 ( 환경설정 파일)

 

- xml 주석기호는 html 주석기호와 같다

- server.xml (아파치톰캣 환경설정 파일) 열어보기

 

xml 파일 사용

- 직접 작성하는 일은 많지 않다

- 공공데이터 요청시 xml 형태로 결과를 돌려준다

ex) 기상청 날씨정보 요청

- 이렇게 xml 파일 형태로 돌려받은 값을 가공, 조작해서 사용해야함 (Javascript, Java, Python 등으로 조작)

 

비동기로 서버에 요청하는 함수

$.get() 함수

- get 방식으로만 요청 가능하다

- 형식 : 

 $.get('item.xml', function(data) {
     });

- 처음 들어가는건 서버에 요청할 파일명

- 두번째 매개변수로 들어가는 function 이 콜백함수이다

 

Ajax 예제 5

get() 함수 예제 1

- XML 파일을 get 방식으로 로드하기

- XML 파일을 요청을 하면 XML 로 결과를 돌려받음

- 요청할 파일명은 item.xml, 이 파일을 콜백함수로 받아서 처리하게됨

- 돌려받은 xml 데이터를 조작해서  필요한 형태로 출력하고 있다

item.xml 내용

- sample09_07.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>XML 파일을 GET 방식으로 로드하기</title>
<style>
td { border: 1px solid gray;
}
</style>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script type="text/javascript">
/*
	- $.get() 함수를 이용해서 item.xml 파일을 불러온다.
    - $.get() 함수의 첫번째 매개변수에는 서버의 URL 주소를 지정한다.
	- $.get() 함수의 두번째 매개변수인 콜백함수를 이용해서 서버에서 보내온 XML 형식의 데이터를 data 로 받늗다.
*/

$(function() {
	 $.get('item.xml', function(data) {
             $("#treeData").append(
                    "<tr><td>id</td>" + "<td>name</td>" 
                  + "<td>price</td>" + "<td>description</td>" + "</tr>");
             $(data).find('item').each(function() {			// 서버에서 얻어온 데이터에서 셀렉터로 item태그를 찾는다.
            	 var $item = $(this);						   // 6개의 item태그중 현재 처리중인 item태그를 this로 접근한후에 이를
                 $("#treeData").append("<tr>" + "<td>"        // this로 접근한 후에 이를 $(this)를 사용하여 jQuery객체를        
                         + $item.attr("id") + "</td>" + "<td>" //생성함  
                         + $item.attr("name") + "</td>" + "<td align='right'>"
                         + $item.find("price").text() + "</td>" + "<td>"
                         + $item.find("description").text() + "</td>" + "</tr>");
             });
    });
});
</script>
</head>
<body>
  <table id="treeData"></table>
</body>
</html>

- 두번째 매개변수는 콜백함수이다

- $.get() 함수를 통해 서버에 서버측의 파일 중 'item.xml' 파일을 요청하고 'item.xml' 파일을 돌려받고 있다

- 콜백함수의 매개변수 data 로 xml 형식의 데이터를 돌려받았다

- body 태그 안에 table 태그 하나뿐, 이 table 태그의 id값만을 가지고 태그를 구해서 tr td 를 만들어서 데이터를 뿌려줄 것

- 테이블 태그를 id값으로 구해와서 append() 함수로 타이틀을 출력, id, name, pirce, descript  추가

- 타이틀이 아닌 돌려받은 데이터의 내용은 가공해야함

 

each() 함수

- 반복적인 작업을 수행하는 함수

- 첫번째 데이터를 가져오고 반복적인 작업을 하고 두번쨰 데이터를 가져오고 반복적인 작업을 하고..

- 더이상 데이터가 없을때까지 가져와서 반복작업 

 

돌려받은 xml 을 원하는 형태로 가공 (sample09_07.html 부분)

             $(data).find('item').each(function() {			// 서버에서 얻어온 데이터에서 셀렉터로 item태그를 찾는다.
            	 var $item = $(this);						   // 6개의 item태그중 현재 처리중인 item태그를 this로 접근한후에 이를
                 $("#treeData").append("<tr>" + "<td>"        // this로 접근한 후에 이를 $(this)를 사용하여 jQuery객체를        
                         + $item.attr("id") + "</td>" + "<td>" //생성함  
                         + $item.attr("name") + "</td>" + "<td align='right'>"
                         + $item.find("price").text() + "</td>" + "<td>"
                         + $item.find("description").text() + "</td>" + "</tr>");
             });

 

 

- 여기서는 $(data).find('item') 이므로 가져온 xml 형식 데이터에서 부모 엘리먼트인 item 태그를 한개씩 계속 구해온다

1. attr() 함수로 속성 가져오기

- 첫번쨰 item 태그인 레몬을 가져와서 $item 변수에 넣고, 그 태그의 속성을 attr() 함수로 가져온다

ex) 먼저 id 속성의 값을 가져옴 -> 1, 다음은 name 속성의 값을 가져옴 -> 레몬

- 이렇게 구해온 값을 <td> 를 열어서 append() 함수로 추가하고 있다

 

2. find() 함수로 태그 찾아서 가져오기

- 세번째로 pirce 란 태그를 구해와야하는데 price는 item 태그의 속성이 아닌 item 안에 있는 자식 Element 임, find() 함수로 price태그를 찾는다

- 이때 찾은 그 자식 태그 사이의 값만 구할땐 text() 로 구해옴

- 네번쨰로 discription 란 태그를 구해야하므로 특정 태그를 찾아주는 find() 함수로 discription 태그를 찾아서 그 안의 값을 가졍괴 위해 text() 로 값을 가져옴

- 이렇게 구해온 값을 <td></td> 안으로 뿌려줌

 

- 다음으로, each() 함수에 의해 다음 item 태그인 키위를 가져와서 $item 변수에 넣고 그 태그의 속성과 자식태그들 사이의  값을 가져오고 다시 <tr> 이 열리며 값을 출력함

- 계속 다음 item 으로 넘어가면서 반복됨

- item 이 없을때까지 반복작업한다

 

- 돌려받은 xml 데이터를 조작해서  필요한 형태로 출력하고 있다

 

each() 함수

- 반복적인 작업을 수행하는 함수

- 첫번째 데이터를 가져오고 반복적인 작업을 하고 두번쨰 데이터를 가져오고 반복적인 작업을 하고..

- 더이상 데이터가 없을때까지 가져와서 반복작업 

 

each() 함수 예제 1

- each01.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>배열을 반복 처리하기</title>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
  $(function() {
    var list = ['Jessica', 'Tiffany', 'Sunny', 'crystal', 'G.NA']
  
    $.each(list, function(index, value) {
    	alert(index+":"+value);
		$('ol').append('<li>'+value+'</li>');
	});   
    
  });
</script>
</head>
<body>
  <ol>
  </ol>
</body>
</html>

- Javascript 배열 정의하는 방법 var list = [ ] 안에 값을 넣으면 됨 

- 반복문 대신 $.each() 함수로 배열의 값을 차례로 가져와서 출력해보자

$.each(list, function(index, value){});

- index 는 배열 list 에 들어있는 값의 인덱스 번호를 받고

- value 는 이 배열 list 에 들어있는 값을 받음

+ alert 이 우선순위가 높으므로 alert 이 다 출력된 후 해당 목록들을 append 함수로 추가함

- 배열 방번호는 0 번부터 시작하므로 번호가 이렇게 뜸

- alert 이 우선순위가 높으므로 모두 alert 한 후 append 됨

 

each() 함수 예제 2

- each02.html

<!DOCTYPE html>
<html>
<head>
    <script src="http://code.jquery.com/jquery-1.10.2.js"></script>
    <script>
	// each() 메소드 : 매개변수로 입력한 함수를 사용해 for in 반복문처럼 객체나
	//               배열의 요소를 검사하는 메소드

        $(document).ready(function () {
            // 변수를 선언합니다.
            var array = [
                { name: 'Hanbit Media', link: 'http://hanb.co.kr' },
                { name: 'Naver', link: 'http://naver.com' },
                { name: 'Daum', link: 'http://daum.net' },
                { name: 'Paran', link: 'http://paran.com' }
            ];

            // $.each() 메서드를 사용합니다.
            $.each(array, function (index, item) {
                // 변수를 선언합니다.
                var output = '';

                // 문자열을 만듭니다.
                output += '<a href="' + item.link + '">';
                output += '    <h1>' + item.name + '</h1>';
                output += '</a>';

                // 집어넣습니다.
                document.body.innerHTML += output;
            });
        });
    </script>
</head>
<body>

</body>
</html>

- body 태그 안엔 아무 내용이 없다, jQuery 에서 구현할 것

 

+ Javascript 배열 만들기 / json 형태

- 0 번방에 들어갈 값은 {}

- 1 번방에 들어갈 값은 다음 {}

- json 형태로 되어있다

- Javascript 에서 키-밸류 형태 를 json 이라고 한다

- 중괄호 { } 안에 키 : 밸류 형태로 되어있음, 키 값을 알아야만 밸류를 구해올 수 있다

- 키값은 name 과 link

 

each() 로 배열의 값들을 하나씩 처리

- index 란 매개변수는 array 배열의 인덱스번호를 한개씩 전달받음

- item 이란 매개변수는 배열 안의 데이터들을 한개씩 전달받음

- 이게 통째로 item 변수에 들어간다

- 그리고 item.link 와 item.name 을 통해서 데이터를 가져옴

- 즉 키값을 통해서 value 값을 가져온다

- 가져와서 태그로 감싼 후 계속해서 +=로 output 변수에 누적시킨다

- 그 후 innerHTML 속성을 사용해서 output 변수의 값을 누적해서 집어넣음

- document.body.innerHTML 은 Javascript 기능으로서, 앞의 innerHTML 앞에 body 를 쓰면 body 태그 사이에  출력시켜라는 의미이다

 

+ jQuery 식으로 출력하기

- body 태그안에 div 를 만들어서 영역만 만들기

- var output 변수 선언을 each() 함수 바깥 위쪽으로 옮기기

- each() 함수 바깥 아래에서 html() 함수로 output 변수에 누적된 결과를 출력

+ 태그를 인식해야하므로 html() 함수 사용

 

- 그럼 브라우저에는 이렇게 출력된다

- 결과 캡처

 

+ alert()로 output 변수에 어떤 값이 있는지 찍어보면

 

 

JSON 형태 예시

- 이게 json 형태 (키:밸류 형태) 이다

 

공공데이터 데이터 제공 예시

https://www.data.go.kr

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

 

- xml 형태로 되어있다

- json 형태로 되어있다

복습

+ AJAX

- 비동기적으로 요청하고 콜백함수로 값을 받아 처리

- AJAX 는 비동기적으로 통신, 팝업창을 띄우지 않고 ID 중복검사 가능

- 페이지를 바꾸지 않고 댓글을 달면 댓글이 바로 insert 되게함

 

* 동기적 방식= 서버측에 요청시 서버가 응답하고 응답이 끝나야만 그 다음 요청 가능

- 동기적 방식 = 유효성 검사시 팝업창을 띄워서 유효성 검사를 했었다

- 동기적인 방식으로 요청시 주로 페이지가 바뀐다(팝업창으로 페이지가 바뀜)

 

text() 함수 vs val() 함수

- text() : 입력양식 외에도 특정 태그 사이의 값을 구해오거나 설정

- val() : 입력양식 / 선택양식에만 사용 가능

 

focus() 함수 & blur() 함수

- focus() : 포커스를 준다

- blur() : 포커스 아웃되었을때 발생

 

$(this)

- 이벤트를 발생시킨 태그

ex)

$("input").focus(function() {
	$(this).val("").css("color","#000");
});

- 여기서 this 는 focus 이벤트가 발생한 태그

 

필터선택자

- 특정태그만 선택적으로 구해오고 싶을때 사용

 

: input 필터선택자

- 입력 폼 태그 전부 한꺼번에 선택할 수 있는 필터 ex) input, select, textarea, button

 

: text 필터선택자

- input type 속성값이 text 인 input 태그만을 모두 선택하는 필터

 

: password 필터선택자

- input type 속성값이 password 인 input 태그만을 모두 선택하는 필터

 

after() vs append()

- after() : 특정 태그에 요소 추가, 형제 요소로 추가

- append() : 특정 태그에 요소 추가, 자식 요소로 추가

 

remove() 함수

- 선택한 요소(태그)를 HTML 에서 제거

ex)

$( "p" ).remove();

- 선택된 태그인 p 태그가 삭제됨

 

jQuery form 태그 관련 함수 예제

- 폼에서 자주 쓰는 기능들

이미 들어가 있다, 지난시간 내용 이어서


jQuery 예제 35

jQuery form 태그 관련 함수 예제 10

- 라디오 버튼을 선택하는 :radio 필터선택자

- sample12.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample12</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">

$(function(){
	// :radio 는 input type=radio 버튼을 모두 구해오는 필터 선택자
	$(":radio").click(function(){
		$("label").css("font-weight","");
		$("label[for='"+$(this).attr("id")+"']").css("font-weight","bold");
	});

	$("label").click(function(){
		$("label").css("font-weight","");
		$(this).css("font-weight","bold");
	});

});

		</script>
	</head>
	<body>
		성별:
		<input type="radio" name="gender" 
		value="남자" id="gender_man" />
		<label for="gender_man">남자</label>

		<input type="radio" name="gender" 
		value="여자" id="gender_woman" />
		<label for="gender_woman">여자</label>

	</body>
</html>

- input type 속성값이 radio 인 모든 태그만을 구해온다.

- 라디오 버튼을 클릭시 click 이벤트가 발생한다

- 라디오 버튼을 클릭시 모든 label 을 구해와서 font-weight 를 ""로 설정한다, 즉 기존에 bold 되어있던 것을 해제하는 것

- 라디오 버튼의 id 값과 label 태그의 for 값은 같은 값이어야 한다

+ radio 버튼은 name 값이 동일해야하고, id 값은 서로 다르게 설정해야함

- 또한 버튼이 아닌 레이블 태그를 선택해도 해당 레이블에 bold 를 적용시킨다

 

사용자가 선택한 라디오 버튼에 해당하는 레이블 구하기 (sample12.html 부분)

	$("label[for='"+$(this).attr("id")+"']").css("font-weight","bold");

 

-  label 태그의 for 속성을 불러오는데, for 속성값이 $(this).attr("id") 인, 즉 "gender_man" 인 label 태그를 구해옴

- 이때, $(this) 는 '남자' 에 해당하는 input 태그를 의미하고, attr("id")를 통해 그 input 태그의 id 속성을 구하면 "gender_man" 이다

- 그 label 태그에 대해 bold 를 적용하고 있다

- 라디오 버튼의 id 값과 label 태그의 for 값이 같은 값이어야 가능하고 보통 같은값으로 설정

 

+ $("요소 선택[속성=값]") 는 속성 선택자 중 하나, 해당 요소 중 어떤 속성의 값이 특정값일때만 그 태그를 구해온다.

 

- 또한 버튼대신 레이블을 눌러도 똑같이 레이블이 bold 가 됨

 

 

+ 라디오 버튼에도 change 이벤트 발생

 

jQuery 예제 36

jQuery form 태그 관련 함수 예제 11

-  체크박스를 모두 구해오는 :checkbox 필터선택자

- input type=reset 인 모든 태그를 구해오는 :reset 필터선택자

- sample14.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample14</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// :checkbox 는 input type=checkbox 로 되어있는 태그를 모두 구해오는 필터 선택자

$(function(){

	$("button").click(function(){	// '전부체크' 버튼
		$(":checkbox").attr("checked","checked");
	});

// :rest 은 input type=reset 로 되어있는 태그를 모두 구해오는 필터 선택자
	$(":reset").click(function(){	// '전부해제' 버튼
		$(":checkbox").attr("checked",false);
	});

});

		</script>
	</head>
	<body>
스킬:
<input type="checkbox" name="xhtml" value="XHTML" id="xhtml"/>
<label for="xhtml">XHTML</label>

<input type="checkbox" name="css" value="CSS" id="css" />
<label for="css">CSS</label>

<input type="checkbox" name="javascript"
value="JavaScript" id="javascript" />
<label for="javascript">JavaScript</label>

<input type="checkbox" name="php" value="PHP" id="php" />
<label for="php">PHP</label>

<p><button> 전부체크</button></p>
   <input type="reset" value="전부 해제">

	</body>
</html>

<'전부체크' 버튼>

- :checkbox 는 input type 속성값이 checkbox 인 태그만을 모두 구해오는 필터선택자

- 모두 동의하기 누르면 모든 체크박스에 체크가 되게 하는 기능등에 활용 가능.

- 이때, 모든 input type = checkbox 태그를 구해와야함

- :checkbox 로 모든 체크박스를 구해오고 attr() 을 통해 checked 속성값을 checked 로 설정한다

- input type = "checkbox 에서 checked = "checked" 시 체크되므로 그럼 모든 체크박스가 효율적으로 선택됨

<'전부해제' 버튼>

- :reset 은 input type 속성값이 reset 인 태그를 모두 구해오라는 필터선택자

- input type=reset 인 태그를 구해와서 click 이벤트를 처리

- 클릭시 모든 checkbox 를 구해와서 attr() 로 checked=false 로 설정함으로서 모든 체크박스의 체크가 해제됨

 

+ jQuery 에서 전부해제 하는 이벤트를 처리하고 있으므로 input type=reset 일 필요는 없다, 속성값이 button 이어도 가능, 그럼 id 값이나 다른 방법으로 태그를 구해와서 체크해제 이벤트를 처리하면 된다

+ CSS 적용을 위해 라디오 input 태그의 id값과 label 태그의 for 값을 같은값으로 설정한다

 

 

jQuery 예제 37

jQuery form 태그 관련 함수 예제 12

- sample14.html 와 같은 기능이지만 다른 방법 코드

- removeAttr() 함수 : 속성을 제거해줌

- sample14-1.html 중 sample14.html 과 다른 부분만

	$(":reset").click(function(){
//		$(":checkbox").attr("checked",false);
		$(":checkbox").removeAttr("checked");
	});

- '전부해제' 기능을 다르게 구현

- attr() 을 통해 checked 속성을 false로 설정한게 첫번째 방법이고, 여기선 removeAttr() 함수를 사용해서 checked 란 속성(attribute) 을 제거해줌

 

- 사진 없음 (sample14.html 와 같은 기능)

 

jQuery 예제 38

jQuery form 태그 관련 함수 예제 13

- 전송버튼을 모두 구해오는 :submit 필터선택자

- sample15.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample15</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// :submit 은 input type=submit 으로 되어있는 태그를 구해오는 필터 선택자

$(function(){

	$(":submit").mouseover(function(){
		$(this).after("<p>입력한 내용을 서버로 전송합니다.</p>");
	}).mouseout(function(){
		$("p").remove();
	});

});

		</script>
	</head>
	<body>
<dl>
<dt>이름<em>(필수)</em></dt>
<dd><input type="text" name="name" /></dd>

<dt>코멘트</dt>
<dd>
<textarea name="comment"></textarea>
</dd>

<dd><input type="submit" value="전송" /></dd>
</dl>

	</body>
</html>

- :submit 는 input type 속성값이 submit 인 태그만을, 즉 전송버튼을 모두 구해오는 필터선택자

- 모든 전송버튼을 구해와서 mouseover 이벤트와 mouseout 이벤트를 처리하고 있다

- mouseover() 에서 해당 버튼에 마우스 오버시 after() 함수를 통해 안의 내용(태그)을 형제요소로 추가하고 있다

 

 

jQuery 예제 39

jQuery form 태그 관련 함수 예제 14

- 이미지를 구해오는 :image 필터선택자

- sample16.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample16</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// :image 은 input type=image 로 되어있는 태그를 구해오는 필터 선택자

$(function(){

	$(":image").mouseover(function(){
		$(this).attr("src","button_on.jpg");
	}).mouseout(function(){
		$(this).attr("src","button.jpg");
	});

});

		</script>
	</head>
	<body>
<dl>
        <dt>이름<em>(필수)</em></dt>
        <dd><input type="text" name="name" /></dd>
        <dt>코멘트</dt>
        <dd>
                <textarea name="comment"></textarea>
        </dd>
        <dd><input type="image" src="button.jpg" alt="전송" /></dd>
</dl>

	</body>
</html>

- :image는 input type 속성값이 image인 태그만을 모두 구해오는 필터선택자

- 여기선 이미지버튼을 만들어서, mouseover 와 mouseout 시 다른 이미지를 src 속성값으로 설정하고 있다

+ 초기 상태 버튼은 눌려져있지 않은 짙은 회색 버튼 이미지인 button.jpg 이다

- :image 를 통해 모든 input type=image 를 불러오지만 그 중에서도 $(this)를 통해 이벤트가 발생한 그 이미지만 불러올 수 있다

+ 이미지가 여러개 있다고 하더라도 $(this) 를 통해 마우스 오버가 된 그 이미지 태그를 구해옴

 

- 마우스 포인터가 올라왔을때, 내려왔을때 다른 이미지 적용

 

jQuery 예제 40

jQuery form 태그 관련 함수 예제 15

- 리셋버튼을 선택하는 :reset 필터선택자

- sample17.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample17</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">

$(function(){

	$(":reset").one("click",function(){
//	$(":reset").click(function(){
		$(this).after("<p>입력 내용을 초기화 합니다.</p>");
	});

});

		</script>
	</head>
	<body>
<form action="">
	<dl>
		<dt>이름<em>(필수)</em></dt>
		<dd><input type="text" name="name" /></dd>

		<dt>코멘트</dt>
		<dd>
			<textarea name="comment"></textarea>
		</dd>
		<dd><input type="reset" value="재설정" /></dd>
	</dl>
</form>
	</body>
</html>

- :reset는 input type 속성값이 reset인 태그만을 모두 구해오는 필터선택자

- :reset 으로 모든 리셋버튼을 가져온 뒤, $(this) 를 통해 그 중 클릭된 리셋버튼에 대해 after() 를 실행

- one() 함수를 통해 괄호 안의 click 이벤트를 한번만 수행하게 한다

- one() 함수를 쓰지 않고 바로 click() 을 썼다면, '재설정' 버튼을 누를때마다 같은 내용을 여러번 덧붙임

 

 

+ one() 함수를 쓰지 않고 바로 click() 을 썼다면

- one() 함수를 쓰지 않고 바로 click() 을 썼다면, '재설정' 버튼을 누를때마다 같은 내용을 여러번 덧붙임

 

jQuery 예제 41

jQuery form 태그 관련 함수 예제 16

- 유효성 검사 내용

- sample18.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample18</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">

$(function(){

	$("button").click(function(){

		if($("#mail").val() == ""){
			alert("메일 주소를 입력하세요");
			$("#mail").focus();
			return false;
		}
		if($("#check").val()==""){
			alert("메일주소확인을 입력 하세요");
			$("#check").focus();
			return false;
		}
		if($("#mail").val() != $("#check").val()){
//			 $("em").text("메일 주소가 동일하지 않습니다.");
			alert("메일주소가 동일 하지 않습니다.");
			$("#check").val("");
			$("#check").focus();
			return false;
		}
	});

});

		</script>
	</head>
	<body>
	<form action="check.html">
	<dl>
	<dt>메일주소</dt>
	<dd><input type="text" name="mail" id="mail"/></dd>

	<dt>메일주소<em>(확인)</em></dt>
	<dd><input type="text" name="check" id="check" /></dd>
	<dd><button> 확인</button>
		<input type=reset value="취소"></dd>
	</dl>
	</form>

	</body>
</html>

- 확인 버튼을 'button' 으로 구해와서 click 시 유효성 검사를 실행한다

- val() 함수를 통해 입력양식에서 입력된 값을 구해와서 유효성 검사를 한다

- input type=reset 은 따로 이벤트를 쓰지 않더라도 기본적으로 지워주는 기능이 내장되어있다

 

+ <button></button> 태그는 전송기능이 있는 태그이다!

+ button 태그는 전송기능이 있는 버튼 태그지만 click 이벤트로 처리해도 처리가 된다

 

+ jQuery 에서 함수들을 . 으로 계속 연결 가능하다

$("#check").val("").focus();

- 아래의 코드와 같다

$("#check").val("");
#("#check").focus();

 

jQuery 예제 42

jQuery form 태그 관련 함수 예제 17

- 파일선택 폼을 선택하는 :file 필터선택자

- sample19.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample19</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// :file 은 input type=file 로 되어있는 태그를 구해오는 필터 선택자

$(function(){

	$(":file").mouseover(function(){
		$(this).after("<p>업로드 가능한 파일은 300kb까지 입니다</p>")
	}).mouseout(function(){
		$("p").remove();
	});

});

		</script>
	</head>
	<body>
		사진:<input type="file"><br>
			  <input type="file">
	</body>
</html>

- :file 은 input type 속성값이 file 인 태그만을 모두 구해오는 필터선택자

- :file 로 두 파일선택 버튼 태그를 불러오고, $(this) 는 두개의 태그 중에 사용자가 마우스 오버한 태그를 불러와서, after() 를 통해 그 태그 다음에 p 태그를 추가

- 이후 mouseout 시 추가된 p 태그를 remove() 로 삭제

 

+ after() 은 요소를 형제로 추가, 선택된 태그 바로 다음에 추가됨

 

jQuery 예제 43

jQuery form 태그 관련 함수 예제 18

- 라디오버튼이나 체크박스에서 체크상태인 태그를 구해오는 :checked 필터선택자

- each() 함수

- sample20.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample20</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// :checked는 라디오 버튼이나 체크박스에서 체크 상태인 태그를 
//  선택하도록 해준다. 

// label 태그 혹은 체크 박스가 클릭될 때 체크 상태인 체크박스와 
//  쌍을 이루는 label 태그의 배경색을 회색으로 변경함.

$(function(){

	$("label,:checkbox").click(function(){
		$("label").css("background","");
		$(":checked").each(function(){
			$("label[for='"+$(this).attr("id")+"']").css("background","#CCC");
		});
	});

});

		</script>
	</head>
	<body>
		스킬:
		<input type="checkbox" name="xhtml" value="XHTML" id="xhtml" />
		<label for="xhtml">XHTML</label>

		<input type="checkbox" name="css" value="CSS" id="css" />
		<label for="css">CSS</label>

		<input type="checkbox" name="javascript"value="JavaScript" id="javascript" />
		<label for="javascript">JavaScript</label>

		<input type="checkbox" name="php" value="PHP" id="php" />
		<label for="php">PHP</label>

	</body>
</html>

- 선택자가 , 로 연결시 , 양쪽에 있는 태그 둘 다 구해옴

- 여기서 $(label,:checkbox) 는 label 태그도 불러오고 모든 input type=checkbox 도 불러옴

- 그러므로 체크박스를 클릭하거나 레이블을 클릭시 안의 내용이 실행됨

- click() 안에서 레이블 태그를 모두 불러온 후 css() 로 배경색을 모두 지움

 

- 라디오버튼이나 체크박스에서 체크상태인 태그를 모두 구해오는 :checked 필터선택자

- 그리고 :checked 태그로 체크상태인 태그를 모두 구해옴

- each() 함수 : 반복문처럼 반복적인 작업을 수행해주는 함수

- $(":checked").each() 는 구해진 더이상 체크된 체크박스가 없을때까지 실행하라는 의미

- 루프를 돌리듯이 하나씩 구해진 클릭된 체크박스를 가져와서 클릭한 체크박스의 id 속성값과 for 속성값이 같은 label 태그만 css() 로 배경색을 회색으로 설정

 

+ 여기서 체크된 체크상자에 다시 체크(클릭)을 해도 이 click() 이 실행되는 것, 그러므로 한번더 클릭해서 체크 해제시 배경색을 지워줌

 

ex) 만약 XHTML 을 체크했다면

$(":checked").each(function(){});

- 에서 체크된 모든 체크박스를 하나씩 구해오는데 이때 XTML 체크박스도 해당하게 되므로 안의 내용이 실행됨

$(this).attr("id") 는 'xhtml'

- 을 의미한다

$("label[for='"+$(this).attr("id")+"']")

- 은 label 태그 중 for 속성값이 'xtml' 인 label 태그를 의미한다

 

- 체크박스 체크시 옆의 텍스트의 background 색이 바뀐다, 레이블을 클릭시에도 동일

- 한번더 클릭시 다시 click() 이 다시 실행되어서 클릭되어 해제된 체크박스의 레이블이 회색이 아니게 됨

 

+ 주의 : label 태그의 for 값과 input type=checkbox 의 id 값이 같아야한다

 

jQuery 예제 44

jQuery form 태그 관련 함수 예제 19

- select-option 에서 선택되어있는 option 태그를 구해오는 :selected 필터선택자

- sample21.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample21</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// 연령을 "10대" 로 선택하면 "좋아하는 술" 입력란이 입력 불가 상태가 됨
// :selected 는 선택된 option 태그를 구해오는 필터 선택자

$(function(){

	$("select").change(function(){
//		if($(":selected").attr("value")=="10 대"){	// '10대' 선택, 아래와 똑같다
		if($("select").val() == "10 대") {	// 더 간단한 방법
			$("input").attr("disabled", "disabled");
//			$("input").attr("disabled", true); 위와 똑같다
//			$("input").attr("readOnly", "readOnly"); readOnly 로 비활성화
//			$("input").attr("readOnly", true); 위와 똑같다

		}else{	// 나머지 연령대 선택
			$("input").removeAttr("disabled");
//			$("input").attr("disabled", false); 위와 똑같다
//			$("input").attr("readOnly", false); readOnly 로 비활성화
//			$("input").removeAttr("readOnly"); 위와 똑같다
		}
	});

});

		</script>
	</head>
	<body>
<p> 나이:
<select name="age">
<option value=" 선택해주세요"> 선택해주세요</option>
<option value="10 대">10 대</option>
<option value="20 대">20 대</option>
<option value="30 대">30 대</option>
<option value="40 대이상">40 대이상</option>
</select></p>
<p> 좋아하는 술:<input type="text" /></p>

	</body>
</html>

- select-option 에서 선택되어있는 option 태그를 구해오는 :selected 필터선택자

- select-option 에서 어떤 값을 선택시 change 이벤트 발생, 이때 select 태그가 이벤트를 발생시키는 태그가 된다

- select-option 중 특정 태그만 구해오려면 if~else 문으로 나눠서 change 이벤트를 처리해야한다

- $(":selected").attr("value") == '10 대' 는 선택된 옵션의 value 속성값이 '10 대' 일때 를 의미한다, 즉 '10 대가 선택되었으면' 을 의미함

 

- 10 대가 선택되었을때 attr() 함수로 input 태그의 disabled 속성을 "disabled" 로 설정하여 input 태그를 비활성화 시킴

- 그리고 나머지의 경우는 else에서 removeAttr() 함수를 통해 disabled 속성을 삭제함, 또는 attr() 함수로 "disabled" 를 false로 설정해서도 똑같이 구현 가능

			$("input").removeAttr("disabled");
//			$("input").attr("disabled", false); 위와 똑같다

 

+ select 에서 아무것도 선택하지 않으면 가장 첫번째가 선택된 상태임 (주로 선택해주세요 메세지)

+ 이때 option 태그에 selected="selected" 속성을 추가시 초기부터 선택된 채로 나타남

 

$(":selected").attr("value") 대신 다른 간단한 방법으로 구해오기

//		if($(":selected").attr("value")=="10 대"){}	// '10대' 선택
		if($("select").val() == "10 대") {}	// 간단한 방법

- 그냥 $("select").val() 을 통해서도 select 에서 선택된 옵션의 값을 구해올 수 있다

- val() 함수로 입력양식 / 선택양식의 값을 구해오거나 설정할 수 있다

+ 여기선 select 가 1개이므로 그냥 태그선택자로 가져옴

 

- select 에서 10대를 선택시 입력창을 비활성화 시킴

 

+ $("input").attr("disabled",true); 는?

- disabled 해제되어 입력 가능해짐

			$("input").attr("disabled", "disabled");
//			$("input").attr("disabled", true); 위와 똑같다

 

 

+ 비활성화 시키는 방법 2가지 중 disabled 대신 readonly 도 될까?

- 마찬가지로 비활성화 잘 된다

//			$("input").attr("disabled", "disabled");
//			$("input").attr("disabled", true); 위와 똑같다
			$("input").attr("readOnly", "readOnly"); readOnly // readOnly 로 비활성화

 

비활성화 시키는 코드

			$("input").attr("disabled", "disabled");
//			$("input").attr("disabled", true); 위와 똑같다
//			$("input").attr("readOnly", "readOnly"); readOnly 로 비활성화
//			$("input").attr("readOnly", true); 위와 똑같다

 

비활성화 푸는 코드 (활성화)

			$("input").removeAttr("disabled");
//			$("input").attr("disabled", false); 위와 똑같다
//			$("input").attr("readOnly", false); readOnly 로 비활성화
//			$("input").removeAttr("readOnly"); 위와 똑같다

 

+ AJAX 에서 each() 함수 쓴다, AJAX 할때 자세히 공부

 

jQuery 예제 45

유효성 검사 예제 1

- jQuery 는 유효성 검사를 할때 가장 많이 사용

- jQuery01.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jQuery연습</title>

<!-- <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> -->
<script src="jquery-1.9.1.min.js" type="text/javascript"></script>

<script>

$(document).ready(function(){	
	
//    $("form").submit(function(){
	  $("#myform").submit(function(){	

//	function check() {
		var id = $.trim($("#id").val());//jQuery를 이용하여 앞뒤 공백 제거 
		if (id == "") {
//		if($.trim($("#id").val()) == ""){
			alert("ID를 입력 하세요?");
			$("#id").focus();
			return false;
		}
//	}

	}); // submit() end
}); // ready() end

</script>

</head>
<body>
	<form id=myform name=myform method=post action=send.jsp>
		<table border=1 align=center>
			<tr>
				<td>ID</td>
				<td><input type=text id="id" name="id" size=20></td>
			</tr>
			<tr>
				<td align=center colspan=2>
				<input type=submit value="가입"></td>
			</tr>
		</table>
	</form>
</body>
</html>

+ submit 버튼이므로 form 태그에 대해 submit 이벤트를 등록한다, 나머지 내용은 모두 그 안에 넣음

- id 값이 id 로 되어있는 태그를 구해서 안의 값을 구해서 var id 에 저장한다

- 그 id 변수가 null 이면 경고창을 띄우고 태그에 focus() 로 focus 를 준다

 

trim() 함수

- 문자열 좌측과 우측의 공백을 없애줌

- 주의 : 그냥 trim() 이 아니라 $.trim() 형태로 써야함

 

 

jQuery 예제 46

유효성 검사 예제 2

- jQuery01-1.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
	<title>jQuery연습</title>
	<script src="jquery-1.9.1.min.js" type="text/javascript"></script>
	<script>

//function sendGuest() {

$(document).ready(function(){

 $("form").submit(function(){

	var name=$.trim($("#name").val());
	var content=$.trim($("#content").val());
	
	if(name == "") {
		alert("이름 !!");
		$("#name").focus();
		return false;
	}

	if(content == "") {
		alert("내용 !!");
		$("#content").focus();
		return false;
	}
	
 }); // submit();

});  // ready();

//}

</script>

</head>
<body>
<!--
<form onSubmit="return sendGuest()" name=myform method=post action=send.jsp>
-->
<form method=post action=send.jsp>
<table width="500" border="1" align=center>
	<tr height="50">
		<td align="center"><b>방명록</b></td>
	</tr>
</table>
<br>
<table width="500" border="1" align=center>
	<tr height="25">
		<td align="center" width="100">작성자</td>
		<td align="left">
		    <input type="text" id="name" name="name">
		</td>
	</tr>
	<tr height="70">
		<td align="center" width="100">내용</td>
		<td align="left">
		    <textarea rows="6" cols="50" id="content" name="content"></textarea>
		</td>
	</tr>
</table>
<table width="500" border="0" align=center>
	<tr height="25">
		<td align="center">
		<input type="submit" value="등록하기">
		<input type=reset value="취소">
		</td>
	</tr>
</table>

</form>
</body>
</html>

- form 태그에 submit 이벤트를 처리함

- 작성자 입력양식의 id값과 내용 입력양식의 id값을 이용해서 불러온 후 val() 로 값을 구하고,$.trim() 후 각각 변수에 저장해서 유효성 검사를 하고 있다

- name=="" 일때 경고창과 포커스 처리를 한 후 return false 로 함수를 완전히 빠져나간다

- 함수를 빠져나갔으므로 이름을 입력하라는 경고창만 띄우고 내용을 입력하라는 경고창은 띄우지 않음

 

 

 

+ return false 가 없다면?

- 경고창이 이중으로 뜬다

 

jQuery 예제 47

유효성 검사 예제 3

- 이전 예제와 비슷
- mem_insert.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입 폼</title>
<script src="jquery-1.9.1.min.js"></script>
<script>

$(document).ready(function(){

   $("form").submit(function(){

// function check(){
	 if($.trim($("#id").val())==""){
		 alert("아이디를 입력하세요!");
		 $("#id").val("").focus();
		 return false;
	 }	
	 if($.trim($("#pwd").val())==""){
		 alert("비밀번호를 입력하세요!");
		 $("#pwd").val("").focus();
		 return false;
	 }
	 if($.trim($("#name").val())==""){
		 alert("이름을 입력하세요!");
		 $("#name").val("").focus();
		 return false;
	 }
	 if($.trim($("#addr").val())==""){
		 alert("주소를 입력하세요!");
		 $("#addr").val("").focus();
		 return false;
	 }
	 if($.trim($("#intro").val()) == ""){
		 alert("자기 소개를 입력 하세요!");
		 $("#intro").focus();
		 return false;
	 }
// }
	
   }); // submit() end

}); // ready() end

</script>
</head>
<body>
<!--
 <form method="post" action="mem_ok.jsp" 
	   onsubmit="return check()">
-->
<form method="post" action="mem_ok.jsp">
  <table align="center" border="1">
    <tr>
     <th>아이디</th>
     <td><input name="id" id="id" size="14" /></td>
    </tr>
    
    <tr>
      <th>비밀번호</th>
      <td><input type="password" name="pwd"			id="pwd" size="14" /></td>
    </tr>
    
    <tr>
      <th>회원이름</th>
      <td>
       <input name="name" id="name" size="20" />
      </td>
    </tr>
    
    <tr>
      <th>회원주소</th>
      <td>
       <input name="addr" id="addr" size="30" />
      </td>
    </tr>

	<tr>
      <th>자기소개</th>
      <td>
       <textarea name="intro" rows=5 cols=25 id="intro"></textarea>
      </td>
    </tr>
    
    <tr>
     <th colspan="2">
     <input type="submit" value="저장" />&nbsp;
     <input type="reset" value="취소" onclick="$('#id').focus()" />
     </th>
    </tr>
  </table>
 </form>
</body>
</html>

- 입력양식들의 id 값을 다르게 설정하여 구분한다

- 전송 버튼 클릭시 값이 전달될 파일은 mem_ok.jsp 파일

- 리셋버튼 태그에 onClick 속성에서 함수이름 대신 바로 함수를 사용하고 있다

- 계속해서 아래쪽의 내용이 실행되지 않도록 return false; 를 추가한다

- 나머지는 이전의 예제들과 비슷하다

 

포커스

 

jQuery 예제 48

유효성 검사 예제 4

- 패턴 지정해서 정규 표현식 검사

- jQuery02.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title> jQuery 폼체크 예제 </title> 
<script src="jquery-1.9.1.min.js"></script> 
<script type="text/javascript"> 
 
//function form_check() { 
$(document).ready(function(){

	$("form").submit(function(){

   // 체크 패턴 
// var pattern = /^[a-zA-Z]+[a-z0-9_]$/; 
// var num = /^[0-9]+$/; 

   var pattern = /^[a-z]+[a-z0-9_]+[a-z0-9_]$/; 
   var num = /^[0-9]+$/;    
   
   // 아이디 체크 
   var id = $.trim($('#id').val());//jQuery를 이용하여 앞뒤 공백 제거 
   if(id=="") { 	// 유효성 검사
      alert("아이디를 입력하세요!"); 
      $('#id').focus(); 
      return false; 
      
   } else { 		// 정규 표현식 검사
      if(!pattern.test(id)) { // test():pattern에 맞지 않으면 - false 리턴
         alert("아이디는 영문소문자로 시작하고\r\n영문소문자, 숫자, 언더바(_)만 사용하실 수 있습니다! "); 
 //      $('#id').select(); 

//		 $("#id").val("");
//		 $("#id").focus();

		 $("#id").val("").focus();
         return false; 
      } 
   } 
   
   // 비밀번호 체크 
   var pss = $.trim($('#pss').val());//jQuery를 이용하여 앞뒤 공백 제거 
   if(pss=="") { 		// 유효성 검사
      alert("비밀번호를 입력하세요!"); 
      $('#pss').focus();	  
      return false; 
      
   } else { 			// 정규 표현식 검사
      if(!num.test(pss)) { 	// test():pattern에 맞지 않으면 - false 리턴
         alert("비밀번호는 숫자만 가능합니다!");
//		 $('#pss:text').attr('value', '');
		 $("#pss").val("");
		 $('#pss').focus();
 //      $('#pss').select(); 
         return false; 
      } 
   } 
	}); // submit() end

});	// ready() end
//} 

</script> 
</head> 
<body> 
<!--
<form method="post" action="send.jsp" onSubmit="return form_check()"> 
-->
<form method="post" action="send.jsp">
ID : <input type="text" id="id" name="post_id"> <br>
비밀번호 : <input type="text" id="pss" name="post_pss"> <br><br>
<input type="submit" id="join_button" value="폼체크"> 
</form> 
</body> 
</html>  

<!-- 
 test() 함수
	test() 함수는 정규식과 비교하여 포함되면 true 반환, 포함되지 않으면 false 반환
	pattern에 맞으면 - true
    pattern에 맞지 않으면 - false -->

- 아이디값은 소문자 a-z , 숫자 0-9, _(언더바) 가능하고 나머지는 불가능

- 비밀번호는 0-9 숫자만 가능

 

- 유효성 검사보다는 정규 표현식 검사이다, 지정된 정규 표현식과 다른 경우 alert

- 주로 이메일처럼 아이디@g.com 처럼 형식이 정해져있을때, 사용자의 입력이 정규표현식과 일치하는지 확인

 

패턴 지정 (jQuery02.html 부분)

   // 체크 패턴 
// var pattern = /^[a-zA-Z]+[a-z0-9_]$/; 
// var num = /^[0-9]+$/; 

   var pattern = /^[a-z]+[a-z0-9_]+[a-z0-9_]$/; 
   var num = /^[0-9]+$/;

- 패턴 지정시 시작을 알리는 ^ 기호, 끝을 알리는 $ 기호

- 대괄호안의 문자만 사용가능하다는 의미

pattern 변수

- 아이디의 패턴 지정

- 3가지 []가 + 로 연결된 것은 순차적으로 연결된 것

- [a-z] 는 영문 소문자 a 부터 z 까지 가능하다는 의미이고 [a-z] 로 시작해야함

- 그 뒤로 a-z 0-9 _ 가 가능하고, 끝나는 문자는 a-z 0-9 _ 가 가능하다 즉 아이디는 최소 3글자 임

- 가운데 있는 [a-z0-9_] 는 없어도 비슷하다

num 변수

- num 변수는 비밀번호의 패턴 지정

- [0-9] 로 0 부터 9까지의 숫자들만 비밀번호로 가능

 

id 유효성 검사 (jQuery02.html 부분)

   // 아이디 체크 
   var id = $.trim($('#id').val());//jQuery를 이용하여 앞뒤 공백 제거 
   if(id=="") { 	// 유효성 검사
      alert("아이디를 입력하세요!"); 
      $('#id').focus(); 
      return false; 
      
   } else { 		// 정규 표현식 검사
      if(!pattern.test(id)) { // test():pattern에 맞지 않으면 - false 리턴
         alert("아이디는 영문소문자로 시작하고\r\n영문소문자, 숫자, 언더바(_)만 사용하실 수 있습니다! "); 
 //      $('#id').select(); 

//		 $("#id").val("");
//		 $("#id").focus();

		 $("#id").val("").focus();
         return false; 
      } 
   }

- if문에서 유효성 검사를 하고 유효성 검사를 통과했다면(즉 값이 써져있다면) else문에서 정규 표현식 검사를 한다

- 정규 표현식 검사는 아래에서 

 

id 정규 표현식 검사 (jQuery02.html 부분)

      if(!pattern.test(id)) { // test():pattern에 맞지 않으면 - false 리턴
         alert("아이디는 영문소문자로 시작하고\r\n영문소문자, 숫자, 언더바(_)만 사용하실 수 있습니다! "); 
 //      $('#id').select(); 

//		 $("#id").val("");
//		 $("#id").focus();

		 $("#id").val("").focus();
         return false;

- test() 함수 : 입력했던 패턴과 사용자가 입력한 값이 맞는지 확인해줌

- 패턴을저장한변수명.test(사용자입력양식) 으로 사용

- 맞으면 true 리턴, 맞지 않으면 false 리턴

- 우리는 맞지 않을 경우 처리를 알림창을 띄우는 등의 처리를 해야하므로 !pattern.test(id) 를 if() 안에 넣었다

- 정규 표현식에 맞지 않으면 알람창을 띄우고, 아이디 입력양식을 비우고 focus 함

 

비밀번호 정규 표현식 검사 (jQuery02.html 부분)

      if(!num.test(pss)) { 	// test():pattern에 맞지 않으면 - false 리턴
         alert("비밀번호는 숫자만 가능합니다!");
//		 $('#pss:text').attr('value', '');
		 $("#pss").val("");
		 $('#pss').focus();
 //      $('#pss').select(); 
         return false; 
      }

- id 정규 표현식 검사와 유사

 

test() 함수

- 입력했던 패턴과 사용자가 입력한 값이 맞는지 확인해줌

- 패턴을저장한변수명.test(사용자입력양식) 으로 사용

- 정규식과 비교하여 포함되면 true 반환, 포함되지 않으면 false 반환
- pattern에 맞으면 true, pattern에 맞지 않으면 false

 

- 형식에 맞는값을 입력해야만 사용 가능

 

jQuery 예제 49

유효성 검사 예제 5

- 유효성 검사 + 정규 표현식 검사

- join.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jQuery 회원가입</title>
<style type="text/css">
	#jointable table{width:600px;}
	#jointable th{text-align: right;								  background-color:orange;}
	#jointable td input {border:1px solid seagreen;}
</style>

<script type="text/javascript" src="jquery-1.9.1.min.js"></script>
<script type="text/javascript">

$(document).ready(function() {

    $("form").submit(function() {
        
            var tel1_pattern = /(^01[016789]$)/; //정규식
            
            if ($("#id").val() == "") {
                alert("아이디를 입력하세요!");
                $("#id").focus();
				return false;
            } else if ($("#pwd").val() == "") {
                alert("비밀번호를 입력하세요!");
                $("#pwd").focus();
				return false;
            } else if ($("#pwd2").val() == "") {
                alert("비밀번호확인 을  입력하세요!");
                $("#pwd2").focus();
				return false;
            } else if ($("#pwd").val() != $("#pwd2").val()) {
                alert("비밀번호와 비밀번호 확인이 일치하지않습니다.");
                $("#pwd").val("");
                $("#pwd2").val("");
                $("#pwd").focus();
				return false;
            } else if ($("#name").val() == "") {
                alert("이름을  입력하세요!");
                $("#name").focus();
				return false;
            } else if ($("#tel1").val() == "") {
                alert("전화번호 첫번째자리 입력하세요!");
                $("#tel1").focus();
				return false;
            } else if ($("#tel1").val().length != 3) {
                alert("전화1을 3개의 숫자로 입력하세요!");
                $("#tel1").val("");
                $("#tel1").focus();
				return false;
            } else if (isNaN($("#tel1").val())) {
                alert("전화1을 3개의 숫자로  입력하세요!");
                $("#tel1").val("");
                $("#tel1").focus();	
				return false;
// var tel1_pattern = /(^01[016789]$)/;  pattern에 맞지 않으면 - false
            } else if (!tel1_pattern.test($("#tel1").val())) {
                alert("010, 011, 016, 017, 018, 019만 가능합니다.")
                $("#tel1").val("")
                $("#tel1").focus();
				return false;
            } else if ($("#tel2").val() == "") {
                alert("전화번호 두번째자리를 입력하세요!");
                $("#tel2").focus();
				return false;
            } else if ($("#tel2").val().length != 4) {
                alert("전화1을 4개의 숫자로 입력하세요!");
                $("#tel2").val("");
                $("#tel2").focus();
				return false;
            } else if (isNaN($("#tel2").val())) {
                alert("전화2을 3~4개의 숫자로 입력하세요!");
                $("#tel2").val("");
                $("#tel2").focus();
				return false;
            } 
/*			
			else if($("#tel2").val() == "" || 
					  $("#tel2").val().length > 4 ||				       isNaN($("#tel2").val())) {


//                alert("okkkkkkk");
/*
                var pattern = /(^01[016789]$)/; //정규식 슬래쉬(/)로 시작해서, 슬래쉬(/)로 끝났다.
                var tel1 = $("#tel2").val();
                if (!pattern.test(tel1)) {
                    //틀리면
                    alert("010, 011, 016, 017, 018, 019,o19만 가능합니다.")
                    $("#te2").val("")
                    $("#te2").focus();

                }
*/
//            }

            else if ($("#tel3").val() == "") {
                alert("전화번호 세번째자리를 입력하세요!");
                $("#tel3").focus();
				return false;
			}else if ($("#tel3").val().length != 4) {
                alert("전화1을 4개의 숫자로 입력하세요!");
                $("#tel3").val("");
                $("#tel3").focus();
				return false;
            } else if (isNaN($("#tel3").val())) {
                alert("전화2을 3~4개의 숫자로  입력하세요!");
                $("#tel3").val("");
                $("#tel3").focus();			
				return false;
            } else if ($("#addr").val() == "") {
                alert("주소를  입력하세요!");
                $("#addr").focus();
				return false;
            } else if ($("#job").val() == "") {
                alert("직업을  선택하세요!");
                $("#job").focus();
				return false;
            } else if ($("#man").is(':checked') == false &&	
            		   $("#woman").is(':checked') == false) {
                alert("남자또는 여자를  선택하세요!");
				return false;
            } else if ($("#email").val() == "") {
                alert("이메일을 입력하세요!");
                $("#email").focus();
				return false;
            } else if ($("#intro").val() == "") {
                alert("자기소개를  입력하세요!");
                $("#intro").focus();
				return false;
            } else {
                alert("ok");

//				$("form").submit();
            }

        }); // click() end

}); // ready() end
	
</script>
</head>

<body>
<h1>회원 가입</h1>

<form action="send.jsp" method=post>

<table id="jointable">
	<tr>
		<th>아이디</th>
		<td><input type="text" name="id" id="id" size="12" maxlength="12" /></td>
	</tr>
	<tr>
		<th>비밀번호</th>
		<td><input type="password" name="pwd" id="pwd" size="12" maxlength="12" /></td>
	</tr>
	<tr>
		<th>비밀번호확인</th>
		<td><input type="password" name="pwd2" id="pwd2" size="12" maxlength="12" /></td>
	</tr>
	<tr>
		<th>이름</th>
		<td><input type="text" name="name" id="name" size="12" maxlength="12" /></td>
	</tr>
	<tr>
		<th>전화번호</th>
		<td>
		<input type="text" name="tel1" id="tel1" size="3" maxlength="3" />-
		<input type="text" name="tel2" id="tel2" size="4" maxlength="4" />-
		<input type="text" name="tel3" id="tel3" size="4" maxlength="4"/>
		</td>
	</tr>
	<tr>
		<th>주소</th>
		<td><input type="text" name="addr" id="addr" maxlength="100" /></td>
	</tr>	
	<tr>
		<th>직업</th>
		<td>

			<select id = "job">
				<option value="">------
				<option value="학생">학생
				<option value="직장인">직장인
				<option value="자영업">자영업
				<option value="주부">주부
			</select>
		
		</td>
	</tr>
	<tr>
		<th>성별</th>
		<td>
			<input type="radio" id="man" name="gender" value="M">남자
			<input type="radio" id="woman" name="gender" value="W">여자
		</td>
	</tr>
	<tr>
		<th>이메일</th>
		<td><input type="text" name="email" id="email"	size="50" maxlength="50" /></td>
	</tr>
	<tr>
		<th>자기소개</th>
		<td>
			<textarea rows="5" cols="40" id="intro"	name="intro"></textarea>
		</td>
	</tr>
	<tr>		
		<td colspan="2" align=center>
			<input type="submit" id="btn_join" value="가입">
			<input type="reset" id="btn_cancel" value="취소">	
		</td>
	</tr>
</table>


</form>

</body>
</html>

<!--

1. isNaN() 함수
	isNaN() 함수는 숫자인지 아닌지를 판단하고 true/false 를 리턴함.
	isNaN('a') -- true 리턴.(문자)
	isNaN('123') --- false 리턴.(숫자)
	cf.isNaN 은 Not a Number 의 약자. 

	if(isNaN(document.myform.tel1.value){
		alert("숫자만 입력 하세요");
	}
    if(isNaN($("#tel1").val())){
		alert("숫자만 입력 하세요");
	}

2. test() 함수
	test() 함수는 정규식과 비교하여 포함되면 true 반환, 포함되지 않으면 false 반환
	pattern에 맞으면 - true
    pattern에 맞지 않으면 - false

3. is() 함수
   is() 함수는 값의 유형을 검사하고 그 결과에 따라 true 또는 false를 반환함
   
   라디오 버튼이나 체크박스가 체크되면 true를 반환하고, 체크되지 않으면 false를 반환함.

-->

- 테이블의 id 값인 jointable 으로 <style> 에서 CSS 를 적용하고 있다

- 가장바깥에 $(document).ready() 가 오고 그 다음 form 에 대해 submit 이벤트 처리를 하고 있다, 나머지 내용은 모두 그 안에 들어간다

 

패턴 지정(join.html 부분)

            var tel1_pattern = /(^01[016789]$)/; //정규식

- tel1_pattern 변수에 정규표현식 설정

- 01 로 시작해서 [] 안의 값중 한개가 들어가야함

+- [] 는 그 안의 값 중 하나를 의미, 여러개가 올 수 있다

 

패턴 적용 (join.html 부분)

 

사용된 함수

1. isNaN() 함수

- 숫자인지 아닌지를 판단,숫자가 아니면(문자이면) true 리턴, 숫자이면 false 리턴

 

2. test() 함수
- 정규식과 비교하여 포함되면 true 반환, 포함되지 않으면 false 반환
- pattern에 맞으면 true, pattern에 맞지 않으면 false 리턴

 

3. is() 함수

- 라디오버튼이나 체크박스에 체크가 되었는지 판별, 체크가 되었으면 true 리턴, 체크되지 않았을땐 false 리턴

 

부분 코드 (순차적)

유효성 검사 1 (join.html 부분)

- 아이디, 비밀번호, 비밀번호 확인은 유효성 검사를 한다

 

유효성 검사 2 (join.html 부분)

- 일치하지 않는 경우 비밀번호도 지우고 비밀번호 확인 도 지우고 비밀번호에 focus

 

유효성 검사 3 (join.html 부분)

- val() 을 이용하여 전화번호 첫번째 부분에 대한 유효성 검사를 하고 있다

- length 속성과 isNaN() 함수로 유효성 검사

- 전화번호 첫번째 부분 유효성 검사 : 입력이 되어야하고, 입력된 값이 3자리 여야하며, 숫자여야 한다

 

정규 표현식 검사 1 (join.html 부분)

- 전화번호 첫번째 부분에 대한 정규 표현식 검사를 하고 있다

- test() 를 통해 기존에 지정해둔 패턴과 맞는지 확인하고 있다

- 맞지않을때 false를 리턴하고 ! 를 사용했으므로 위는 정규 표현식에 맞지 않으면 실행되는 코드이다

- 01 로 시작해야하고 다음 자리는 0,1,6,7,8 또는 9 이어야한다

 

+ 그 다음의 전화번호 두째자리, 세번째 자리도 첫번째 자리에서 했던 것과 유사하게 유효성 검사와 정규표현식 검사를 한다

+ 이름, 자기소개의 유효성 검사도 앞과 비슷하게 처리한다

 

select 유효성 검사 (join.html 부분)

 

- select 에서 아무것도 선택하지 않았을때의 기본 option 의 value 가 "" 이므로 이렇게 select-option 유효성 검사 가능하다

 

라디오박스 유효성 검사 (join.html 부분)

- is() 함수를 통해 해당 라디오박스가 체크되었는지 is(':checked') 로 확인한다, 체크시에 true 반환

- 즉 남자도 선택되지 않았고 (&&) 여자도 선택되지 않았을때 alert 메세지를 띄운다

 

모든 유효성 검사와 정규 표현식 검사 통과 후 마지막 else 구문 (join.html 부분)

- 앞의 if, else if 에 걸리지 않으면 모든 유효성 검사와 정규 표현식 검사를 통과한 것이다.

- 모든 유효성 검사와 정규 표현식 검사를 통과시 alert 창으로 "ok" 를 출력

 

 

jQuery 예제 50

유효성 검사 예제 직접 작성 1

- 유효성 검사 + 정규 표현식 검사

실습 준비

- 폴더 생성 후, HTML 시간에 만들었던 양식폼 html 파일을 각 폴더로 가져오기

- loginform.html

- requred 속성에 의해 메세지를 출력, 우리가 원하는 메세지를 출력할 수 없으므로 지우자

- method="get" 에서 "post" 로 수정

 

- 현재는 유효성 검사가 안되어있으므로 '로그인' 버튼 클릭시 바로 넘어감

- 직접 차례로 유효성 검사를 하자

- loginform.html 에 코드 추가

 

1. jQuery 사용을 위해 라이브러리 구해오기

<script src="http://code.jquery.com/jquery-Latest.js"></script>

- head 태그 내에서 CDN 방식으로 최신 라이브러리 불러오기

 

2. <script></script> 사이에 jQuery 코드 쓰기

- $(document).ready(); 문서를 불러오고 준비가 완료되면 이라는 의미

- jQuery 기본적인 형태, 안의 내용은 코드 실행이 되자마자 실행됨

 

3. '로그인' 버튼은 input type=submit 이므로 form 태그에 대해 submit 이벤트 처리

- 폼과 관련된 나머지 내용은 모두 이 submit 함수에 들어가야한다

 

4. id와 비밀번호 유효성 검사

- 입력이 되지 않은 경우의 유효성 검사를 하고 있다

- return false 를 이용해서 바로 위의 함수인 submit() 함수를 완전히 빠져나감

- 실행 확인 캡처

 

5. 작성한 jQuery 코드를 외부 파일로 빼기

- 외부파일로 뺄때는 확장자를 .js 로 해야한다

- Javascript 에선 함수단위로 들어갔지만 jQuery 에는 $(document).ready() 부터 안의 내용이 모두 들어가야함

- 해당 부분을 복사 후 주석처리 한다

- login.js 안에 복사한다

- loginform.html 파일로 돌아와서 <script> 로 외부 파일을 불러온다

- 결과 캡처

- 이전에 만들어둔 login.jsp 파일이 있으므로 넘어가서 id와 비밀번호가 출력됨

 

위 예제 전체코드

- loginform.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 폼</title>

<script src="http://code.jquery.com/jquery-Latest.js"></script>

<!-- 외부 jQuery 파일 불러오기 -->
<script src="login.js"></script>

<script>
/* 	$(document).ready(function(){
		$("form").submit(function(){
			
			// id 유효성 검사
			if($.trim($("#id").val()) == "") {	// id 입력안하면				
				alert("ID를 입력하세요.");
				$("#id").focus();
				return false;
			}
			
			// 비밀번호 유효성 검사
			if($.trim($("#passwd").val()) == "") {	// 비밀번호 입력안하면				
				alert("비밀번호를 입력하세요.");
				$("#passwd").focus();
				return false;
			}
			
		});
	});  */
</script>

</head>
<body>

<!-- 
method : 값을 전달하는 방식을 설정 : get, post
action : 값이 전달될 파일을 설정
-->

<form method="post" action="login.jsp">
<table border=1 width=350 align=center>
	<caption>로그인</caption>
	<tr>
		<td>ID</td>
		<td><input type=text size=20
							 maxlength=10
							 autofocus="autofocus"
							 name="id"
							 id="id">
		</td>
	</tr>
	<tr>
		<td>비밀번호</td>
		<td><input type=password size=20
								 name="passwd"
								 id="passwd"></td>
	</tr>
	<tr>
		<td colspan=2 align=center>
			<input type=submit value="로그인"><!-- 전송기능이 있는 버튼 -->
			<input type=reset value="취소"><!-- 초기화 버튼 -->
		</td>
	</tr>
</table>
</form>

</body>
</html>

- login.js

$(document).ready(function(){
	$("form").submit(function(){
		
		// id 유효성 검사
		if($.trim($("#id").val()) == "") {	// id 입력안하면				
			alert("ID를 입력하세요.");
			$("#id").focus();
			return false;
		}
		
		// 비밀번호 유효성 검사
		if($.trim($("#passwd").val()) == "") {	// 비밀번호 입력안하면				
			alert("비밀번호를 입력하세요.");
			$("#passwd").focus();
			return false;
		}
		
	});
});

 

jQuery 예제 51

유효성 검사 예제 직접 작성 2

- 유효성 검사

- boardform.html 에 코드 추가

실습 준비

- submit 버튼과 reset 버튼만 남기고 주석처리 또는 지우기

- 초기값으로 나오는 value 삭제

- 유효성 검사를 위해 내용안에 들어간 내용 삭제

- textarea 는 저 태그 안의 값이 value 가 되고 val() 로 구해지는 값이기 때문에

 

1. boardform.html 에 코드 추가, 기본

 

2. 작성자명과 비밀번호 유효성 검사

+ 만약 .trim() 을 사용한다면 $.trim($("#passwd").val()) 처럼 val() 까지 안에 들어가야함

+ 반복문은 break 로 빠져나가고 함수는 return false; 로 빠져나가야 한다

- id 를 입력하지 않았을때 return false; 로 submit() 함수를 빠져나감

- 따라서 id 유효성 검사에서 걸린 후 함수를 빠져나가면 "비밀번호를 입력하세요" alert 창은 뜨지 않는다

 

3. 비밀번호 정규 표현식 검사

- 비밀번호 값은 2자리부터 8자리까지만 입력 가능하다

- OR 연산자 || 로 인해 둘 중 하나만 만족하여도 참이된다.

- 결과 캡처

 

4. 제목과 내용 유효성 검사

- 값이 입력되었는지와 값의 길이를 유효성 검사한다

- 제목은 50자 이내, 내용은 200자 이내로 입력해야한다

- 제목 길이가 적절하지 않으면 경고창을 띄우고 "" 로 지우고 focus 한다

- 내용 길이가 적절하지 않으면 경고창을 띄우고 focus 만 한다

 

+ 내용 textarea 태그의 경우엔 value 속성이 없지만, 그 태그 사이의 내용이 value 가 되어 val() 할때 나타난다

- 즉, val()=="" 이란 의미는 내용을 입력하지 않음 의 의미

- 결과 캡처

 

4. 첨부파일 유효성 검사

- 첨부파일 선택하지 않았을때 메세지를 뿌리는 유효성 검사

- 일반적인 양식과 비슷하게 처리

- 꼭 첨부파일이 필요한 경우에 유효성 검사

 

+ 첨부파일은 일반적인 텍스트 전달과 다르다

+ JSP 에서 첨부파일 처리위한 라이브러리로 파일을 서버측으로 전달 가능

 

4. 작성한 코드를 외부파일로 만들기

- 작성한 코드를 외부파일 board.js 로 빼기

- $(document).ready() 부터의 모든 내용을 복사 후 주석처리

- 해당 내용을 복사 후 주석처리

- board.js 파일에 붙여넣기

- 다시 boardform.html 에서 외부 jQuery 파일 불러오기

 

- 결과 출력

 

+ 외부파일 board.js 는 재사용 가능한 파일이 됨

 

위 예제 전체코드

- boardform.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판</title>

<script src="http://code.jquery.com/jquery-latest.js"></script>

<!-- 외부 jQuery 파일 불러오기 -->
<script src="board.js"></script>
<script>
/* 	$(document).ready(function(){
		$("form").submit(function(){
			if($("#writer").val() ==""){
			alert("작성자 명을 입력하세요");
			$("#writer").focus();
			return false;
			}
		
			if($("#passwd").val() ==""){
			alert("비밀번호를 입력하세요");
			$("#passwd").focus();
			return false;
			}
	
			if($("#passwd").val().length < 2 ||
				$("#passwd").val().length > 8 ) {
				alert("비밀번호는 2 ~ 8 자 이내로 입력하세요");
				$("#passwd").val("").focus();
				return false;
			}
			
			if($("#subject").val() ==""){
				alert("제목을 입력하세요.");
				$("#subject").focus();
				return false;
				}
			if($("#subject").val().length > 50) {
				alert("제목을 50자 이내로 입력하세요.");
				$("#subject").val("").focus();
				return false;
			}
			if($("#content").val() ==""){
				alert("내용을 입력하세요.");
				$("#content").focus();
				return false;
				}
			if($("#content").val().length > 200) {
				alert("내용을 200자 이내로 입력하세요.");
				$("#content").focus();
				return false;
			}
			if($("#myfile").val() == ""){
				alert("첨부파일을 선택하세요.");
				return false;
			}
		
		});	// submit() end
	})	// $(document) end */
</script>
</head>
<body>

<form method="post" action="board.jsp">
<table border=1 width=500 align=center>
	<caption>게시판</caption>
	<tr>
		<th>작성자</th>
		<td><input type=text size=20 name="writer"
									 id="writer"
									 placeholder="작성자명 입력">
		</td>
	</tr>
	<tr>
		<th>비밀번호</th>
		<td><input type=password size=20 name="passwd"
									     id="passwd"
									     placeholder="2~8자 이내 입력">
		</td>
	</tr>
	<tr>
		<th>제목</th>
		<td><input type=text size=50 name="subject"
									 id="subject"
									 placeholder="50자 이내로 입력">
		</td>
	</tr>
	<tr>
		<th>내용</th>
		<td><textarea rows="5" cols="50" name="content"
				id="content" placeholder="200자 이내로 입력"></textarea>
		</td>
	</tr>
	<tr>
		<th>파일첨부</th>
		<td><input type=file name="myfile" id="myfile">
		</td>
	</tr>
	<tr>
		<td colspan=2 align=center>
			<input type="submit" value="글작성1"><!-- 전송기능 있는 버튼 -->
			<!-- <input type="button" value="글작성2">전송기능 없는 버튼 -->
			
			<!-- <button>글작성3</button>전송기능 있는 버튼 -->
			<!-- <button type="submit">글작성4</button>전송기능 있는 버튼 --> 
			<!-- <button type="button">글작성5</button>전송기능 없는 버튼 -->
			
			<input type="reset" value="취소"><!-- 초기화 버튼 -->
			<!-- <button type="reset">초기화</button>초기화 버튼 -->
		</td>
	</tr>
</table>
</form>

</body>
</html>

- board.js

	$(document).ready(function(){
		$("form").submit(function(){
			if($("#writer").val() ==""){
			alert("작성자 명을 입력하세요");
			$("#writer").focus();
			return false;
			}
		
			if($("#passwd").val() ==""){
			alert("비밀번호를 입력하세요");
			$("#passwd").focus();
			return false;
			}
	
			if($("#passwd").val().length < 2 ||
				$("#passwd").val().length > 8 ) {
				alert("비밀번호는 2 ~ 8 자 이내로 입력하세요");
				$("#passwd").val("").focus();
				return false;
			}
			
			if($("#subject").val() ==""){
				alert("제목을 입력하세요.");
				$("#subject").focus();
				return false;
				}
			if($("#subject").val().length > 50) {
				alert("제목을 50자 이내로 입력하세요.");
				$("#subject").val("").focus();
				return false;
			}
			if($("#content").val() ==""){
				alert("내용을 입력하세요.");
				$("#content").focus();
				return false;
				}
			if($("#content").val().length > 200) {
				alert("내용을 200자 이내로 입력하세요.");
				$("#content").focus();
				return false;
			}
			if($("#myfile").val() == ""){
				alert("첨부파일을 선택하세요.");
				return false;
			}
		
		});	// submit() end
	})	// $(document) end

복습

jQuery

- 함수형태의 라이브러리를 지원

- jQuery 라이브러리는 확장자가 .js

- Javascript 파일 또는 jQuery 라이브러리인 .js 파일은 함수단위로 내용이 들어간다

 

jQuery와 디자인

- 디자인쪽에도 많이 사용된다 (동적인 부분)

- 과거 플래시가 하던 기능들 처리 가능

 

동기적인 방식

- 페이지가 바뀜

- 부모페이지에서 자식 페이지로 바뀜

- ID 중복검사 시 팝업창을 띄움

 

비동기적인 방식

- 페이지가 바뀌지 않는다

- 팝업창 띄우지 않고도 ID 중복검사 가능 -> AJAX

- 페이지 바꾸지 않고도 댓글을 바로 쓸 수 있다

 

 jQuery 함수 기본

jQuery(document).ready(function(){
});

- Javascript 에서의 document 객체를 의미

- document는 현재문서를 의미한다

- jQuery 대신 $ 로 바꿔쓸 쑤 있다.

- jQuery 함수는 태그를 불러오는 것에만 사용되고, 나머지 기능은 그 뒤의 함수들이 모두 처리 ex) ready(), hide()

- ready() 는 준비가 되었다면 을 의미함

 

jQuery 함수 간결하게 표기

$(function(){
});

 

jQuery 함수 안에 들어가는 것

1. HTML 태그

$('div').hide();

 

2. CSS 선택자

$('#sample1').hide();

- 태그가 여러개일때, id 값이나 class 속성값으로 구분

- 그 외 다양한 방법들이 있다

3. document 객체

$(document).ready();

 

jQuery 이벤트 처리 함수 정리

click() 클릭시에 처리를 실행한다.
submit() submit버튼을 클릭할때 실행한다.
dblclick() 더블클릭시에 처리를 실행한다.
mousedown() 마우스의 버튼을 눌렀을 때 처리를 실행한다.
mouseup() 마우스의 버튼이 떨어졌을 때 처리를 실행한다.
toggle() 클릭될 때 마다 다른 처리를 실행한다.
mouseover() 마우스가 오버됐을 때 처리를 실행한다.
mouseout() 마우스가 아웃되었을 때 처리를 실행한다.
mousemove() 마우스가 이동될 때 처리를 실행한다.
one() 이벤트 발생에 한 번만 처리를 실행한다.
unbind() 설정되어 있는 이벤트 처리를 취소한다.
live() 앞으로 추가될 태그에 이벤트 처리를 설정한다.
change() 값의 변화가 발생할때

 


jQuery 예제8

다양한 형태의 선택자 응용 예제1

- sample4.html

<!DOCTYPE html>
<html>
	<head>		
		<title>sample4</title>
		<meta charset="UTF-8">
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
		$(document).ready(function(){
//		$(function(){
			$(".first strong").css("color","red");
		});

		</script>
	</head>
	<body>
		<ul>
			<li class="first"><strong> 텍스트 </strong> 텍스트 텍스트 텍스트 텍스트 </li>
			<li class="second"><strong> 텍스트 </strong> 텍스트 텍스트 텍스트 텍스트 </li>
			<li class="third"><strong> 텍스트 </strong> 텍스트 텍스트 텍스트 텍스트 </li>
			<li class="fourth"><strong> 텍스트 </strong> 텍스트 텍스트 텍스트 텍스트 </li>
		</ul>

	</body>
</html>

- <li> 태그 안에 자식태그인 <strong> 태그가 있다, <li> 태그는 부모태그, <strong> 태그는 자식태그

- jQuery 코드에서 .first 는 class값이 first 인 태그를 불러온다

- 한칸 띄어쓰기는 자손태그(자식태그 포함)을 의미한다

- 즉 class값이 first 로 되어있는 태그의 자손태그 중 strong 태그를 불러와라는 의미

 

* 자손태그 = 후손태그 = 자식태그를 포함한 후손의 모든 태그

+ <strong> 태그는 안의 내용을 bold 로 출력

 

jQuery 예제9

다양한 형태의 선택자 응용 예제2

- sample5.html

<!DOCTYPE html>
<html>
	<head>		
		<title>sample5</title>
		<meta charset="UTF-8">
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">

		$(function(){
			$("li *").css("color","red");
		});

		</script>
	</head>
	<body>
		<ul>
			<li><strong> 텍스트 </strong> 텍스트 텍스트 텍스트 텍스트 </li>
			<li><em> 텍스트 </em> 텍스트 텍스트 텍스트 텍스트 </li>
			<li><span> 텍스트 </span> 텍스트 텍스트 텍스트 텍스트 </li>
			<li> 텍스트텍스트텍스트텍스트 </li>
		</ul>

	</body>
</html>

- li는 모든 li 태그를 불러와라는 의미이고 한칸 띄워져있으므로 자손태그를 의미한다

- 'li *' 라는 선택자는 <li> 태그의 모든 자손태그를 불러와라는 의미

- 즉 <li> 태그의 자손태그인 <strong>, <em>, <span> 태그들이 해당된다 (<li> 가 아닌 <li>의 자손태그에 해당)

 

* 자손태그 = 후손태그 = 자식태그를 포함한 후손의 모든 태그

+ <em> 태그 안에 내용은 기울임체

- <li> 태그에만 해당하는 것은 CSS가 적용되지 않음

- <li> 태그의 자손태그에 해당하는 <strong> <em> <span> 부분의 내용만 CSS가 적용됨

 

jQuery 예제10

다양한 형태의 선택자 응용 예제3

- sample6.html

<!DOCTYPE html>
<html>
	<head>		
		<title>sample6</title>
		<meta charset="UTF-8">
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">

		$(function(){
			$("#first,#third").css("color","red");
		});

		</script>
	</head>
	<body>
		<ul>
			<li id="first"> 텍스트 텍스트 텍스트 텍스트 텍스트 </li>
			<li id="second"> 텍스트 텍스트 텍스트 텍스트 텍스트 </li>
			<li id="third"> 텍스트 텍스트 텍스트 텍스트 텍스트 </li>
			<li id="fourth"> 텍스트 텍스트 텍스트 텍스트 텍스트 </li>
		</ul>
	</body>
</html>

- #first 은 id값이 first로 되어있는 태그를 불러와라는 의미이고, #third는 id값이 third로 되어있는 태그를 불러와라는 의미

- 선택자에서 ',' 가 있을땐 양쪽 두개가 모두 동일한 적용을 받게 된다 

- 즉, id값이 first로 되어있는 태그도 불러오고, id값이 third로 되어있는 태그도 불러와라는 의미

 

- id값이 first 인 li 태그와 id값이 third인 li 태그만 CSS의 적용을 받는다

 

jQuery 예제11

jQuery 이벤트 처리 예제 1

+ 크롬 브라우저에선 폴더명에 공백이 있으면 실행되지 않음, 이름바꾸기로 공백을 없애주기

- sample1.html (이름은 같지만 어제했던 파일과 다른파일임)

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample1</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script>
		jQuery(document).ready(function(){
//		$(function(){
// $("input")
// $("input:button")
// $(":button")
// $('input[type=button]')
// $("#b1")
			$("#b1").click(function(){
				$("img").attr("src","sea.jpg")
					    .attr("title","바다")
						.attr("width",150)
						.attr("height",150);
				alert("그림이 바꼈습니다.");
			});

		});
		</script>
	</head>
	<body>
<!--
    <button>화면을 변경</button>
	<button type="button">화면을 변경</button>-->
	<input type=button value="화면을 변경" id="b1">
	
	<p><img src="flower.jpg" title="꽃" /></p>
	
	</body>
</html>

<head>

- jQuery 에선 이벤트를 처리할때, 가장 먼저 이벤트를 발생시킨 태그를 구해와야한다

- input 태그에서 이벤트가 발생하므로, input 태그를 먼저 "#b1"으로 구해온다

- (지금은 input 태그가 1개이므로'input' 으로도 구해올 수 있다)

- click() 함수를 통해 이 버튼을 클릭시 처리해야할 내용은 function의 내용이다

- img 태그를 불러온 다음, attr() 함수를 사용해서

 

<body>

- 버튼이 만들어져있고, 버튼의 id값은 "b1", 또한 초기 이미지 flower.jpg 가 들어가있다

- attr() 함수로 해당 이미지 태그의 속성값들을 변경하고 있다

- src는 "sea.jpg" 로 변경되고, title은 "바다" 로 변경되고 width 와 height 는 각각 150으로 변경되었다

* Attr() 함수 설명은 아래

* jquery.com 에서 API 찾아보기 설명은 아래

+ 버튼을 누르면 사진이 변경된다

+ 이걸 Javascript로 구현하기는 쉽지 않음, jQuery 에선 지원하는 함수들이 많으므로 더욱 간편하게 구현 가능

 


* Attr() 함수

용어

HTML XML
태그 Element
속성 Attribute

 

- src, width, height, title 은 속성(Attribute)

 

+ XML 파일은 반드시 가장 바깥쪽에 사용될 루트 엘리먼트를 반드시 1개 가지고 있어야한다

* 루트 엘리먼트 = XML 에서 가장 바깥쪽에 사용되는 태그

 

Attr() 함수

- HTML 태그의 속성을 설정/변경

- Attribute 속성을 변경시킬때 사용하는 함수

 

Attr() 함수의 2가지 용도

1. 속성에 속성값을 설정

- 2개의 매개변수

	//attr('속성', '속성값')
	  attr('src', 'flower.jpg')

- 첫번째 매개변수에 속성명, 두번째 매개변수에 속성값을 사용하여 속성을 설정 및 수정


2. 속성을 이용해서 속성값을 구해온다.

- 1개의 매개변수

	//attr('속성')
	  attr('href')

- 'href' 속성값을 구해온다

- 해당 속성명의 속성값을 구해온다


* jquery.com 에서 API 찾아보기

https://api.jquery.com/attr/

 

.attr() | jQuery API Documentation

Description: Get the value of an attribute for the first element in the set of matched elements. The .attr() method gets the attribute value for only the first element in the matched set. To get the value for each element individually, use a looping constr

api.jquery.com

 

 

함수 형식

 

예제와 데모


jQuery 이벤트 처리 함수 정리

click() 클릭시에 처리를 실행한다.
submit() submit버튼을 클릭할때 실행한다.
dblclick() 더블클릭시에 처리를 실행한다.
mousedown() 마우스의 버튼을 눌렀을 때 처리를 실행한다.
mouseup() 마우스의 버튼이 떨어졌을 때 처리를 실행한다.
toggle() 클릭될 때 마다 다른 처리를 실행한다.
mouseover() 마우스가 오버됐을 때 처리를 실행한다.
mouseout() 마우스가 아웃되었을 때 처리를 실행한다.
mousemove() 마우스가 이동될 때 처리를 실행한다.
one() 이벤트 발생에 한 번만 처리를 실행한다.
unbind() 설정되어 있는 이벤트 처리를 취소한다.
live() 앞으로 추가될 태그에 이벤트 처리를 설정한다.
change() 값의 변화가 발생할때

- keyup 이벤트 등 이것 외에도 많은 이벤트 함수들이 제공된다

 

jQuery 예제12

jQuery 이벤트 처리 예제 2

- 하이퍼링크에 click() 을 썼을때 생기는 문제

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample2</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">

		$(function(){
			$("a").click(function(){
				$("img").attr("src","sea.jpg")
						.attr("title"," 바다");
				alert("이미지 변경");
			});
		});

		</script>
	</head>
	<body>
	
	<a href="sea.jpg">화면을 변경</a>

	<p><img src="flower.jpg" title="꽃" /></p>
	
	</body>
</html>

- sample1.html 처럼 버튼이 아니라 텍스트에 하이퍼링크를 걸어서 하이퍼링크를 클릭시 이미지를 변경시키려 하고 있다

- 하이퍼링크 a 태그도 클릭시 클릭 이벤트가 발생한다, 그래서 click() 을 사용하여도 된다

- 하지만 하이퍼링크 클릭시에 image src 가 변경되고 title 값도 변경되지만 이미지가 변경된 이후에 anchor 태그가 같이 동작됨

- 링크걸린 것이 동작이 되어서 브라우저 전체가 이미지를 덮어버리는 문제가 발생한다

+ 이 예제의 문제를 다음 예제에서 해결한다

 

sample2.html 해결 방법 2가지

1. a 태그로 링크를 걸때 href 에 링크대신 # 또는 javascript:void(0) 으로 수정

- 다음 예제 sample3.html 에서 설명

	<a href="sea.jpg">화면을 변경</a>

- 이었던 코드를

	<a href="#">화면을 변경</a>

- 또는

	<a href="javascript:void(0)">화면을 변경</a>

- 이렇게 변경시 anchor 가 실행되지 않음

- 링크를 걸 내용들이 수정되면 안되는 경우가 있다

2. 이벤트 함수의 마지막에 return false; 추가

		$(function(){
			$("a").click(function(){
				$("img").attr("src","sea.jpg")
						.attr("title","바다");
				return false;
			});
		});

- 다음 예제 sample4.html 에서 설명

 

jQuery 예제13

jQuery 이벤트 처리 예제 4

- 하이퍼링크에 click() 을 썼을때 생기는 문제 해결 첫번째 방법

- sample2.html 문제의 해결방법 첫번째

- 하이퍼링크의 기능 무효화 방법 1번

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample3</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">

		$(function(){
			$("a").click(function(){
				$("img").attr("src","sea.jpg")
						.attr("title","바다");
			});
		});

		</script>
	</head>
	<body>
	
	<a href="javascript:void(0)">화면을 변경</a>

	<p><img src="flower.jpg" title="꽃" /></p>
	
	</body>
</html>

- # 으로 한것과 같은 의미

 

jQuery 예제14

jQuery 이벤트 처리 예제 5

- 하이퍼링크에 click() 을 썼을때 생기는 문제 해결 두번째 방법

- sample2.html 문제의 해결방법 두번째

- 하이퍼링크의 기능 무효화 방법 2번

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample4</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">

		$(function(){
			$("a").click(function(){
				$("img").attr("src","sea.jpg")
						.attr("title","바다");
				return false;
			});
		});

		</script>
	</head>
	<body>
	
	<a href="sea.jpg">화면을 변경</a>

	<p><img src="flower.jpg" title="꽃" /></p>
	
	</body>
</html>

- click() 함수 맨 마지막 줄에 return false를 추가시 anchor 태그로 링크가 걸려있다 하더라도 실행되지 않게 막아줌

- return false는 함수를 빠져나감과 동시에 anchor 하이퍼링크를 실행시키지 않도록 막아줌

- 주로 사용하는 방식이다

 

이벤트 발생 태그 얻기

- id 나 class 값 말고도 다른 방법으로 태그를 구해오는 방법들

- eq 필터 사용

- this 사용

 

jQuery 예제 15

이벤트 발생 태그 얻기 예제 1

eq 필터 사용

- id 나 class 값 말고도 다른 방법으로도 태그를 구해올 수 있는 방법들이 있다. 그중 하나

- sample5.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample5</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
//	eq 필터 : 특정 태그안에 지정한 순서의 태그를 구하는 셀렉터
		

		$(function(){
			$("a:eq(0)").click(function(){
				$("img").attr("src","flower.jpg").attr("title","꽃");
				return false;
			});
			$("a:eq(1)").click(function(){
				$("img").attr("src","sea.jpg")
						.attr("title","바다");
				return false;
			});
			$("a:eq(2)").click(function(){
				$("img").attr("src","Jellyfish.jpg").attr("title","해파리");
				return false;
			});
			$("a:eq(3)").click(function(){
				$("img").attr("src","building.jpg").attr("title","건물");
				return false;
			});
		});

		</script>
	</head>
	<body>
	<ul>
		<li><a href="flower.jpg">꽃</a></li>
		<li><a href="sea.jpg">바다</a></li>
		<li><a href="Jellyfish.jpg">해파리</a></li>
		<li><a href="Building.jpg">건물</a></li>
	</ul>
	<p><img src="flower.jpg" title="꽃" /></p>
	
	</body>
</html>

- 이벤트를 발생시킨 태그 4개를 구해오고 있다, 모두 같은 태그인 a 태그로 되어있으므로 id, class 값으로 구해올 수 있다.

- 하지만 여기선 id값이 따로 없기에 구분이 안됨, 동일 태그를 eq 필터를 사용해서 구해오고 있다

- 첫번째 a 태그를 a:eq(0) 으로 구해오고 있다, a 태그 중 첫번째 순서의 태그를 의미한다

- 두번쨰 a 태그를 a:eq(1) 로 구해오고 있다, a 태그 중 두번째 순서의 태그를 의미한다.

- img 태그는 한개이므로 img 태그로 구해와서 attr() 로 src 속성값을 변경하므로서 이미지를 변경시키고 있다

- click() 함수 내부 아래쪽에 return false를 사용해서 anchor 태그의 하이퍼링크 실행을 막는다

- 초기화면은 꽃 이미지이고 4개의 메뉴중 하나를 클릭하면 해당 이미지가 나타남

 

$(this)

- 코드가 훨씬 간결하고 eq 필터보다 더 많이 사용하는 방식

1. 이벤트가 발생한 태그를 얻어오는 셀렉터가 $(this)
2. click 이벤트만 사용할 수 있다.

 

jQuery 예제 16

이벤트 발생 태그 얻기 예제 2

this 사용

- id 나 class 값 말고도 다른 방법으로도 태그를 구해올 수 있는 방법들이 있다. 그중 하나

- sample6.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample6</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// $(this)
// 1. 이벤트가 발생한 태그를 얻어오는 셀렉터가		   $(this)
// 2. click 이벤트만 사용할 수 있다.


// img 태그의 src 속성과 title 속성을 attr()함수로 설정함
// 클릭한 태그의 href 속성을 $(this).attr("href")로 구함.
// 클릭한 태그안의 텍스트를 $(this).text()로 구함.

		$(function(){

			$("a").click(function(){

			$("img").attr("src",$(this).attr("href"))
			.attr("title",$(this).text());
				return false;
			});

		});

		</script>
	</head>
	<body>
	<ul>
		<li><a href="flower.jpg">꽃</a></li>
		<li><a href="sea.jpg">바다</a></li>
		<li><a href="Jellyfish.jpg">해파리</a></li>
		<li><a href="building.jpg">건물</a></li>
	</ul>
	<p><img src="flower.jpg" title="꽃" /></p>
	
	</body>
</html>

- 구체적으로 src 의 속성값, 즉 어떤 이미지를 사용할지를 지정하지 않음

- 이벤트를 발생시키는 태그인 anchor 태그부터 구해온다, 이때 4개의 anchor 태그를 모두 구해옴

- a 태그를 눌렀을때, img 태그를 구해와서 attr() 로 먼저 src 를 변경시키려 한다, attr("src", $(this).attr("href"))

 

this 사용 1 (sample6.html 부분)

$("img").attr("src",$(this).attr("href")

$(this)

- 여기서 this의 의미 : 사용자가 불러왔던 a 태그 중 이벤트를 발생시킨 a 태그 하나

- 사용자가 이벤트를 발생시킨 태그를 의미

 ex) '건물'이라는 하이퍼링크를 클릭시 '건물'의 a 태그가 this 가 됨

 

attr("href")

 - attr() 함수의 2번째 형태, 매개변수로 속성명을 쓰면 속성값을 구해줌

ex) '건물' 클릭시 위에서 지정된 $(this) 는 선택된 a 태그를 의미하므로 그 a 태그의 href 속성값인 "building.jpg" 를 구해줌

 

즉 $(this).attr("href") 는 building.jpg 이고, attr("src", "building.jpg") 와 같으므로 빌딩 이미지로 변경되게 됨

 

this 사용 2 (sample6.html 부분)

			$("img").attr("src",$(this).attr("href"))
			.attr("title",$(this).text());
		<li><a href="building.jpg">건물</a></li>

- 위 코드에서 마찬가지로 '건물' 을 클릭시 $(this) 는 '건물' 이 이 있는 특정 <a> 태그를 구해옴

- text() 함수는 그 태그 안의 내용(값) 을 구해오는 함수이므로 $(this).text() 는 "건물" 이 된다

- 그래서 title 속성값은 "건물" 로 변경된다

 

 

jQuery 예제17

jQuery 이벤트 함수 종류 예제 1

- click() 외 또다른 이벤트 함수들

- dblclick() : 더블클릭 이벤트 함수

- sample7.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample7</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// 특정 태그(button)를 더블클릭 하여 이벤트 처리 하고 싶을때 dblclick()를 사용

		$(function(){
			$("button").dblclick(function(){
				$("img").attr("src","sea.jpg")
						.attr("title","바다");
			});
		});

		</script>
	</head>
	<body>	
	<button>화면을 변경</button>
	
	<p><img src="flower.jpg" title="꽃" /></p>
	
	</body>
</html>

- 더블클릭 이벤트를 처리하기 위한 dblclick() 함수가 있다.

- dblclick() 함수 안의 코드는 더블클릭 시 실행됨

버튼 더블클릭시
이미지 변경

 

jQuery 예제18

jQuery 이벤트 함수 종류 예제 2

- click() 외 또다른 이벤트 함수들

- dblclick() : 더블클릭 이벤트 함수

- 버튼이 아닌 a 태그 하이퍼링크에 더블클릭 이벤트 처리를 하면 생기는 문제와 해결

- sample8.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample8</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// a 태그에 설정한 dblclick()이 동작하지 않을 경우

// a 태그에 dblclick()를 설정한 경우에는 더블 클릭(dblclick())시에는 실행하고 
// 싶은 처리를 하고, 클릭(click())시에는 return false; 를 설정해서 링크를
// 무효화 시킨다.
 
$(function(){
/*	
	$("a").dblclick(function(){
		$("img").attr("src",$(this).attr("href"))
				.attr("title",$(this).text());
	});
*/

	$("a").dblclick(function(){
		$("img").attr("src",$(this).attr("href"))
				.attr("title",$(this).text());
	}).click(function(){
		return false;
	});

});
		</script>
	</head>
	<body>
	<ul>
		<li><a href="flower.jpg">꽃</a></li>
		<li><a href="sea.jpg">바다</a></li>
		<li><a href="Jellyfish.jpg">해파리</a></li>
		<li><a href="building.jpg">건물</a></li>
		
	</ul>
	<p><img src="flower.jpg" title="꽃" /></p>
	
	</body>
</html>

- 버튼이 아닌 a 태그의 텍스트에 더블클릭 이벤트를 처리했다

- 더블클릭시 더블클릭 전에 클릭이 먼저 수행되므로 링크가 수행되어 브라우저가 이미지를 덮게 되는 문제가 발생

- 그 문제 해결을 위해 링크를 무효화 해야한다

- 하이퍼링크를 무효화 하기 위해 dblclick() 뒤에 click() 함수를 사용해서 click() 안에 return false를 사용해서 클릭시 링크가 수행되는 것을 막고 있다.

 

dblclick() 안에 return false; 를 쓰는게 아니라 click() 안에 return false; 를 써야하는 이유

- 이유 : 더블클릭 전에 클릭이 먼저 수행되므로, 클릭 시 하이퍼링크 실행

 

 

jQuery 예제19

jQuery 이벤트 함수 종류 예제 3

- click() 외 또다른 이벤트 함수들

- mousedown() : 마우스 버튼을 눌렀을때 이벤트 발생

- sample9.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample9</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// mousedown 이벤트 : 특정 태그위에 마우스 포인터가 있는 상태에서
//					   마우스 버튼을 눌렀을 때 이벤트가 발생함.
// cf. click 이벤트는 눌러고 있던 손가락 떨어 졌을때 발생함.

$(function(){

	$("a").mousedown(function(){
		$("img").attr("src",$(this).attr("href")).attr("title",$(this).text());

		$("body").css("background","yellow");

	}).click(function(){
		return false;
	});

});
		</script>
	</head>
	<body>
	<div id="test"> 이미지 변경 </div><br><br>
	<ul>
		<li><a href="flower.jpg">꽃</a></li>
		<li><a href="sea.jpg">바다</a></li>
		<li><a href="Jellyfish.jpg">해파리</a></li>
		<li><a href="building.jpg">건물</a></li>
	</ul>
	<p><img src="flower.jpg" title="꽃" /></p>
	
	</body>
</html>

- click 이벤트와 동작시점이 미묘하게 차이가 있다

- a 태그를 클릭시 body 태그에 CSS를 적용하고 있다

- 이때, 하이퍼링크에 mousedown() 이벤트를 처리했으므로, mousedown 이벤트가 먼저 발생 후 손을 떼는 순간 click 이벤트가 발생함

- 이때, click 시에 하이퍼링크가 실행되는 것을 막기 위해서 click() 을 추가해주고 안에 return false를 추가함

- 여기선 mousedown 이벤트가 먼저 발생하고 손을 떼는 순간 click 이벤트가 다음으로 실행된다

 

click 이벤트 vs mousedown 이벤트

- click 이벤트 : 마우스를 누른 후 뗐을때, 즉 클릭이 되었을때 발생

- mousedown 이벤트 : 마우스를 누른 직후 발생

 

jQuery 예제 20

jQuery 이벤트 함수 종류 예제 4

- click() 외 또다른 이벤트 함수들

- mouseup() : 마우스 버튼을 눌렀다가 뗐을때 이벤트 발생

- sample10.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample10</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// mouseup 이벤트 : 특정 태그위에 마우스 포인터가 있는 상태에서
//					이미 눌러있던 버튼이 떨어지는 경우에 이벤트가 발생함.

$(function(){
	$("a").mouseup(function(){
		$("img").attr("src",$(this).attr("href")).attr("title",$(this).text());
		$("body").css("background", "green");

	}).click(function(){
		return false;
	});
});
		</script>
	</head>
	<body>
	<ul>
		<li><a href="flower.jpg">꽃</a></li>
		<li><a href="sea.jpg">바다</a></li>
		<li><a href="Jellyfish.jpg">해파리</a></li>
		<li><a href="building.jpg">건물</a></li>
		
	</ul>
	<p><img src="flower.jpg" title="꽃" /></p>
	
	</body>
</html>

- Click 이벤트는 말 그대로 어떤 컨트롤을 Click 했을때 발생하는 이벤트
- Mouse Up 은 어떤 컨트롤에서 마우스 버튼을 release 할때 발생하는 이벤트
- 마우스로 어떤 컨트롤을 클릭했을때 MouseDown-MouseUp-Click 이벤트 순으로 이벤트 발생

 

 

toggle() 함수

- 클릭할 때 마다 다른 처리를 실행하고 싶은 경우에 편리하게 사용할 수 있다
1. 괄호안에 function(){...}을 컴마(,)로 구분하며 여러가지 설정이 가능하고, 클릭한 순서대로 실행한다.
2. 설정해 놓은 처리가 마지막까지 실행되면, 처음 처리로 돌아와서 반복 실행한다

$(function(){ $(셀렉터).toggle(function(){ 처음 클릭했을 때 실행할 문장 }, 
			function(){ 두 번째 클릭했을 때 실행할 문장 }, 
			function(){ (중략...) }, 
            		function(){ 마지막 클릭했을 때 실행할 문장 });

 

jQuery 예제21

jQuery 이벤트 함수 종류 예제 5

- click() 외 또다른 이벤트 함수들

- toggle() : 요소를 클릭할 때마다 로테이션으로 다른 내용들을 실행해줌

- sample11.html

 

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample11</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// toggle 이벤트 : 클릭할 때 마다 다른 처리를 실행하고 싶은 경우에 편리하게
//					사용할 수 있다.
// 1.괄호안에 function(){...}을 컴마(,)로 구분하며 여러가지 설정이 가능하고,
//   클릭한 순서대로 실행한다.
// 2.설정해 놓은 처리가 마지막까지 실행되면, 처음 처리로 돌아와서 반복 
//	 실행한다

/*  $(document).ready(function(){
//	$(function(){
		$(셀렉터).toggle(function(){
			처음 클릭했을 때 실행할 문장
		}, function(){
			두 번째 클릭했을 때 실행할 문장
		}, function(){
			(중략...)			
		}, function(){
			마지막 클릭했을 때 실행할 문장
		});
	});
*/

$(function(){

	$("button").toggle(function(){
		$("img").attr("src","sea.jpg")
				.attr("title","바다");
	},function(){
		$("img").attr("src","Jellyfish.jpg")
				.attr("title","해파리");
	},function(){
		$("img").attr("src","building.jpg")
				.attr("title","건물");
	},function(){
		$("img").attr("src","flower.jpg")
				.attr("title","꽃");
	});

});

		</script>
	</head>
	<body>
	
	<button type=button>화면을 변경</button>
	
	<p><img src="flower.jpg" title="꽃" /></p>
	
	</body>
</html>

- 버튼이 하나뿐이지만 클릭할때마다 이미지들이 로테이션됨

- 달라지는 내용을 따로따로 함수형태로 추가함, 추가된 내용들이 순차적으로 로테이션 됨

- 마치 toggle() 함수의 매개변수를 여러개 넣는 것 처럼 function(){} 을 계속 추가한다

 

jQuery 예제22

jQuery 이벤트 함수 종류 예제 6

- click() 외 또다른 이벤트 함수들

- mouseover() : 특정 요소에 마우스를 위로 가져다 올리면 실행됨

- mouseout() : 마우스가 올라간 상태에서 마우스를 치우면 실해됨

- sample12.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample12</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
		$(document).ready(function(){	
//		$(function(){

			$("img").mouseover(function(){
				$(this).attr("src","sea.jpg")
					   .attr("title","바다");
				$("body").css("background","yellow");
			}).mouseout(function(){
				$(this).attr("src","flower.jpg")
					   .attr("title","꽃");
				$("body").css("background","green");
			});

		});

		</script>
	</head>
	<body>
	
	<img src="flower.jpg" title="꽃" />
	
	</body>
</html>

- 마우스를 이미지로 가져다 대면 mouseover 이벤트가 발생하여 바다이미지로 변경하고 배경색을 노랑색으로 한다

- 마우스를 이미지에서 다른곳으로 치우면 mouseout 이벤트가 발생하여 꽃 이미지로 변경하고 배경색을 초록색으로 한다

- 이벤트를 발생시키는 태그는 img 태그이므로 this 자리에 'img' 를 대신 써도 된다, img 태그는 하나뿐이므로 'img' 로 대체 가능

- img 태그는 공통으로 사용되기 때문에 $("img").mouseover().mouseout() 으로 연결해서 사용하여도 되고, $("img").mouseover() 과 $("img").mouseout() 으로 따로 작성하여도 똑같다.

 

 

jQuery 예제23

jQuery 이벤트 함수 종류 예제 6

- click() 외 또다른 이벤트 함수들

- mousemove() : 마우스가 움직일때 실행됨

- sample13.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample13</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// img태그 위에 마우스포인터가 움직이는 경우에 마우스 포인터의 x좌표와 y좌표를
// p태그에 출력하는 스크립트.

$(function(){

	$("img").mousemove(function(e){
		$("p").html("현재 X좌표:"+e.clientX+"<br> 현재 Y좌표:"+e.clientY);
	});

});
		</script>
	</head>
	<body>
		<img src="flower.jpg" title="꽃" />
		<p></p>
	</body>
</html>

- p 태그는 좌표값이 출력될 영역

- 좌측 상단을 기준으로 움직일때마다 해당 마우스 포인트의 좌표값을 출력

- mousemove() 함수에 의해 이미지 내에서 마우스를 움직일때마다 mousemove() 안쪽 내용이 실행됨

- function의 매개변수 e 의 ClientX 속성을 통해서 마우스포인터의 x좌표값을 구해온다

- function의 매개변수 e의 ClientY 속성을 통해서 마우스 포인터의 y좌표값을 구해온다

 

특정 태그 안에 결과를 출력시켜주는 함수

html() 함수

- 불러온 p 태그 사이에 안의 내용을 출력시켜줌, 이 html() 함수는 안의 html 코드를 인식하므로 <br> 을 인식해서 줄을 바꿔서 출력한다

html() : <br> 태그 인식

text() 함수

- html() 대신 text() 태그를 쓰면 <br> 태그를 인식하지 못하고 문자로 출력해줌

text() : <br> 태그 인식 못함

 

jQuery 예제24

jQuery 이벤트 관련 함수 1

- 이벤트를 최초 한번만 실행해줌

- one() : 이벤트를 한번만 실행해주는 함수

- sample14.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample14</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// 지정한 태그에서 발생한 이벤트에 대해 한 번만 실행되도록 하는 명령어가 one()

// $(셀렉터).one("이벤트 발생 조건", function(){
//		이벤트 발생시에 실행하는 부분
//  }



$(function(){

	$("a").one("click",function(){
//	$("a").click(function(){
		$("img").attr("src",$(this).attr("href"))
				.attr("title",$(this).text());
		return false;
	});

});

		</script>
	</head>
	<body>
	<ul>
		<li><a href="flower.jpg">꽃</a></li>
		<li><a href="sea.jpg">바다</a></li>
		<li><a href="Jellyfish.jpg">해파리</a></li>
		<li><a href="building.jpg">건물</a></li>
	</ul>

	<p><img src="flower.jpg" title="꽃" /></p>
	</body>
</html>

- 먼저 이벤트를 발생시키는 태그인 a 태그를 구해옴

- one() 함수로 이벤트가 한번씩만 발생하도록 하고 있다

- one("이벤트명", function(){}); 으로 하면 해당 이벤트를 한번만 실행해준다. 이벤트 발생시 실행되는 내용은 function 안의 내용

- $(this).text() 처럼 text() 함수의 매개변수에 아무것도 없을때는 값을 구해온다

- 처음 한번 클릭시에는 이미지를 변경해주지만 다음에 클릭했을땐 이미지 변경해주지 않음, 그냥 클릭이 되어 하이퍼링크만 실행됨

* text() 함수 설명 아래에

처음 누르면 적용됨->바다
두번째 누르면

 

두번째부터는 click()실행 안됨


text() 함수

- 매개변수가 없을땐 해당 태그 사이의 값을 구해옴

		.attr("title",$(this).text());

- 매개변수가 있을땐 그걸 출력시킴

		$("p").text("현재 X좌표:"+e.clientX+"<br> 현재 Y좌표:"+e.clientY);

jQuery 예제24

jQuery 이벤트 관련 함수 2

- 설정되어있는 이벤트를 취소시켜주는 함수

- unbind() : 설정되어있는 이벤트를 취소시켜줌

- sample15.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample15</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// unbind()는 설정되어 있는 이벤트 처리를 취소하는 명령
// a태그가 클릭되면 img태그를 변경하는 이벤트 처리가 되지만
// 취소라는 버튼을 클릭하면 unbind()에서 a태그의 이벤트를 취소한다.


$(function(){

	$("a").click(function(){
		$("img").attr("src",$(this).attr("href")).attr("title",$(this).text());
		return false;
	})
	$("button").click(function(){
		$("a").unbind("click");	// anchtor 태그에 설정된 click 이벤트를 취소해주는 역할
	});

});

		</script>
	</head>
	<body>
	<button>취소</button>
<ul>
	<li><a href="flower.jpg">꽃</a></li>
	<li><a href="sea.jpg">바다</a></li>
	<li><a href="Jellyfish.jpg">해파리</a></li>
	<li><a href="building.jpg">건물</a></li>
</ul>

<p><img src="flower.jpg" title="꽃" /></p>
	</body>
</html>

- unbind() 함수로 설정되어있는 click() 이벤트를 취소

- 이벤트 동작이 잘 되다가 취소 버튼을 누르면 이벤트 처리가 되지 않음

- 이벤트를 발생시키는 a 태그에서 click() 이벤트를 처리했는데 이 이벤트를 취소하고 싶으면 해당 태그인 a 태그를 구해야 한다

- 그 후 unbind("click") 로 a 태그에 대한 click 이벤트 취소

- unbind()로 취소하는 코드를 버튼태그 click 이벤트에서 처리하고 있다

이벤트 실행 안됨

jQuery 예제25

jQuery 이벤트 관련 함수 3

- live() : 앞으로 추가될 태그에 대해 이벤트 처리해주는 함수

-  sample16.html 은 문제점, sample17.html은 해결법

- 여기선 새로 추가된 태그에 대해 동작하지 않음

- sample16.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample16</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// 실행한 시점에 존재하는 태그와 더불어 앞으로 추가될 태그에도 이벤트 처리를
// 설정할 수 있는 명령어가 live() 입니다.

// click 이벤트로 처리

$(function(){

	$("a").click(function(){
		$("img").attr("src",$(this).attr("href")).attr("title",$(this).text());
		return false;
	});
	$("button").click(function(){
		$("ul").append("<li><a href='building.jpg'>건물</a></li>");
	});

});
		</script>
	</head>
	<body>
		<button>li 요소를 추가</button>
	<ul> 
		<li><a href="flower.jpg"> 꽃</a></li>
		<li><a href="sea.jpg"> 바다</a></li>	
		<li><a href="Jellyfish.jpg"> 해파리</a></li>
	</ul>
	<p><img src="flower.jpg" title=" 꽃" /></p>

	</body>
</html>

- 3개의 a 태그를 모두 불러와서 click() 이벤트 처리를 했다

- 버튼을 누르면 건물이라는 메뉴가 하나 더 나타난다

- append() 함수를 통해 <ul> 태그 안에 <li> 코드를 추가하여 메뉴가 하나 더 나타나게 되는 것

- append() 함수 : 불러온 태그 안에 새로운 내용 추가

- 하지만 새로 나타난 '건물'은 click() 이벤트 처리가 되어있지 않는 문제가 발생

+ 버튼을 누를떄마다 append() 가 실행되고, 누를때마다 <li>가 추가됨

- 건물은 처음부터 있던 요소가 아니므로 이벤트 처리가 되어있지 않음

- 처음에 없던 메뉴이므로 '빌딩' 메뉴는 click 이벤트 적용이 안됨

 

위 문제 해결방법

- live() : 앞으로 추가될 태그에 대해 이벤트 처리해주는 함수

-  sample16.html 은 문제점, sample17.html은 해결법

- sample17.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample17</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// 실행한 시점에 존재하는 태그와 더불어 앞으로 추가될 태그에도 이벤트 처리를
// 설정할 수 있는 명령어가 live() 입니다.

// live 이벤트로 처리

$(function(){

	$("a").live("click",function(){
		$("img").attr("src",$(this).attr("href")).attr("title",$(this).text());
		return false;
	});

	$("button").click(function(){
		$("ul").append("<li><a href='building.jpg'>건물</a></li>");
	});
});

		</script>
	</head>
	<body>
		<button>li 요소를 추가</button>

	<ul> 
		<li><a href="flower.jpg"> 꽃</a></li>
		<li><a href="sea.jpg"> 바다</a></li>
		<li><a href="Jellyfish.jpg"> 해파리</a></li>
	</ul>

	<p><img src="flower.jpg" title=" 꽃" /></p>
	</body>
</html>

- sample16.html 의 click() 함수가 있던 자리에 live() 함수로 바뀜

- live() 함수 : 현재시점에 존재하는 태그 뿐 아니라 앞으로 추가될 태그까지 이벤트 처리를 할 수 있게 해줌

- live("이벤트명", function(){}); 으로 하면 앞으로 추가될 태그까지 이벤트 처리해줌, 이벤트 발생시 실행되는 내용은 function 안의 내용

 

+ 버튼 클릭할때마다 append() 함수에 의해 메뉴가 추가됨

 

jQuery 예제 26

jQuery form 태그 관련 함수 예제 1

- form 태그에 사용되는 jQuery 함수들

- sample1.html (아까의 sample1.html 과 다른 파일)

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample1</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// text()메소드의 괄호안에 아무것도 기술하지 않은 경우에는, 
// 셀렉터로 지정한 태그에 포함되어 있는 텍스트를 가져온다.
 

// text()메소드의 괄호안에 값이 설정되어 있을 경우에는 
// 셀렉터(button)의 value값을 설정하게 된다.
// (이벤트가 발생되기 전에는 "확인" 버튼 이지만,
// clik이벤트가 발생한 뒤에는 "전송" 버튼으로 변경됨)

// val()메소드는 괄호안에 아무것도 기술하지 않고 사용하면, 
// 폼 태그에 입력되어 있는 텍스트나 선택되어 있는 값을 가져온다.

// 셀렉터로 input태그를 지정하면 val()은 폼 태그의 종류를 
// 결정하는 type속성에 상관없이 모든 input 태그의 value속성값을 
//  가져온다.
 

$(function(){

	$("#con").click(function(){  // 확인
//		$("p").text($("input").val()+"로 메일을 전송합니다.");
		alert($("input").val());
		$("#con").text("전송");//확인->전송
//		$("#re").text("cancel");//취소->cancel
		$("#re").hide();
	});

	$("#re").click(function(){	// 취소
		$("input").val("");
		$("input").focus();
	});

});
		</script>
	</head>
	<body>
		<p>E-mail 주소:
		<input type="text" name="name" /></p>
		<button id="con">확인</button>
		<button id="re">취소</button>
	</body>
</html>

 - 이벤트 처리가 발생하는 태그인 "확인" 버튼 태그를 구해와서 click() 을 사용함

- 다음으로 $("input").val() 로 사용자가 입력한 이메일 주소값을 가져옴

- val() 함수 : 입력양식 요소의 (text) "값"을 가져옴

- "확인" 버튼을 클릭시, 그 버튼 태그 안의 내용을 text() 함수를 통해 버튼 레이블을 "전송"으로 변경하고 "취소" 버튼은 hide() 로 숨김

+ value() 는 값을 가져오는 기능도 있고 값을 설정하는 기능도 있다

 

text() vs value()

- text() 함수 : 링크가 걸려있거나 일반 텍스트에 대해 적용

- value() 함수 : 입력양식 / 선택양식 에 대해서만 적용된다

 

+ 취소 버튼은 누르면 text 내용을 지워주는 기능

 

jQuery 예제 27

jQuery form 태그 관련 함수 예제 2

- sample2.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample2</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// 폼 태그의 내용을 바꾸고자 할 경우에도 val()명령을 사용할 수 
// 있다.
// 변경의 대상이 되는 태그를 셀렉터로 지정하고 변경하고 싶은 값은 // 괄호안에 기술한다.
 

// 클리어 버튼(button)이 클릭되면 val("")을 실행하고 input태그의 
// 값을 공백으로 변경하는 스크립트임.


$(function(){

	$("#con").click(function(){			// 확인
		if($("input").val() == ""){
			alert("값을 입력 하세요");
			$("input").focus();
		}		
	});

	$("#cancel").click(function(){	  // 클리어
//		$("input").val("");
//		$("input").focus();	
	    $("input").val("").focus();
	});
});
		</script>
	</head>
	<body>
		이름:<input type="text">
		<button id="con"> 확인 </button> 
		<button id="cancel"> 클리어</button>
		
	</body>
</html>

- input tex 창에 아무것도 입력하지 않고 확인 버튼을 누르면 alert 창을 띄우고 input text 창에 focus 해준다

- $("input").val() 는 input 태그의 값을 구해준다, 이걸 통해 입력을 하였는지 안하였는지 확인 가능

- 클리어 버튼을 누르면 val("") 로 input 태그의 값을 설정한다

 

+ Javascript 에서는 값은 value 속성으로 구해왔지만 jQuery 에선 함수 중심이므로 val() 함수로 구해옴

 

+ 추가

	    $("input").val("").focus();

- 같은 선택자 이므로 이렇게 연결해서 사용 가능하다

	$('input').val("")
	$('input').focus();

- 이렇게 분리해서 사용해도 똑같다

 

val() 함수 두가지 용도

- 입력양식에 대해서만 사용 가능하다

1. 값을 구해온다

		if($("input").val() == ""){
			alert("값을 입력 하세요");
			$("input").focus();
		}

2. 값을 설정한다

	    $("input").val("").focus();

 

text() vs value()

- text() 함수 : 링크가 걸려있거나 일반 텍스트에 대해 적용

- val() 함수 : 입력양식 / 선택양식에 대해 값을 설정하거나 값을 구해온다

 

 

jQuery 예제 28

jQuery form 태그 관련 함수 예제 3

- focus(), blur() 이벤트 관련

- sample3.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample3</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// $(셀렉터).focus(function(){
//		셀렉터로 지정한 태그가 포커스되었을 때 실행할 문자
// });

// 폼 태그에 "입력해 주세요" 라는 문자가 회색으로 표시되고, 폼이 포커스되면
// 회색문자가 지워지고 문자가 입력되면 검은색 문자가 입력된다.

$(function(){

	$("input").val("입력해 주세요").css("color","#CCC");	// 초기

	$("input").focus(function(){	// 포커스 이벤트
		$(this).val("").css("color","#000");
	});

	$("input").blur(function(){	//포커스 아웃
		if($(this).val()==""){
			$(this).val("입력해 주세요").css("color","#CCC");
		}
	});

});

		</script>
	</head>
	<body>
		이름:<input type="text" value="" />
	</body>
</html>

- focus() 이벤트 함수 : 입력양식이 focus 되면 이벤트 발생,

- blur() 이벤트 함수 : 입력양식에서 focus가 벗어났을때 이벤트 발생

초기

- HTML 에서 placeholder 가 설정되어 있지 않음에도, jQuery 를 이용해서 비슷한 효과를 적용하고 있다

- 색깔은 회색에 가까운 색으로 "입력해 주세요" 를 나타냄

포커스 시

- focus 이벤트가 발생하여 focus() 안의 내용을 실행, 안의 val 을 "" 로 설정하고(즉, 입력값을 지우고) 글자색을 검은색으로 적용

값을 입력 후 포커스 아웃 시

- blur 이벤트가 발생하여 blur() 안의 내용을 실행, 안의 val 을 다시 "입력해 주세요" 로 설정하고 글자색을 회색으로 적용

 

jQuery 예제 29

jQuery form 태그 관련 함수 예제 4

- focus(), blur() 이벤트 관련

- login.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample5</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// blur()는 focus()와 반대로 폼 태그에서 포커스가 벗어났을 때 
// 감지하고 명령을 실행한다.
// 

// $(셀렉터).blur(function(){
//		셀렉터로 지정한 태그에서 포커스가 벗어났을 경우에 
//		실행될 문자
// });


$(function(){

	$("#id").focus(function(){	// 아이디
		$("#id").val("");			
	}).blur(function(){		
			$("#id").val("아이디");
	});

	$("#pass").focus(function(){// 비밀번호
		$("#pass").val("");			
	}).blur(function(){		
			$("#pass").val("비밀번호");
	});

});
		</script>
	</head>
	<body>
ID:<input type="text" id="id" 
		   value="아이디"><br>
비밀번호:<input type="text" id="pass" 
				value="비밀번호">	<br>
	<!--<input type=text placeholder="입력">-->
	</body>
</html>

- 이전에 자바스크립트로 구현했던 내용을 jQuery 로 간단히 구현

- HTML의 placeholder 기능과 비슷하지만, placeholder 는 포커스가 들어가더라도 값이 지워지지 않고, 값을 입력해야만 값이 지워진다는 점이 이 예제와는 다르다.

- focus() 에서 val("") 으로 text 값을 지우고, blur() 에서 val("아이디"), val("비밀번호") 로 text 값을 "아이디" , "비밀번호" 로 설정

- 초기값은 value 가 "아이디" 와 "비밀번호"

- 포커스가 들어가면 값이 지워짐

- 포커스 아웃되면 값(val)이 "비밀번호" 로 설정/수정됨

 

jQuery 예제 30

jQuery form 태그 관련 함수 예제 5

- change() 이벤트 함수 : select 옵션에서 값의 변화가 일어날때 발생하는 이벤트

- sample6.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample6</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// change()는 폼 태그의 내용이 변경 되는 것을 감지하는 명령

// $(셀렉터).change(function(){
//		셀렉터로 지정한 태그의 내용이 변경되었을 실행될 문장
// });


$(function(){

	$("select").change(function(){
		$("div").text($(this).val());
	});

});

		</script>
	</head>
	<body>
		신청자:
		<select>
			<option value=" 이름">개인</option>
			<option value=" 회사명"> 법인</option>
		</select>
		<p><div>이름</div>
		   <input type="text" /></p>

	</body>
</html>

- change : select 옵션에서 값의 변하가 일어날때 발생하는 이벤트

- select 목록에서 선택하는 옵션에 따라서 아래의 양식 변경

ex) <div> 태그 안의 초기 값은 "이름"이며 select 에서 '개인'을 선택시 div태그 안의 값이 "이름" 이 된다

- val() 은 입력양식에 대해서만 적용되고, 여기선 div 태그에 대해 값을 설정해야하므로 입력양식이 아닌 div 태그는 text() 로 값을 설정해야한다

- $(this) 는 선택된 <option> 태그를 의미

ex) select 에서 '법인' 을 선택시 $(this)는 아래 태그이다.

- 즉 $(this).val() 은 "회사명" 을 의

- 그 "회사명"을 text() 를 통해 div 의 값으로 설정하는 것이다

 

 

jQuery 예제 31

jQuery form 태그 관련 함수 예제 6

- submit() 이벤트 함수

- submit 이벤트 : 전송기능이 있는 버튼이 클릭되었을때 발생하는 이벤트

- submit 이벤트를 처리할떄는 전송기능이 있는 버튼에 대해서가 아닌 form 태그에 대해 이벤트 처리를 한다

- is() 함수로 라디오버튼/ 체크버튼 유효성 검사

- sample7.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample7</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">

$(document).ready(function(){
//$(function(){

//	$("form").submit(function(){   
	$("#myform").submit(function(){

		if($("#name").val()==""){
			$("#name").css("border","1px solid red");
//			.after("<span>이름을 입력해 주세요</span>");
			alert("이름을 입력 하세요~!!");
			$("span").css("color","red")
			return false;
		} 
	if($("#gender_man").is(":checked")==false &&
	   $("#gender_woman").is(":checked")==false){
			alert("성별을 선택 하세요");
			return false;
		} 
		if($("#age").val() == ""){
			alert("연령대를 선택 하세요");
			return false;
		}

		var cnt=0;
		if($("#xhtml").is(":checked")) cnt++;
		if($("#css").is(":checked")) cnt++;
		if($("#javascript").is(":checked")) cnt++;
		if($("#php").is(":checked")) cnt++;
			
		if(cnt<2){
			alert("2개 이상 선택 하세요");
			return false;
		}

		if($("textarea").val() == ""){
			alert("내용을 입력 하세요");
			return false;
		}

	});

});

		</script>
	</head>
	<body>
	<form id="myform" action="check.jsp" method="post">
		<dl>
		<dt> 이름<em>(필수)</em></dt>
		<dd><input type="text" name="name" id="name" /></dd>

		<dt> 성별</dt>
		<dd>
		<input type="radio" name="gender" value=" 남성" id="gender_man" />
		<label for="gender_man"> 남성</label>
		<input type="radio" name="gender" value=" 여성" id="gender_woman" />
		<label for="gender_woman"> 여성</label>
		</dd>
	
		<dt> 연령</dt>
		<dd>
		<select name="age" id="age">
			<option value=""> 선택해주세요</option>
			<option value="10대">10대</option>
			<option value="20대">20대</option>
			<option value="30대">30대</option>
			<option value="40대이상">40대이상</option>
		</select>
		</dd>

		<dt> 스킬</dt>
		<dd>
		<input type="checkbox" name="xhtml" value="XHTML" id="xhtml" />
		<label for="xhtml">XHTML</label>

		<input type="checkbox" name="css" value="CSS" id="css" />
		<label for="css">CSS</label>

		<input type="checkbox" name="javascript" value="JavaScript"	id="javascript" />
		<label for="javascript">JavaScript</label>

		<input type="checkbox" name="php" value="PHP" id="php" />
		<label for="php">PHP</label>
		</dd>	

		<dt> 코멘트</dt>
		<dd>
		<textarea name="comment"></textarea>
		</dd>
		<input id="sub" type="submit" value=" 전송" />
		</dl>
	</form>

	</body>
</html>

<!--

is() 함수
   is() 함수는 값의 유형을 검사하고 그 결과에 따라 true 또는 false를 반환함
   
   라디오 버튼이나 체크박스가 체크되면 true를 반환하고, 체크되지 않으면 false를 반환함.

-->

-  여러가지 양식과 유효성 검사 관련 내용

- "전송" 버튼은 전송기능이 있는 버튼이므로 클릭시 submit 이벤트가 발생한다

 

- 다만, 기존 이벤트와 달리 이벤트가 발생하는 "전송" 버튼의 input 태그를 구해온 뒤 submit 이벤트 처리를 하면 유효성 검사가 안되고 무조건 넘어간다

$("form").submit(function(){}); // 이러면 안됨

- 전송기능이 있는 버튼일때는 그 버튼에 대해 submit 이벤트처리를 해서는 안됨

- 버튼이 아닌 해당 form 태그를 구해와서 이벤트 처리를 해야함

//	$("form").submit(function(){});
	$("#myform").submit(function(){});	// 이렇게 해야됨

- form 태그 자체 또는 form 태그의 id값으로 form 태그를 구해와도 된다.

- 한개의 페이지에 여러개의 form 태그가 있을때 id로 해당 form 태그 구하기

 

+ jQuery 에서 name 값 없어도 유효성 검사 가능하다, 단 id 값은 존재해야함

 

is() 함수 사용 라디오 버튼 유효성 검사 (sample7.html  부분)

	if($("#gender_man").is(":checked")==false &&
	   $("#gender_woman").is(":checked")==false){
			alert("성별을 선택 하세요");
			return false;
		}

- Javascript 에선 chekced 속성으로 체크 유무를 확인했고, jQuery 에선 체크 유무를 확인해주는 함수 is() 를 사용

- is() 함수 : 값의 유형을 검사하고 그 결과에 따라 true / false 반환

- 라디오버튼이나 체크박스가 체크되면 is() 함수가 true를 반환, 체크되지 않았으면 false를 리턴함

 

필터 선택자 ":chekced"

- :checked 는 필터선택자 이다

- is(:checked) 는 라디오 버튼이 선택되면 true를 리턴하고 선택되지 않으면 false를 리턴

 

select 옵션 유효성 검사 (sample7.html  부분)

		if($("#age").val() == ""){
			alert("연령대를 선택 하세요");
			return false;
		}
		<select name="age" id="age">
			<option value=""> 선택해주세요</option>
			<option value="10대">10대</option>
			<option value="20대">20대</option>
			<option value="30대">30대</option>
			<option value="40대이상">40대이상</option>
		</select>

- 아무것도 선택하지 않았을때, value 는 "" 이므로 유효성검사에서 val()=""일떄 경고창을 띄우게 해서 유효성 검사를 한다

 

checkbox 유효성 검사 (sample7.html  부분)

		var cnt=0;
		if($("#xhtml").is(":checked")) cnt++;
		if($("#css").is(":checked")) cnt++;
		if($("#javascript").is(":checked")) cnt++;
		if($("#php").is(":checked")) cnt++;
			
		if(cnt<2){
			alert("2개 이상 선택 하세요");
			return false;
		}
		<dt> 스킬</dt>
		<dd>
		<input type="checkbox" name="xhtml" value="XHTML" id="xhtml" />
		<label for="xhtml">XHTML</label>

		<input type="checkbox" name="css" value="CSS" id="css" />
		<label for="css">CSS</label>

		<input type="checkbox" name="javascript" value="JavaScript"	id="javascript" />
		<label for="javascript">JavaScript</label>

		<input type="checkbox" name="php" value="PHP" id="php" />
		<label for="php">PHP</label>
		</dd>

- 선택이 될때마다 cnt 변수값을 1 증가시켜서 유효성 검사를 한다

- 라디오버튼과 마찬가지로 is(:chekced) 로 is() 함수와 :checked 필터선택자로 체크 유무를 확인한다

 

 

+ val() 은 입력양식에 입력된 값을 구해오거나 입력양식에 값을 설정함

 

jQuery 예제 32

jQuery form 태그 관련 함수 예제 7

- :input 필터선택자

- sample9.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample9</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// :input은 입력 폼 태그 전부(input, textarea,select, button)를 
// 한번에 선택 할 수 있는 필터


$(function(){

	$(":input").focus(function(){
		$(this).css("background","#DFEEFF");
	}).blur(function(){
		$(this).css("background","yellow");
	});

});

		</script>
	</head>
	<body>
		<dl>
			<dt> 이름<em>(필수)</em></dt>
			<dd><input type="text" name="name" /></dd>
			<dt> 연령</dt>
			<dd>
				<select name="age">
					<option> 선택해주세요</option>
					<option value="10대">10대</option>
					<option value="20대">20대</option>
					<option value="30대">30대</option>
					<option value="40대이상">40대이상</option>
				</select>
			</dd>
			<dt> 코멘트</dt>
			<dd>
				<textarea name="comment"></textarea>
			</dd>
		</dl>
		<input type="reset" value="리셋" />
		<input type="submit" value="전송" />
		<button>확인</button>
	</body>
</html>

- 입력양식을 선택할때마다 색이 바뀜

 

:input 필터선택자 (sample7.html 부분)

	$(":input").focus(function(){});

- 입력양식과 관련된 태그들을 모두 구해온다

- input 태그, textarea 태그, select 태그, button 태그 모두 구해온다

- 이 태그들에 대해 한꺼번에 어떤 기능 적용가능함

	$(":input").focus(function(){
		$(this).css("background","#DFEEFF");
	}).blur(function(){
		$(this).css("background","yellow");
	});

- this 는사용자가 focus 를 준 태그, 즉 이벤트가 발생한 태그를 의미함

- 코멘트 textarea 부분을 클릭시 this 는 textarea 태그가 된다

- 그 태그에 대해 배경색을 노랑색으로 적용하고 있음

 

 

jQuery 예제 33

jQuery form 태그 관련 함수 예제 8

- :text 필터선택자

- sample10.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample10</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">
// :text는 type 속성값에 "text"가 설정되어 있는 input태그만을 
//  선택하는 필터

// 한줄 입력 폼이 포커스 되면 strong태그 안에 있는 내용을 HTML을 
// 추가하고, 포커스가 사라지면 추가했던 strong태그를 제거 합니다.


$(function(){

	$(":text").focus(function(){
		$(this).after("<strong>필수 항목 입니다</strong>");
	}).blur(function(){
		$("strong").remove();
	});

});

		</script>
	</head>
	<body>
		이름:<input type="text" name="name" />
	</body>
</html>

- 필터선택자 :text 는 input type 값이 text인 태그를 모두 구해온다

- after() : 특정 태그에 요소 추가, 형제 요소로 추가

- 포커스가 들어갈때

- 포커스 아웃일때

 

after() vs append()

- after() : 특정 태그에 요소 추가, 형제 요소로 추가

- append() : 특정 태그에 요소 추가, 자식 요소로 추가

 

remove() 함수

- 선택한 요소(태그)를 HTML 에서 제거

ex)

$( "p" ).remove();

- 선택된 태그인 p 태그가 삭제됨

 

jQuery 예제 34

jQuery form 태그 관련 함수 예제 9

- :password 필터선택자

- sample11.html

<!DOCTYPE html>
<html>
	<head>
	    <meta charset="UTF-8">
		<title>sample11</title>
		<script src="jquery-1.6.4.min.js"></script>

		<script type="text/javascript">

$(function(){

	$(":password").focus(function(){
		$(this).after("<p> 패스워드는 여섯 자 이상이어야 합니다</p>");
	}).blur(function(){
		$("p").remove();
	});

});
		</script>
	</head>
	<body>
		패스워드:<input type="password" name="pass" />
	</body>
</html>

- 필터선택자 :password 는 input type 값이 password인 태그를 모두 구해온다

 

그 외 필터 선택자

:checkbox 필터선택자

- input type 이 checkbox인 태그를 모두 구해온다

- 이걸 활용해서 모두 동의하기 버튼을 누르면 모든 체크박스에 체크를 하거나, 모두 체크를 해야 다음 페이지로 넘어갈 수 있도록 하게끔 할 수 있다.

 

과제 풀이

https://laker99.tistory.com/95?category=1065834 

- tr 태그를 <script> 바깥쪽에 써도 된다, <script> 바깥에 써서 연결시키고있다.


사용자 정의 함수

- 사용자가 필요에 따라 만들고 호출하여 사용하는 함수

 

사용자 정의 함수 생성

function 함수이름 (매개변수 1, 매개변수 2, ...) {
                       수행할 문장들...
}

- function 키워드를 사용한다.

- 매개변수가 필요한 경우에만 매개변수를 쓴다.

- 매개변수에 자료형을 쓸 필요없이 필요한 개수만큼 변수명만 , 로 이어주면 된다. ex) (a,b,c)

- 돌려줄 값이 있을때만 return 구문으로 값을 돌려주면 된다.

- 자바스크립트는 인터프리터 방식이므로 함수 정의시에는 가능한 한 헤드 태그에 정의하고, 바디 태그에서 호출한다.

 

함수 호출 방법 2가지

1. 함수 이름을 통한 호출

2. 이벤트를 통한 호출

 

사용자 정의 함수 예제1

- 매개변수가 없는 함수

- 사용자 정의 함수 생성과 호출

- 함수 이름을 통한 호출과 이벤트를 통한 호출

- function01.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사용자 정의 함수</title>
<script>
	// 사용자 정의 함수
	function check() {
		alert("함수 호출 성공");
	}
</script>
</head>
<body>

<!-- 방법1. 함수호출 -->
<script>
	check();		// 함수 호출
//	CHECK();		//함수명은 대,소문자를 구분한다.
</script>

<!-- 방법2. 이벤트를 이용해서 함수 호출 -->
<input type="button" value="함수호출" onClick="check()">

</body>
</html>

- 방법1에서 check() 함수는 매개변수가 없으므로 이름만으로 호출한다

- 방법2에서 onClick 이벤트 핸들러를 통해 함수를 호출한다.

- 클릭이벤트 발생시키기 위해 onClick="호출할 함수명" 을 적는다.

+ 변수명/함수명 대소문자를 구분한다.

+ 이벤트 핸들러 등록하는방법 중 태그에 속성으로 적는 방법이다.

+ onClick 은 이벤트 핸들러이다, 이벤트 핸들러는 대소문자를 구분하지 않는다.

방법1
방법2

 

+ 만약 함수 선언, 정의가 호출보다 아래쪽에 있다면?

- 오류 발생, 자바스크립트는 인터프리트 언어이므로 함수 선언,정의가 호출보다 위에있어야한다.

 

이벤트

- 그래픽 프로그램 만들때 이벤트를 주로 사용한다.

- 언어마다 같은 행위여도 이벤트 이름이 다르다.

ex) 자바에선 버튼 클릭시 action 이벤트, 자바스크립트는 click 이벤트가 발생한다.

 

자바스크립트 이벤트 종류

- Click 이벤트 : 버튼을 클릭, 전송기능이 없는 버튼을 클릭하면 click 이벤트가 발생한다.
- Submit 이벤트 : submit버튼을 클릭할때, 즉 전송기능이 있는 버튼을 클릭하면 submit 이벤트가 발생한다.
- MouseOver 이벤트 : 컴포넌트(그림)위에 마우스 포인터를 올렸을때
- MouseOut 이벤트 : 컴포넌트(그림)위에서 마우스 포인터가  벗어났을때
- Load 이벤트 :  현재 문서가 웹브라우저에 불려질때 
- Unload 이벤트 : 웹브라우저가 해당 문서를 벗어났을때
- Focus 이벤트 : 입력양식 필드로 포커스가 들어왔을 때, 즉 깜빡거릴때

- Blur 이벤트 : 입력양식에서 포커스가 벗어났을때, Focus 이벤트와 반대

- Keydown 이벤트 : 키를 누르고 있을때, 눌렀을때
- Keyup 이벤트 : 키를 눌렀다가 놓았을때, Keydown 이벤트와 반대
- Change 이벤트 : 값의 변화가 발생할때, 주로 select 옵션 메뉴중 선택을 하면 값이 변화함

 

이벤트 처리순서
1. 각 컴퍼넌트에 발생한 이벤트 종류를 파악

ex) Click, Focus, Blur, Load, MouseOver, MouseOut
* 컴퍼넌트 : select 박스 또는 input=text 입력양식 같은 것들


2. 각 이벤트명에다 on을 붙여서 이벤트 핸들러를 생성
ex) onClick,  onFocus, onBlur, onLoad... 는 이벤트 핸들러

- 대소문자를 구분하지 않지만 카멜 표기법처럼 on은 소문자, 이벤트명 첫글자는 대문자로 주로 작성

 

3. 이벤트 핸들러를 이용해서 함수를 호출한다.
ex)

<input type=button value="회원가입" onClick="check()">

- 이벤트 핸들러 = "호출할 함수" 형식

 

사용자 정의 함수 예제2

- 매개변수를 가진 함수

- function02.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사용자 정의 함수</title>
<script>
	// 매개변수가 있는 함수 정의
	function ask(question) {
		var result = confirm(question);
		if(result) {	// '확인' 버튼 클릭시
			return "찬성";
		} else{			// '취소' 버튼 클릭시
			return "반대";
		}
	}
</script>
</head>
<body>
<script>
	var result = ask("찬성하면 확인버튼, 반대하면 취소버튼을 클릭");	// 함수 호출
	alert(result);
</script>
</body>
</html>

- 함수 정의는 주로 <head> 태그 내에 하고, 함수 호출은 주로 <body> 태그 내에서 한다.

<head> 안

- 자바스크립트에서는 매개변수를 만들때도 자료형을 쓰지 않고 이름만 써도 된다.

- question 매개변수로 넘겨진 값이 confirm 창에 뜬다. (ex) "정말 삭제하시겠습니까?")

- confirm 창에서 확인을 누르면 true가, 취소를 누르면 false 가 result에 저장된다.

- true인경우 return 구문을 통해 "찬성" 이라는 문자데이터를 돌려주고있다.

<body> 안

- ask() 함수는 매개변수가 있으므로 값을 전달하면서 호출하고 있다.

- result 변수에 ask() 가 돌려준 값 ("찬성" or "반대") 가 저장된다.

- confirm 창이 뜨면서, 함수호출시 매개변수로 넘겨줬던 값이 출력되고 있다.

확인 버튼 누른경우
취소 버튼 누른경우

- 함수호출 후 돌려받은 값을 <body> 안에서 alert()로 출력하고 있다.

 

사용자 정의 함수 예제3

- 매개변수가 2개 이상인 함수

- function03.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사용자 정의 함수</title>
<script>
	// 최대값과 최소값을 구하는 함수
	function max(a,b) {		// 최대값 구해주는 함수
		if(a > b)
			return a;
		else
			return b;
	}
	
	function min(a,b) {		// 최소값 구해주는 함수
		if(a < b)
			return a;
		else
			return b;
	}
</script>
</head>
<body>
<script>
	a = prompt("정수1 을 입력하세요","");
	b = prompt("정수2 를 입력하세요","");
	
	var max = max(a, b);	// max() 함수 호출
	var min = min(a, b);	// min() 함수 호출
	document.write("max = " + max + "<br>");
	document.write("min = " + min + "<br>");
</script>
</body>
</html>

- 키보드로 입력한 2개의 값을 함수의 매개변수로 전달하여 return 을 통해 최대값과 최소값을 돌려받는다.

+ if문이나 for문에 들어갈 코드가 1줄이면 괄호 {} 를 하지 않아도 된다.

 

사용자 정의 함수 예제4

- 버튼 4개를 만들어서 사용자가 키보드로 입력한 정수값 2개의 +, - , * ,/ 를 구하기

- onClick 이벤트 핸들러를 이용하여 함수 호출

- function04.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사용자 정의 함수</title>
<script>
	// Number("50") --> 50
	var n1 = Number(prompt("정수1 을 입력하세요",""));
	var n2 = Number(prompt("정수2 를 입력하세요",""));
	
	function plus() {
		alert(n1 + n2);
	}
	function minus() {
		alert(n1 - n2);
	}
	function mul() {
		alert(n1 * n2);
	}
	function div() {
		alert(n1 / n2);
	}
</script>
</head>
<body>
<form>
	<input type="button" value="더하기" onClick="plus()">
	<input type="button" value="빼기" onClick="minus()">
	<input type="button" value="곱하기" onClick="mul()">
	<input type="button" value="나누기" onClick="div()">
</form>
</body>
</html>

- <body> 태그 안에 입력양식을 만든다

- 전송기능이 없는 버튼이므로 클릭시 Click 이벤트 발생한다.

- onClick 이벤트 핸들러를 통해 함수를 호출한다.

- Number() 가 없다면 산술연산 중 + 기능은 연산이 되지 않고 1020으로 문자연결되어 나온다, 형변환이 필요하다.

Number() 를 쓰지 않았을때

- 입력한 값들이 모두 문자로 처리되어 n1 + n2 일때 연산이 되지 않고 연결이 되는것이다.

- Number() 함수로 prompt() 전체를 감싸주면 숫자로 형변환된다.

- 각 버튼 클릭시 두 정수값을 더하기, 빼기, 곱하기, 나누기 한 값이 alert 메세지 박스에 출력된다.

 

사용자 정의 함수 예제5

- 재귀함수 : 함수 안에서 자기 자신을 호출하는 함수

- 재귀함수는 Factorial 을 구할때 많이 쓴다, 메모리를 많이 사용한다.

- function05.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사용자 정의 함수</title>
<script>
	// 재귀함수 : 함수안에서 자기 자신의 함수를 호출하는 함수
	function factorial (n) {
		if(n > 1) {
			var result = n * factorial(n-1); // n1 = n * f(n-1) * f(n-2)...1
									 		 // 3! = 3 * (3-1) * (3-2) ...1
			return result;
		} else { // n=1, 즉 f(1) 일때
			return n;
		}
	}
</script>
</head>
<body>
<script>
	var n = prompt("팩토리얼을 구할 정수를 입력하세요");
	document.write(n + "! = " + factorial(n));
</script>
</body>
</html>

- 자바스크립트는 자바와 달리 자료형을 쓰지 않기떄문에 숫자 범위가 한정되어있지 않아, 큰 팩토리얼도 구할 수 있다

 

 

한계

- 자바와 달리 자료형을 쓰지 않기 때문에 자료형의 값의 범위에 구애받지 않아 큰 수의 팩토리얼도 구할 수 있지만 어느 순간을 넘어가면 Infinity, 구해주지 않는다.

 

+ 나중에 자바스크립트 계산기 프로그램 만들 것


Date 객체

- 날짜 정보 처리

- 현재 년,월,일,시,분,초,요일 등을 구할 수 있다.

- 자바의 Date 클래스 객체 같은 역할

- new 연산자로 Date 객체를 생성해야한다.

today = new Date();

- 연도를 구할때는 메소드를 사용해야한다.

today.getFullYear();

 

Date 객체 예제1

- 현재 년,월,일,시,분,초,요일 구하기

- date01.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Date 객체</title>
</head>
<body>
<script>
	// 현재 년,월,일,시,분,초 요일
	var t = new Date();
	
	var y = t.getFullYear();	// 년
	var m = t.getMonth() + 1;	// 월 (0~11)
	var d = t.getDate();		// 일
	
	var h = t.getHours();		// 시간
	var mm = t.getMinutes();	// 분
	var s = t.getSeconds();		// 시
	var w = t.getDay();			// 요일(0~6)
	
	var week = ['일','월','화','수','목','금','토'];
	
	document.write(y + "-" + m + "-" + d + " " + h + ":" + mm + ":" + s + " ");
//	document.write(w);	// w=5 : 금
	document.write(week[w] + "요일");
</script>
</body>
</html>

- Date 객체는 내장 객체 형태로 제공되지 않기떄문에 직접 객체를 만들어서 사용해야한다. (date01.html 부분)

var t = new Date();

- getYear() 이 아닌 getFullYear() 임을 주의

- getMonth() 로 월을 구할때는 월을 0 ~ 11 까지 구해주기때문에 + 1을 해서 조정해야한다.

- getDay() 로 요일을 구하는데, 요일을 0~6까지 구해준다, 문자형태로 변환시켜야함 (date01.html 부분)

	document.write(w);	// w=5 : 금

- 오늘 기준 금요일 5로 나온다

- 문자형태로 변환하기 위해 배열을 만들기 (date01.html 부분)

- 0 부터 시작이므로 -1 을 하지 않아도 된다.

+ 자바는 요일을 1~7까지 구해준다

+ Date, getFullYear() 대소문자를 구분 

date01.html 출력

- 호출되었던 시점의 시간 1개를 출력하고 있다

 

Date 객체 예제2

- 1초에 한번씩 계속해서 현재 년,월,일,시,분,초를 호출하기

- 함수를 1초에 한번씩 호출하면 경과된 초를 계속해서 출력 가능

- 함수안에서 자신을 호출하는 함수 사용

- 돌아가는 함수를 멈추게 하기 위한 함수도 필요

- date02.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Date 객체</title>
<script>
	function show() {
		var t = new Date();
		
		var y = t.getFullYear();
		var m = t.getMonth() + 1;
		var d = t.getDate();
		var h = t.getHours();
		var mm = t.getMinutes();
		var s = t.getSeconds();
		
		document.write(y + "-" + m + "-" + d + " " + h + ":" + mm + ":" + s + "<br>");
		
		// 브라우저 상태 표시줄에 출력
		window.status = y + "-" + m + "-" + d + " " + h + ":" + mm + ":" + s;
		
		// setTimeout(명령, 시간(1/1000)); 지정된 시간이 경과된 다음에 명령을 실행
		w = setTimeout("show()", 1000);	// 1초에 한번씩 show() 함수 호출
	}
	function stop() {
		// setTimeout()으로 실행된 명령을 해제
		ClearTimeout(w);
	}
</script>
</head>
<!-- <body onLoad="show()"> -->
<body>
	<input type="button" value="start" onClick="show()">
	<input type="button" value="stop" onClick="stop()">
	<br><br>
	
	<img src="img/clock.jpg" onMouseOver="show()" onMouseOut="stop()">
</body>
</html>

<head>

- show() 함수안에서 자기 자신인 show() 함수를 재귀함수 형태로 1초에 한번씩 호출하고 있다.

- 최초로 show()를 한번 호출시 재귀함수를 통해 계속 1초에 1번씩 자신을 호출하게 됨.

- 위의 코드가 잘 실행되지 않기떄문에 브라우저 상태 표시줄에 출력하기위해 window.status 사용

- stop() 함수에서 시간을 멈추기 위해, setTimeout 으로 계속 실행되는 함수를 멈춰주기 위해 ClearTimeout() 사용

 

<body>

- input 태그로 start 와 stop 버튼을 만들어 onClick 이벤트 핸들러 사용

- 이미지를 불러와서 MouseOver, MouseOut 이벤트를 이용하고 있다.

- 마우스 포인터를 올리면 MouseOver이벤트, 벗어나면 MouseOut 이벤트 발생

- start 버튼을 클릭하거나, 이미지 위에 마우스 포인터를 올리면 실행된다

- 1초에 한번씩 출력하고 있다.

 

지정된 시간 뒤에 명령 수행하는 방법

		// setTimeout(명령, 시간(1/1000)); 지정된 시간이 경과된 다음에 명령을 실행
		w = setTimeout("show()", 1000);	// 1초에 한번씩 show() 함수 호출

- setTimeout() 함수 : 정해진 일정시간 뒤에 어떤 명령(코드) 를 실행

- window 객체에서 지원되는 함수 중 하나이다.

 

setTimeout() 으로 실행된 명령 해제하는 방법

 

		// setTimeout()으로 실행된 명령을 해제
		ClearTimeout(w);

- ClearTimeout() 함수 : setTimeout() 으로 실행된 명령을 해제

- 매개변수에는 setTimeout 의 리턴을 받은 w를 넣는다.

- 한번의 setTimeout()을 해제하면 더이상 show()를 호출하는 것을 막게됨

- window 객체에서 지원되는 함수 중 하나이다.

 

브라우저 상태 표시줄에 출력

- status() 함수 : 브라우저 상태 표시줄에 출력

- window 객체에서 지원되는 함수 중 하나이다.

- 브라우저 맨 하단의 영역이 브라우저 상태 표시줄이다.

- 대부분 브라우저는 감춰져 있어 보이지 않는다.

- I.E 에서 확인 가능

- start 를 누르면 아래 부분 상태표시줄에 뜨고, stop 을 누르면 멈춘다.

 

Load 이벤트

- 현재 문서가 웹 브라우저에 불려질때 발생함

- <body> 태그 안에 써야한다.

<body onLoad="show()"></body>

+ body 태그 안에 onLoad="show()" 를 하면 실행 하자마자, 즉 현재 문서가 브라우저에 로딩되자마자 실행된다.


배열

자바스크립트 배열 정의/생성 방법 3가지

1.

   str=new Array();
   str[0]=80;
   str[1]=90;
   str[2]=70;

 

- 값이 정해지지 않았을때 사용함

- 자바와 달리 배열 공간 개수를 지정하지 않는다.


2.

  str=new Array(80,90,70);

-  Array 객체를 이용하여 배열 생성
3.

  str=[80,90,70];

- 가장 간단하며 가장 많이 사용된다.

 

배열 속성, 메소드

- 배열에서 지원되는 여러 속성들이 있다.

ex) length 속성으로 배열 크기 구함

- 배열에서 지원되는 여러 메소드들이 있다.

ex) pop(), sort(), slice() 등

 

배열 예제1

- 3가지 형식으로 배열 정의

- array01.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>배열</title>
</head>
<body>
<script>
	// 배열
	
	// 방법1.
	var a1 = new Array();
	a1[0] = 80;
	a1[1] = 90;
	a1[2] = 70;
	
	// length : 배열의 크기를 구해주는 속성
	for(var i = 0; i < a1.length; i++) {
		document.write(a1[i] + "\t");
	}
	document.write("<br>");
	
	// 방법2.
	var a2 = new Array(80, 90, 70);
	
	for(var i = 0; i < a2.length; i++){
		document.write(a2[i] + "\t");
	}
	document.write("<br>");
	
	// 방법3.
	var a3 = [80, 90, 70];

	for(var i = 0; i < a3.length; i++){
		document.write(a3[i] + "\t");
	}
	
</script>
</body>
</html>

<방법1>

- Array 객체를 통해 배열을 생성하고 있다.

- Array 객체는 new를 이용하여 직접 만들어야한다.

- 0번, 1번, 2번 원소를 반복문을 통해 출력해주고 있다.

- length 속성으로 배열의 크기를 구한다. ex) a1.length 는 3

+ 속성은 괄호가 없다

<방법2>

- Array 객체를 통한 배열 선언과 동시에 값을 할당했다.

- 0번방에 80, 1번방에 90, 2번방에 70이 들어갔다.

<방법3>

- 대괄호 [ ] 안에 원소값을 넣어주면 된다.

 

+ 배열은 동일한 자료형의 데이터만 저장되는데 동일하지 않은 데이터를 넣으면?

	var a3 = [80, 90, 70, 3.14];

	for(var i = 0; i < a3.length; i++){
		document.write(a3[i] + "\t");
	}

- 자바스크립트에서는 배열에 서로 다른 자료형의 자료형도 저장되고 있다!

 

배열의 메소드

- 배열에서 지원되는 여러 메소드들이 있다.

ex) pop(), sort(), slice() 등

 

배열 예제2

배열의 메소드 예제 1

- array02.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>배열</title>
</head>
<body>
<script>
	var num = ['사당','교대','방배','강남'];
	document.write(num + "<br>");			//사당,교대,방배,강남
	document.write(typeof(num) + "<br>");
	
	// join() : 문자('-')를 기준으로 배열 값들을 하나의 문자 데이터로 결합
	document.write(num.join('-') + "<br>");	//사당-교대-방배-강남
	document.write(typeof(num.join('-')) + "<br>");
	
	// reverse() : 배열 원소값들의 순서를 반대로 바꾸어 주는 역할.
	document.write(num.reverse() + "<br>");	//강남,방배,교대,사당
	document.write(typeof(num.reverse()) + "<br>");
	document.write(num + "<br>")			//사당,교대,방배,강남
	
	// sort() : 배열 원소 값들을 오름차순으로 정렬 (문자 : 사전순 정렬)
	//			sort() 함수로 오름차순으로 정렬이 되면 원본 배열이 바뀌게 된다.
	document.write(num.sort() + "<br>");	//강남,교대,방배,사당
	document.write(num + "<br>");			//강남,교대,방배,사당
	
	// 배열 원소 값들을 내림차순 정렬시켜보자 (문자 : 사전역순 정렬)
	document.write(num.sort().reverse() + "<br>");	//사당,방배,교대,강남
	document.write(num.sort().reverse() + "<br>");	//사당,방배,교대,강남
	
</script>
</body>
</html>

배열 출력 (array02.html 부분)

	var num = ['사당','교대','방배','강남'];
	document.write(num + "<br>");			//사당,교대,방배,강남
	document.write(typeof(num) + "<br>");

- 배열 이름을 출력시 배열 원소가 전부 출력된다.

- 출력시엔 문자처럼 결합이 되어서 출력된다.

- 배열자체를 typeof() 로 출력하면 배열 객체이므로 object 형이다.

배열 원소들을 문자데이터로 결합 (array02.html 부분)

	// join() : 문자('-')를 기준으로 배열 값들을 하나의 문자 데이터로 결합
	document.write(num.join('-') + "<br>");	//사당-교대-방배-강남
	document.write(typeof(num.join('-')) + "<br>");

- 배열의 join() 함수를 사용해서 특정 문자를 기준으로 배열값들을 하나의 문자 데이터로 결합

- 또한 num.join('-') 의 자료형은 string 이다, 즉 join() 을 쓰면 문자데이터가 된다.

- 원본 배열에 영향을 주지 않는다.

배열 원소값 순서 바꾸기 (array02.html 부분)

	// reverse() : 배열 원소값들의 순서를 반대로 바꾸어 주는 역할.
	document.write(num.reverse() + "<br>");	//강남,방배,교대,사당
	document.write(typeof(num.reverse()) + "<br>");
	document.write(num + "<br>")			//사당,교대,방배,강남

- reverse() 함수를 사용하여 배열 원소갑슫ㄹ의 순서를 거꾸로 바꾼다.

- 배열 객체라는 의미로 object 가 출력됨

- 원본 배열에 영향을 주지 않는다.

 

배열 정렬 (오름차순) (array02.html 부분)

	// sort() : 배열 원소 값들을 오름차순으로 정렬 (문자 : 사전순 정렬)
	//			sort() 함수로 오름차순으로 정렬이 되면 원본 배열이 바뀌게 된다.
	document.write(num.sort() + "<br>");	//강남,교대,방배,사당
	document.write(num + "<br>");			//강남,교대,방배,사당

- sort() : 배열 원소 값들을 오름차순으로 정렬 (사전순)

- reverse() 와 달리 sort() 함수는 원본 자체가 바뀐다!

- 즉 원본 num 배열이 바뀌었으므로(정렬되었으므로) num.reverse() 아니라 그냥 num() 으로 출력해도 같다.

- 오름차순 정렬되어 강남 부터 나온다.

+ 내림차순 함수는 없다, 내림차순을 하고싶으면 sort()로 오름차순 정렬 후, reverse() 로 순서 바꿔주기

배열 정렬 (내림차순) (array02.html 부분)

	// 배열 원소 값들을 내림차순 정렬시켜보자 (문자 : 사전역순 정렬)
	document.write(num.sort().reverse() + "<br>");
	document.write(num.sort().reverse() + "<br>");

배열 예제3

배열의 메소드 예제 2

- 또다른 배열의 함수들

- 배열을 조작할때 사용하는 함수들

- array03.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>배열</title>
</head>
<body>
<script>
	var greenLine = ['사당','교대','방배','강남'];
	var yellowLine = ['미금','정자','모란','수서'];
	
	// slice(start index, end index) : start ~ end-1 번 원소를 추출
	document.write(greenLine.slice(1, 3) + "<br>");	//교대,방배
	
	// concat() : 2개의 배열 객체를 하나로 결합
	//사당,교대,방배,강남,미금,정자,모란,수서
	document.write(greenLine.concat(yellowLine) + "<br>");
	
	// pop() : 배열 데이터 중에서 마지막 인덱스에 저장된 데이터를 삭제
	greenLine.pop();	//'강남' 삭제
	document.write(greenLine + "<br>");	// 사당,교대,방배
	
	// push() : 배열 객체에 마지막 인덱스에 새로운 데이터를 삽입
	greenLine.push('삼성');	//'삼성' 삽입
	document.write(greenLine + "<br>");	// 사당,교대,방배,삼성
	
	// shift() : 배열 데이터 중에서 첫번째 데이터를 삭제
	greenLine.shift();		//'사당' 삭제
	document.write(greenLine + "<br>");	// 교대,방배,삼성
	
	// unsift() : 배열 첫번째 인덱스에 새로운 데이터를 삽입
	greenLine.unshift('신도림');	//'신도림' 삽입
	document.write(greenLine + "<br>");	// 신도림,교대,방배,삼성
	
	
</script>
</body>
</html>

배열 자르기(추출) (array03.html 부분)

	// slice(start index, end index) : start ~ end-1 번 원소를 추출
	document.write(greenLine.slice(1, 3) + "<br>");	//교대,방배

- slice(start index, end index) : start ~ end-1 번 원소를 추출

- 범위를 지정해서 배열을 자른다.

배열 결합 (array03.html 부분)

	// concat() : 2개의 배열 객체를 하나로 결합
	//사당,교대,방배,강남,미금,정자,모란,수서
	document.write(greenLine.concat(yellowLine) + "<br>");

- concat() : 2개의 배열을 하나의 배열로 결합시켜줌

- greenLine 이 먼저왔기떄문에 greeLine의 원소들이 먼저 출력되고 이어서 yellowLine 의 원소들이 온다.

배열 마지막 인덱스 데이터 삭제 (array03.html 부분)

	// pop() : 배열 데이터 중에서 마지막 인덱스에 저장된 데이터를 삭제
	greenLine.pop();	//'강남' 삭제
	document.write(greenLine + "<br>");	// 사당,교대,방배

- pop() : 배열 데이터 중에서 마지막 인덱스에 저장된 데이터를 삭제

- greenLine 에서 가장 마지막 인덱스의 원소인 '강남' 이 삭제됨

- 원본 배열에 영향

배열 마지막 인덱스에 데이터 삽입 (array03.html 부분)

	// push() : 배열 객체에 마지막 인덱스에 새로운 데이터를 삽입
	greenLine.push('삼성');	//'삼성' 삽입
	document.write(greenLine + "<br>");	// 사당,교대,방배,삼성

- push() : 배열 객체의 마지막 인덱스에 새로운 데이터 삽입

- greenLine 의 가장 마지막 인덱스에 새로운 원소인 '삼성'이 삽입됨

- 원본 배열에 영향

배열 첫번째 인덱스 데이터 삭제  (array03.html 부분)

	// shift() : 배열 데이터 중에서 첫번째 데이터를 삭제
	greenLine.shift();		//'사당' 삭제
	document.write(greenLine + "<br>");	// 교대,방배,삼성

- shift() 로 배열의 첫번째 데이터를 삭제한다.

- pop() 과 반대

- 원본 배열에 영향

배열 첫번째 인덱스에 데이터 삽입 (array03.html 부분)

	// unsift() : 배열 첫번째 인덱스에 새로운 데이터를 삽입
	greenLine.unshift('신도림');	//'신도림' 삽입
	document.write(greenLine + "<br>");	// 신도림,교대,방배,삼성

- unshift() 로 배열 첫번째 인덱스에 데이터를 삽입

- push() 와 반대

- 원본 배열에 영향


String 객체

 

String 객체 생성 방법

1. new로 할당

2. 문자열을 바로 넣어서 생성

 

String 객체 속성

- length : 문자열의 길이를 구해줌

+ 자바에선 length() 메소드를 사용했었음, 자바스크립트에서는 length 속성이다.

 

String 객체 함수

- substring(), substr(), slice(), concat() 등

 

String 객체 예제 1

String 객체 생성, 출력, length 속성

- string01.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>String 객체</title>
</head>
<body>
<script>
	var str1 = '자바스크립트';
	var str2 = "자바스크립트";
	var str3 = new String('javascript');
	var str4 = new String("javascript");
	
	document.write("str1 = " + str1 + "<br>");
	document.write("str2 = " + str2 + "<br>");
	document.write("str3 = " + str3 + "<br>");
	document.write("str4 = " + str4 + "<br>");
	
	// length 속성 : 문자열의 길이를 구해주는 속성
	document.write("문자열의 길이 : " + str1.length + "<br>");	//6
	document.write("문자열의 길이 : " + str2.length + "<br>");	//6
	document.write("문자열의 길이 : " + str3.length + "<br>");	//10
	document.write("문자열의 길이 : " + str4.length + "<br>");	//10
	
</script>
</body>
</html>

 

String 객체 생성 (string01.html 부분)

	var str1 = '자바스크립트';
	var str2 = "자바스크립트";
	var str3 = new String('javascript');
	var str4 = new String("javascript");

- 크게 2가지 방법으로 String 객체를 생성할 수 있다.

 

String 객체 출력 (string01.html 부분)

	document.write("str1 = " + str1 + "<br>");
	document.write("str2 = " + str2 + "<br>");
	document.write("str3 = " + str3 + "<br>");
	document.write("str4 = " + str4 + "<br>");

 

문자열 길이 구하기 (string01.html 부분)

	// length 속성 : 문자열의 길이를 구해주는 속성
	document.write("문자열의 길이 : " + str1.length + "<br>");	//6
	document.write("문자열의 길이 : " + str2.length + "<br>");	//6
	document.write("문자열의 길이 : " + str3.length + "<br>");	//10
	document.write("문자열의 길이 : " + str4.length + "<br>");	//10

- String 객체의 length "속성"으로 문자열의 길이를 구함

- 한글, 영문 상관없이 글자수를 구함

+ 자바에서는 문자열의 길이를 length() "메소드"로 구한다.

 

String 객체 예제 2

String 문자열 관련 함수

- 문자열 추출 관련 함수가 substring() 외에 substr() 과 slice() 메소드 등 많은 함수가 있다

- 자바의 String 클래스의 메소드들과 유사

+ 자바는 substring() 만 지원

- string02.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>String 객체</title>
</head>
<body>
<script>
	var t = "Hello Thank you good luck to you";
	
	// charAt(16) : 인덱스 16번 문자를 추출
	document.write(t.charAt(16) + "<br>");	//g

	
	// indexOf('you') : 가장 먼저 나오는 'you'의 인덱스 번호를 구해준다.
	document.write(t.indexOf('you') + '<br>');	//12
	
	// indexOf('you', 16)
	// : 인덱스 16번 이후에 가장 먼저 나오는 'you'의 인덱스 번호를 구해준다.
	document.write(t.indexOf('you', 16) + '<br>');	//29
	
	// lastIndexOf('you')
	// : 끝에서 가장 먼저 나오는 'you'의 인덱스 번호를 구해준다.
	document.write(t.lastIndexOf('you') + "<br>");	//29
	
	// match('luck') : 가장 먼저 나오는 'luck'과 일치가 되는 문자를 반환
	document.write(t.match('luck') + "<br>");	//luck
	
	// toUpperCase() : 대문자로 변환
	// HELLO THANK YOU GOOD LUCK TO YOU
	document.write(t.toUpperCase() + "<br>");
	
	// toLowerCase() : 대문자로 변환
	// hello thank you good luck to you
	document.write(t.toLowerCase() + "<br>");
	
	// substring(start index, end index)
	// : start 인덱스부터 end-1 번 인덱스 번호의 문자를 추출
	// substring(6, 12) : 인덱스 6번부터 11번 까지의 문자를 추출
	document.write(t.substring(6, 12) + "<br>");	//Thank
	
	// substr(start index, 추출할 문자열 갯수)
	// substr(21, 4) : 인덱스 21번부터 4개의 문자를 추출
	document.write(t.substr(21, 4) + "<br>");	//luck
	
	// split("구분기호")
	// : 구분기호를 이용해서 문자를 분리해서 배열로 리턴해주는 함수
	// split(" ") : 공백문자를 기준으로 문자를 분리해서 배열로 리턴해준다.
	var s = t.split(" ");
	document.write(s[0] + "<br>");
	document.write(s[1] + "<br>");
	document.write(s[2] + "<br>");
	document.write(s[3] + "<br>");
	document.write(s[4] + "<br>");
	document.write(s[5] + "<br>");
	document.write(s[6] + "<br>");
	
	for(var i = 0; i < s.length; i++) {
		document.write(s[i] + "\t");
	}
	
</script>
</body>
</html>

 

 

특정 인덱스의 문자 추출 (string02.html 부분)

	// charAt(16) : 인덱스 16번 문자를 추출
	document.write(t.charAt(16));	//g

- charAt() 함수로 특정 인덱스의 문자를 추출

- 문자열 인덱스는 0 번부터 시작

특정 문자, 문자열의 인덱스 구하기 (string02.html 부분)

	// indexOf('you') : 가장 먼저 나오는 'you'의 인덱스 번호를 구해준다.
	document.write(t.indexOf('you') + '<br>');	//12

- indexOf('특정 문자 또는 문자열') 함수를 사용해서 가장 먼저 나오는 그 문자 또는 문자열의 인덱스 번호를 구해준다.

특정 인덱스 이후의 특정 문자,문자열의 인덱스 구하기 (string02.html 부분)

	// indexOf('you', 16) 
	// : 인덱스 16번 이후에 가장 먼저 나오는 'you'의 인덱스 번호를 구해준다.
	document.write(t.indexOf('you', 16) + '<br>');	//29

- indexOf('특정 문자 또는 문자열', '특정 인덱스') 함수를 사용해서 특정 인덱스 이후에 가장 먼저 나오는 그 문자 또는 문자열의 인덱스 번호를 구해준다.

끝에서부터 특정 문자,문자열의 인덱스 번호 구하기 (string02.html 부분)

	// lastIndexOf('you')
	// : 끝에서 가장 먼저 나오는 'you'의 인덱스 번호를 구해준다.
	document.write(t.lastIndexOf('you') + "<br>");	//29

- lastIndexOf('특정 문자 또는 문자열') 함수를 사용해서 문자열 끝에서부터 가장 먼저 나오는 특정 문자, 문자열의 인덱스를 구해준다.

특정 문자열과 일치가 되는 문자열 구하기 (string02.html 부분)

	// match('luck') : 가장 먼저 나오는 'luck'과 일치가 되는 문자를 반환
	document.write(t.match('luck') + "<br>");	//luck

- match() 함수는 문자열에서 정규식을 검색하여 성공 여부를 반환한다.

- 찾고자하는 문자열을 매개변수로 넣는다, luck 과 일치되는 값이 luck 이므로 luck을 출력함

+ 찾고자 하는 값이 없으면?

 

문자열을 대문자로 변환 (string02.html 부분)

	// toUpperCase() : 대문자로 변환
	// HELLO THANK YOU GOOD LUCK TO YOU
	document.write(t.toUpperCase() + "<br>");

- toUpperCase() : 문자열을 대문자로 변환해줌

 

문자열을 소문자로 변환 (string02.html 부분)

	// toLowerCase() : 대문자로 변환
	// hello thank you good luck to you
	document.write(t.toLowerCase() + "<br>");

- toLowerCase() : 문자열을 소문자로 변환해줌

 

문자열 추출 관련 메소드

- substring(시작인덱스, 끝 인덱스)

- substr(인덱스, 길이)

- 두가지가 기능은 비슷하지만 형식은 다르다

- 자바는 substring() 만 지원되지만 자바스크립트에서는 substring(), substr() 다 지원된다.

 

substring() 과 substr() 차이

- substring(strat index) 처럼 매개변수가 1개 오면 start index가 됨, 끝까지 추출

- substring(start index, end index) 처럼 매개변수가 2개 오면 start index 와 end index 가 되고, start 부터 end-1 까지 출력

- substr(start index) 처럼 매개변수 1개 오면 start index 가 됨, 끝까지 추출

- substr(start index, 추출한 문자열 갯수) 처럼 매개변수 2개 오면 start index와 추출할 문자열 개수가 되고 start 부터 문자열 개수만큼 추출

+ 즉 매개변수가 1개일때는 두 함수의 기능이 동일하다.

 

문자열 추출 함수1 (string02.html 부분)

	// substring(start index, end index)
	// : start 인덱스부터 end-1 번 인덱스 번호의 문자를 추출
	// substring(6, 12) : 인덱스 6번부터 11번 까지의 문자를 추출
	document.write(t.substring(6, 12) + "<br>");	//Thank

- sutstring(start index, end index) 함수로 인덱스를 이용해서 특정 문자열을 추출한다.

- 인덱스 6은 T, 인덱스 11은 k 이므로 Thank 가 출력된다

- 인덱스 start 의 문자부터 인덱스 end-1 의 문자까지 출력한다.

 

문자열 추출 함수2 (string02.html 부분)

	// substr(start index, 추출할 문자열 갯수)
	// substr(21, 4) : 인덱스 21번부터 4개의 문자를 추출
	document.write(t.substr(21, 4) + "<br>");	//luck

- substr(start index, 추출할 문자열 갯수) 함수로 인덱스와 갯수를 이용해서 특정 문자열을 추출한다.

- 추출할 문자열의 개수가 두번쨰 매변수에 들어감

 

구분기호로 문자열 자르기 함수 (string02.html 부분)

	// split("구분기호")
	// : 구분기호를 이용해서 문자를 분리해서 배열로 리턴해주는 함수
	// split(" ") : 공백문자를 기준으로 문자를 분리해서 배열로 리턴해준다.
	var s = t.split(" ");
	document.write(s[0] + "<br>");
	document.write(s[1] + "<br>");
	document.write(s[2] + "<br>");
	document.write(s[3] + "<br>");
	document.write(s[4] + "<br>");
	document.write(s[5] + "<br>");
	document.write(s[6] + "<br>");
	
	for(var i = 0; i < s.length; i++) {
		document.write(s[i] + "\t");
	}

- split() 메소드로 문자들을 특정 구분기호로 잘라서 추출 가능하다.

- 구분기호를 이용해서 문자를 분리해서 배열로 리턴한다.

- 잘린 문자열들을 왼쪽의 s 배열로 리턴한다.

- 배열의 0번 인덱스부터 차례대로 저장된다.

- 차례대로 작성하여 출력할수도 있고 배열속성 length를 통해 반복문으로 출력할수도 있다.

 

String 객체 예제 3

- string03.html

 

문제 1 (string03.html 부분)

	// Q1. 키보드로 영문 이름을 입력받아서 대문자로 변환하는 프로그램 작성
	
	var name = prompt("당신의 영문 이름을 입력하세요","");
	var upper = name.toUpperCase();
	document.write(upper + "<br>");

- String 객체의 toUpperCase() 함수 사용

문제 2 (string03.html 부분)

	// Q2. 핸드폰 번호를 입력받아서, 마지막 4자리를 보이지 않게끔 별표(*)로 처리
	
	var num = prompt("핸드폰 번호를 입력하세요","");
	// num = "01012345678"
	
	if(num.length != 11) {
		alert("핸드폰 번호 11자리를 입력하세요.")
	} else {
		var result = num.substr(0, 7) + "****";
		document.write(result);	
	}

- 앞의 7자리를 그대로 추출해서 출력하고, 뒤의 4자리를 * 로 바꾸기

- sutstring() 이나 substr() 사용

- 여기선 substr(0, 7) 함수를 사용해서 처음부터 7자리를 추출하고 있다.

- length 속성으로 길이를 구해서 입력한 데이터가 11자리가 아니면 메세지를 뿌린다.

- 입력이 11자리일때 출력

- 입력이 11자리가 아닐때 출력


Math 객체

Math 객체

- 수학적 연산을 하기 위해 주로 사용되는 객체

- 내장 객체이므로 따로 객체를 만들면 안됨

- 속성을 사용시 Math.속성 으로 사용한다.

- 함수를 사용시 Math.함수() 로 사용한다.

+ 자바의 Math 클래스와 유사한 역할

+ 자바의 Math 처럼 new로 객체를 생성하면 안되고 자바 Math 클래스의 정적 필드, 정적 메소드와 유사

 

Math 객체 예제1

Math 객체 함수, 속성

- math01.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Math 객체</title>
</head>
<body>
<script>
	// Math 객체
	
	var num = 2.5234;
	
	document.write("PI = " + Math.PI + "<br>");	//3.141592653589793
	document.write("오일러 상수 = " + Math.E + "<br>");	//2.718281828459045
	
	document.write("절대값 : " + Math.abs(-30) + "<br>");	//30
	document.write("최대값 : " + Math.max(10,5,8,30,50) + "<br>");	//50
	document.write("최소값 : " + Math.min(10,5,8,30,50) + "<br>");	//5
	document.write("올림 : " + Math.ceil(num) + "<br>");	//3
	document.write("반올림 : " + Math.round(num) + "<br>");	//3
	document.write("난수 : " + Math.random() + "<br>");	//0~1사이의 난수 발생
	document.write("거듭제곱 : " + Math.pow(2, 3) + "<br>");	//2의 3승
	document.write("제곱근 : " + Math.sqrt(9) + "<br>");	//루트 9 = 3
	
</script>
</body>
</html>

 

출력

Math의 속성 (math01.html 부분)

	document.write("PI = " + Math.PI + "<br>");	//3.141592653589793
	document.write("오일러 상수 = " + Math.E + "<br>");	//2.718281828459045

- 속성 Math.PI 를 사용하고 있다

- 자바의 필드와 유사하게 속성을 통해 파이 값과 오일러 상수 값을 구하고 있다.

- 내장 객체이므로 객체 생성 없이 Math. 로 사용하고 있다

 

절대값 구하기 (math01.html 부분)

	document.write("절대값 : " + Math.abs(-30) + "<br>");	//30

- abs() 메소드를 통해 절대값을 구한다

 

최대값 구하기 (math01.html 부분)

	document.write("최소값 : " + Math.min(10,5,8,30,50) + "<br>");	//5

- max() 메소드를 통해 최대값을 구한다

- 여러개의 값 중 최대값을 구해준다. 2개 이상의 값이 들어갈 수 있다.

+ 자바에선 max() 메소드의 매개변수에 2개만 들어갈 수 있다, 2개 중 최대값만 구할 수 있음

 

최소값 구하기 (math01.html 부분)

	document.write("최소값 : " + Math.min(10,5,8,30,50) + "<br>");	//5

- min() 메소드를 통해 최소값을 구한다.

 

올림 (math01.html 부분)

	document.write("올림 : " + Math.ceil(num) + "<br>");	//3

- ceil() 함수를 통해 올림을 한다.

- 소수 첫째자리에 어떤 값이 오더라도 소수 첫째자리에서 무조건 올림

 

반올림 (math01.html 부분)

	document.write("최소값 : " + Math.min(10,5,8,30,50) + "<br>");	//5

- round() 함수로 소수 첫째자리에서 반올림한다

- 소수 첫째자리에 5 이상의 값이 오면 올림한다.

 

내림 (math01.html 부분)

	document.write("내림 : " + Math.floor(num) + "<br>");	//2

 

- floor() 함수를 통해 내림을 한다

- 소수점 첫째자리에 어떤 값이 오더라도 소수점 이하를 모두 버린다

 

난수 발생 (math01.html 부분)

	document.write("난수 : " + Math.random() + "<br>");	//0~1사이의 난수 발생

- random() 함수로 0 부터 1사이의 난수를 발생시켜준다.

ex) 난수 : 0.7289365971271167

 

거듭 제곱 (math01.html 부분)

	document.write("거듭제곱 : " + Math.pow(2, 3) + "<br>");	//2의 3승

- pow(x,y) 함수로 거듭제곱을 구한다.

- x의 y승 제곱근을 구함

 

제곱근 (math01.html 부분)

	document.write("제곱근 : " + Math.sqrt(9) + "<br>");	//루트 9 = 3

- sqrt() 함수로 제곱근을 구한다.

- sqrt(x) 에서 루트 x 의 값을 구함

+ 계산기 프로그램의 루트 기능을 구현할때 sqrt() 함수를 사용한다

 

Math 객체 예제2

random() 함수 예제

- 가위, 바위, 보 맞추기

- math02.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>가위, 바위, 보 맞추기</title>
</head>
<body>
<script>
	var t = prompt("가위,바위,보 중에서 하나를 입력하세요","");
	
	switch(t) {
	case '가위' : t = 1;
				break;
	case '바위' : t = 2;
				break;
	case '보' : t = 3;
				break;
	default : alert("잘못 입력했습니다.");
				location.reload();	// 새로고침
	}
	
	// 1 ~ 3 사이의 난수 발생
	// Math.random() : 0 ~ 1 사이의 난수 발생
	// var r = Math.ceil(Math.random() * 3);	// 1 ~ 3 난수 발생
	var r = Math.floor(Math.random() * 3) + 1;	// 1 ~ 3 난수 발생
	
	alert("난수 : " + r);
	
	if (t == r) {
		alert("맞췄습니다.");
	} else {
		alert("틀렸습니다.");
	}
</script>
</body>
</html>

- switch~case를 이용해서 '가위'를 눌렀을땐 t에 1을 저장한다.

- location.reload() 를 통해 현재 문서를 새로고침 해준다.

- 잘못 입력했을땐 위에서 부터 다시 실행되므로 다시 입력받는 것

- 난수를 발생시켜서 t 변수에 저장된 값이 맞는지 판별

 

난수를 발생시키는 2가지 방법 (math02.html 부분)

	// 1 ~ 3 사이의 난수 발생
	// Math.random() : 0 ~ 1 사이의 난수 발생
	// var r = Math.ceil(Math.random() * 3);	// 1 ~ 3 난수 발생
	var r = Math.floor(Math.random() * 3) + 1;	// 1 ~ 3 난수 발생

- Math.floor() 함수를 사용하면 내려버리므로 마지막에 + 1을 해줘야함

- Math.random() 으로 하면 

- 무조건 올림인 Math.ceil() 을 사용하면 난수 0.xx 가 무조건 1이 된다

- 거기서 * 3을 하면 1 부터 3사이의 난수가 된다.????

이거 내가 이해하고 여기 설명하기

 

출력

 잘못된 값 입력시 출력

- 이후 새로고침되어 다시 시작

복습

자바스크립트 선언 방식

1. <script></script>

2 <script type="text/javascript"></script>
3. <script language="javascript"></script>

- body 태그 안에 써도 되고 head 태그 안에 써도 된다.

- 함수를 쓸때는 head 태그 안에 script 를 선언하는 것이 좋다.

 

내장 객체

- 자바스크립트에 내장되어 지원되는 객체

- 객체에는 특성(속성) 이 있고 메소드가 있다

- 특성은 자바의 필드와 같은 역할

ex) 검색한 자료를 부모창으로 가져갈때 opener 특성 사용

+ 자바에서는 내장 객체가 없었다. 클래스로 직접 객체를 만들어야한다.

+ JSP는 9개의 내장 객체가 지원된다, 클래스로 직접 객체를 만들수도 있다.

 

windown 객체

- 최상위 객체 window

- window 객체는 함수를 쓸때 생략 가능하다.

- window 객체에서 wirte() 와 writeln() 와 alert() 함수가 지원된다.

 

document 객체

- 문서에 출력시 document 객체를 사용해야한다.

- 브라우저 관련 객체 중 하나이다.

줄바꿈

- <br> 태그나 <p> 태그를 쓸때는 write안의 ' ' 이나 " " 안에 써야한다.

 

콘솔창에 출력

- console.long()

- 값이 잘 리턴되었는지 등 확인하는 경우 콘솔창에 출력하는 경우가 많다.


예습

window 의 함수

alert()

- 메세지 박스를 출력

- alert() 을 쓰면 확인 버튼 1개만 만들어진다.

- alert() 은 window 의 내장객체

 

confirm()

- confirm()은 확인, 취소 버튼있는 창을 띄운다.

- confirm() 은 중요한 결정내릴때 한번더 물어보는 경우 사용

- ex) 정말로 삭제하시겠습니까?

- 확인누르면 true 리턴, 취소 누르면 false리턴

 

prompt()

prompt 창을 띄운다.

prompt() 는 사용자로부터 키보드로 입력을 받을 수 있다

 

+ 팝업창 열때는 window.open(), 닫을때는 window.close();

 

document 객체의 속성

bgColor

- 배경색 바꿀 수 있다.

fgColor 

- 글자 색 바꿀 수 있다.

 

document 객체의 함수

wirte

- 문서에 데이터 출력

- 브라우저창에 데이터 출력

 

form 객체

- window 의 하위 객체

- form 의 하위객체에는 botton, submit, reset, radio 등이 있다.


window 내장 객체

confirm() 함수

- window 객체의 메소드

- 메세지박스(대화상자) 를 띄움

- 확인과 취소 버튼 2개가 제공됨

- 사용자에게 중요한 결정을 물어보고 동의를 받기위해 사용

- 확인 버튼 누르면 true 리턴, 취소 버튼 누르면 false 리턴

+ alert() 은 확인 버튼만 있는 일종의 경고창을 띄웠음

 

conform() 함수 예제

- confirm.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>confirm함수</title>
</head>
<body>
<script>
// confirm() 함수는 사용자에게 중요한 결정을 물어볼때 주로 사용되며,
// 확인 버튼을 클릭하면 true 값을 리턴하고,
// 취소 버튼을 클릭하면 false 값을 리턴한다.

var result = confirm("정말로 삭제 하시겠습니까?");
if(result){
	alert("삭제 성공");
}
else{
	alert("삭제 취소");
}
</script>
</body>
</html>

- window.alert() 가 원칙이지만 window 객체는 생략이 가능하므로 alert()으로 사용 가능하다.

- 자바스크립트는 변수 만들떄 앞에 자료형을 쓰지 않고 var 등으로 선언(변수를 만들겠다는 의미)

- 정수값을 저장하면 정수형 변수, 논리값을 저장하면 논리형 변수가 된다.

확인 을 눌렀을때

 

취소 를 눌렀을때

- 확인과 취소 버튼 2개가 제공됨

- 사용자가 확인 버튼을 누르면 result 변수가 true를 리턴받고. 취소 버튼을 누르면 false 를 리턴받음


prompt() 함수

- 사용자가 키보드로 값을 입력받을때 사용하는 메소드

- 출력되는 메세지와 초기값, 두개의 값을 입력해야함

- 사용자가 입력한 값이 리턴값으로 온다, 그래서 값을 받는 변수에 저장된다.

- window 객체의 메소드

 

prompt() 함수 예제1

- prompt.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>prompt함수</title>
</head>
<body>
<script>
	// prompt("메세지?","초기값")
	var name = prompt("이름을 입력하세요?","");
	document.write("당신의 이름은 " + name + "<br>");
	document.write(typeof(name) + "<br>");
</script>
</body>
</html>

- window.prompt() 가 원칙이지만 window 객체는 생략이 가능하므로 prompt()으로 사용 가능하다.

- typeof(변수명) : javascript 에서 변수 선언시 자료형 쓰지 않지만 이 변수가 어떤 자료형인지 확인할때 쓰는 메소드

- 문자 데이터끼리 연결할때 + 와 , 둘 다 가능하다.

출력

- 자료형은 소문자로 출력된다.

 

prompt() 함수 예제2

- prompt.html(수정)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>prompt함수</title>
</head>
<body>
<script>
	// prompt("메세지?","초기값")
	var name = prompt("이름을 입력하세요?","");
	document.write("당신의 이름은 " + name + "<br>");
	document.write(typeof(name) + "<br>");
</script>

<script>
	var age = prompt("나이를 입력 하세요?","");	//age = "24"
	alert(typeof(age));					//string
	if(age >= 20){
		alert("당신은 성인입니다.");
	}else{
		alert("당신은 미셩년자 입니다.")
	}
</script>
</body>
</html>

- prompt() 함수로 키보드로 값을 받을때는 문자로 입력이 됨

- 24 를 치면 문자 24가 입력되는 것이다.

- age 변수에 사용자가 입력한 값이 저장된다.

 

자바스크립트 문자와 숫자

- 자바스크립트에서는 문자와 숫자의 비교가 되므로 위의 age >= 20 이 실행 된다.

- 다만 산술적인 연산을 하려면 형변환을 해야한다.

 

- 아래는 순서대로의 출력

- prompt() 함수로 키보드로 값을 받을때는 문자로 입력이 됨

- 그래서 typeof(age) 가 string이 나온다.

ex) 24 를 키보드로 입력시 숫자가 아닌 문자 24가 입력되는 것이다.

 

자바스크립트 변수

- 변수 : 메모리상에 데이터를 저장하는 기억공간의 이름

- 형식 : var 변수형 = 값(데이터);

 

+ var 대신 let 로도 사용가능

+ 변수를 만들때 자료형을 쓰지 않는다.

 

자바스크립트 변수 예제1

숫자 데이터

- variable.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>변수</title>
</head>
<body>
<!-- 
	변수 : 메모리상에 데이터를 저장하는 기억공간의 이름
	형식 : var 변수형 = 값(데이터);
 -->
<script>
	// 1. 숫자 데이터
	var num = 10;
	var pi = 3.14;
	document.write("num = ", num + "<br>");
	document.write("pi = ", pi + "<br>");
	document.write(typeof(num)+"<br>");	// number
	document.write(typeof(pi)+"<br>");	// number
</script>
</body>
</html>

- 정수값 저장시 정수형 변수가 된다, num은 정수형 변수

- 실수값 저장시 실수형 변수가 된다, pi는 실수형 변수

- 출력시 문자를 + 로도 연결 가능하고 , 로도 연결 가능하다.

- typeof()로 출력시 정수형 변수도 number, 실수형 변수도 number로 출력됨

 

자바스크립트 변수 예제2

문자 데이터

- variable.html (수정, 수정부분만)

<script>	
	// 2. 문자 데이터
	var str1 = '자바스크립트';
	var str2 = "javascript";
	document.write("str1 = ", str1 + "<br>");
	document.write("str2 = ", str2 + "<br>");
	document.write(typeof(str1) + "<br>");	// string
	document.write(typeof(str2) + "<br>");  // string
</script>

- 문자 저장시 쌍따옴표로 감싸도 되고 외따옴표로 감싸도 된다.

- 문자 데이터는 typeof() 로 출력시 string 으로 출력됨

 

+ 자바스크립트는 한줄씩 처리되는 인터프리터 방식

 

자바스크립트 변수 예제3

논리 데이터

- variable.html (수정, 수정부분만)

<script>	
    // 3. 논리 데이터
	var b1 = true;
	var b2 = false;
	document.write("b1 = ", b1 + "<br>");
	document.write("b2 = ", b2 + "<br>");
	document.write(typeof(b1) + "<br>");	// boolean
	document.write(typeof(b2) + "<br>");	// boolean	
</script>

 

자바스크립트 변수 예제4

null 데이터

- variable.html (수정, 수정부분만)

<script>	
    // 4. null 데이터
	var str = null;
	document.write("str = ", str + "<br>");	// null
	document.write(typeof(str) + "<br>");	// object	
</script>

 

자바스크립트 변수 예제4

null 데이터

- variable.html (수정, 수정부분만)

<script>
	var result = 30;
	var result = "자바스크립트";
	document.write("result = ", result);	// result = 자바스크립트
</script>

- 가장 마지막에 할당된 값인 자바스크립트가 출력됨

- 자바는 자료형에 맞는값만 입력했어야하는데, 자바스크립트는 변수 선언시 자료형을 쓰지 않기때문에 정수형 데이터 30을 넣은 뒤 문자형 데이터 "자바스크립트" 를 넣을 수 있다.

 

자바스크립트 연산자

- 비교, 논리, 산술, 확장대입, 증감 연산자 등을 지원한다.

 

자바스크립트 연산자 예제1

산술 연산자1

- opper01.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>산술 연산자</title>
</head>
<body>
<script>
 	// 산술 연산자 : +, -, *, /, %(나머지)
	
	var num1 = 15;
	var num2 = 2;
	var result;
	
	result = num1 + num2;	// 더하기
	document.write("num1 + num2 = " + result + "<br>")
	result = num1 - num2;	// 빼기
	document.write("num1 - num2 = " + result + "<br>")
	result = num1 * num2;	// 곱하기
	document.write("num1 * num2 = " + result + "<br>")
	result = num1 / num2;	// 나누기
	document.write("num1 / num2 = " + result + "<br>")
	result = num1 % num2;	// 나머지
	document.write("num1 % num2 = " + result + "<br>")
</script>
</body>
</html>

- 문자 데이터끼리 연결할때 + 와 , 둘 다 가능하다.

- 자바스크립트는 변수 만들때 자료형 쓰지 않으므로 15 / 2 를 하면 7이 아닌 실수 7.5 라는 결과를 출력한다.

+ 자바는 int 형 변수끼리 산술연산을 하면 같은 int 형으로만 처리되었다.

 

자바스크립트 연산자 예제2

산술 연산자2

- opper02.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>산술 연산자</title>
</head>
<body>
<script>
	// 산술 연산자
	var t1 = "학교종이";
	var t2 = "땡땡땡";
	var t3 = 8282
	var t4 = "어서 모이자";
	var result;
	
	result = t1 + t2 + t3 + t4;
	document.write("result = " + result);	
</script>
</body>
</html>

- 문자와 숫자를 + 로 연결시 결합되어 처리된다.

- 문자데이터와 숫자데이터가 혼합되어있고 + 를 하면 산술적인 연산이 안되므로 결합되어 처리된다.

 

자바스크립트 연산자 예제3

확장 대입 연산자

- 두가지 이상의 연산자가 결합되어있는 연산자

- +=, -=, *=, /=, %= 등

- opper03.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>확장 대입 연산자</title>
</head>
<body>
<script>
	// 확장 대입 연산자 : +=, -=, *=, /=, %=
	
	var num1 = 10;
	var num2 = 3;
	num1 += num2;	// num1 = num1 + num2;
	document.write("num1 = " + num1 + "<br>");	// 13
	num1 -= num2;	// num1 = num1 - num2;
	document.write("num1 = " + num1 + "<br>");	// 10
	num1 *= num2;	// num1 = num1 * num2;
	document.write("num1 = " + num1 + "<br>");	// 30
	num1 /= num2;	// num1 = num1 / num2;
	document.write("num1 = " + num1 + "<br>");	// 10
	num1 %= num2;	// num1 = num1 % num2;
	document.write("num1 = " + num1 + "<br>");	// 1
</script>
</body>
</html>

- num1에 계속 저장되며 아래쪽의 연산결과에 영향을 줌

 

자바스크립트 연산자 예제4

증감 연산자

- ++, --

- opper04.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>증감 연산자</title>
</head>
<body>
<script>
	// 증감 연산자 : ++, --
	var num1 = 10;
	var num2 = 20;
	
	num1--;		// 후행 연산
	document.write("num1 = " + num1 + "<br>");		// 9
	num1++;		// 후행 연산
	document.write("num1 = " + num1 + "<br>");		// 10
	
	result = num2++;	// 후행 연산
	document.write("num2 = " + num2 + "<br>");		// 21
	document.write("result = " + result + "<br>");	// 20
	
	result = ++num2;	// 선행 연산
	document.write("num2 = " + num2 + "<br>");		// 22
	document.write("result = " + result + "<br>");	// 22	
</script>
</body>
</html>

- 후행 연산시 result 변수에 num2 를 먼저 할당한 후 ++ 를 처리하므로 result 는 20, num2는 21이 된다.

- 선행 연산시 ++ 를 먼저 처리 한 후 result 변수에 num2를 할당하므로 result 와 num2 모두 22가 된다.

- 변수에 값을 할당하며 증감 연산자를 쓸 때는 주의해야한다.

자바스크립트 연산자 예제5

비교 연산자

- 자바와 같다

- >, >=, <, <=, ==, !=

- 참이면 true, 거짓이면 false 반환

- opper05.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>비교 연산자</title>
</head>
<body>
<script>

	// 비교 연산자 : >, >=, <, <=, ==, !=
	
	var a = 10;
	var b = 20;
	var c = 10;
	var f = "20" // 문자 20
	var result;
	
	result = a > b;
	document.write("a > b = " + result + "<br>");	// false
	result = a < b;
	document.write("a < b = " + result + "<br>");	// true
	console.log("a<b = " + result + "<br>");
	
	result = b == f;
	document.write("b == f = " + result + "<br>");	//true
	
	result = a != b;
	document.write("a != b = " + result + "<br>");	//true	

	result = b != f;
	document.write("b != f = " + result + "<br>");	//false
</script>
</body>
</html>

 

- b는 숫자 20, f는 문자 "20" 이지만 자바스크립트에선 같은 값으로 인식하고 비교연산 == 시 true 출력

+ 자바스크립트 여러 문제 생김

document.write("a<b = " + result + "<br>"); // true
console.log("a<b = " + result + "<br>");

-  a<b 출력시 a까지만 출력됨

- 콘솔로는 잘 출력되지만 브라우저에선 문제 생긴다.

- 띄워서 쓰자

 

자바스크립트 연산자 예제6

문제

- opper06.html

 

- prompt()로 받아서 n1, n2 모두 문자형 데이터가 들어간다.

- 문자끼리 크기 대소 비교 된다.

+ 문자들끼리도 비교 된다.

+ a, b를 입력하면 max = b 가 된다, 내부적으로 10진수 아스키코드로 처리된다.

 

- 엄밀히는 문자와 숫자를 변환해서 사용해야한다, 나중에 안되는 경우도 있음.

- opper06.html (수정)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>문제</title>
</head>
<body>
<script>
	// 키보드로 정수 2개를 입력 받아서 최대값과 최소값을 구하는 프로그램을 작성
	var n1 = prompt("정수1 을 입력하세요.","");
	var n2 = prompt("정수2 를 입력하세요.","");
	document.write(typeof(n1) + "<br>");	// string
	document.write(typeof(n2) + "<br>");	// string
	
	var max, min;
	
	// Number() : 문자를 숫자로 변환 해주는 함수
	var n1 = Number(n1);	// Number("30") ---> 30
	var n2 = Number(n2);	// Number("3.14") ---> 3.14
	
	if(n1 > n2) {	// 문자형 변수끼리 비교 연산을 할 수 있다.
		max = n1;
		min = n2;
	} else {
		max = n2;
		min = n1;
	}
	document.write("max = " + max + "<br>");
	document.write("min = " + min + "<br>");
</script>
</body>
</html>

- Number() 함수를 쓰면 문자를 숫자로 형변환 해준다.

- 문제 30을 연산가능한 숫자 30으로, 문자 3.14를 숫자 3.14로 변환해주고 있다.

- 이렇게 하는게 원칙이다

 

+ window 내장 함수

parseInt() : 실수형태의 문자를 정수형 숫자로 변환

parseFloat() : 실수형태의 문자를 실수형 정수로 변환

Number() : 정수형태, 실수형태의 문자를 정수나 실수로 변환

 

자바스크립트 연산자 예제7

조건 연산자

- 변수 = (조건식) ? 값1 : 값2;

- 조건식이 참이면 값1을 변수에 리턴, 조건식이 거짓이면 값2를 리턴

- opper07.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>조건 연산자</title>
</head>
<body>
<script>
	// 조건 연산자
	// 변수 = (조건식) ? 값1 : 값2;
	// 조건식이 참이면 값1을 변수에 리턴하고, 조건식이 거짓이면 값2를 리턴한다.
	
	// 키보드로 정수 2개를 입력 받아서 최대값과 최소값을 구하는 프로그램을
	// 조건 연산자를 이용해서 처리하는 프로그램 작성
	var n1 = prompt("정수1 을 입력하세요","");
	var n2 = prompt("정수2 를 입력하세요","");
	
	var max = (n1 > n2) ? n1 : n2;
	var min = (n1 < n2) ? n1 : n2;
	
	document.write("max = " + max + "<br>");
	document.write("min = " + min + "<br>");

</script>
</body>
</html>

자바스크립트 연산자 예제8

논리 연산자

- 논리 연산자 : &&, ||, !

- 자바와 동일하게 기호 형태로 논리 연산자를 사용

- opper08.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>논리 연산자</title>
</head>
<body>
<script>
	// 논리 연산자 : &&, ||, !
	// 5 과목의 점수를 입력받아서 합격, 불합격을 판별하는 프로그램 작성
	// 단, 과목당 과락은 40점이고, 평균 60점 이상을 받아야 합격한다.
	
	var n1 = prompt("과목1 점수를 입력하세요","");	// string
	var n2 = prompt("과목2 점수를 입력하세요","");
	var n3 = prompt("과목3 점수를 입력하세요","");
	var n4 = prompt("과목4 점수를 입력하세요","");
	var n5 = prompt("과목5 점수를 입력하세요","");
	
// var total = n1 + n2 + n3 + n4 + n5 // 합이 구해지지 않는다.
// Number() : 문자를 숫자로 변환해주는 함수
	var total = Number(n1) + Number(n2) + Number(n3) + Number(n4) + Number(n5);
	alert(total);
	
	var avg = total / 5;
	if (n1 >= 40 && n2 >= 40 && n3 >= 40 && n4 >= 40 && n5 >= 40 && avg >= 60) {
		alert("합격");
	} else {
		alert("불합격");
	}
	
</script>
</body>
</html>

- prompt에서 숫자를 입력해도 문자로 처리되어 저장된다.

- 10, 20, 30, 40, 50 을 프롬프트 창에 입력하자

- n1, n2, n3, n4, n5를 그냥 + 로 더했을땐, 문자이기때문에 산술적인 연산이 안된다.

- total 은 산술적인 덧셈이 아니라 각 변수의 문자가 연결된 것임.

n1, n2, n3, n4, n5를 그냥 +


- 산술 연산 위해서 문자를 숫자로 변형시켜야한다.

- Number() 함수로 문자 -> 숫자 변환시켰다.

형변환 후 + 연산 했을때

- 10, 20, 30, 40, 50 을 프롬프트 창에 입력시 결과

 

+ 콘솔로 total과 avg값을 확인

- opper08.html 추가

	var total = Number(n1) + Number(n2) + Number(n3) + Number(n4) + Number(n5);
	console.log("total : " + total);	
	var avg = total / 5;
	console.log("agv : " + avg);

- 개발자 도구 Console 에서 확인 가능

- 에러가 생겼다면 F12 개발자 도구에서 확인하고 에러를 잡기

 

+ eval 함수로 덧셈 처리

	var total = eval(n1 + n2 + n3 + n4 + n5)

- eval 함수는 문자형의 수식을 연산까지 수행할때 사용한다.

- 나중에 다시 공부할 것

 

자바스크립트 조건문

- 자바와 거의 동일

- if문, if-else문, if-else if문

 

+ 자바와 제어문은 거의 동일

자바스크립트 조건문 예시1

If문

- if01.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
	// if문
	var min = prompt("당신의 하루 통화량은 몇분입니까?", "0");
	
	if(min >= 60) {
		alert("많이 사용하는 편이네요.");
	}
</script>
</body>
</html>

- 초기값을 0 으로 설정했으므로 0 이 초기값으로 나타난다.

 

자바스크립트 조건문 예시2

If ~ else문

- 두가지중 한가지는 반드시 실행된다.

- if02.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
	// if ~ else문
	
	var num = Number(prompt("당신이 좋아하는 숫자는?","0"));
	
	if(num % 2 == 0) {		// 짝수
		alert("당신이 좋아하는 숫자는 짝수")
	} else {				// 홀수
		alert("당신이 좋아하는 숫자는 홀수")
	}
</script>
</body>
</html>

- prompt()로 받으면 문자데이터이므로 전체를 Number()로 감싸주면 숫자 데이터가 num에 저장된다.

 

자바스크립트 조건문 예시3

If ~ else if ~ else 문

- 위에서 만족하면 아래쪽 조건 실행하지 않고 빠져나간다.

- if03.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
	// if ~ else if ~ else
	// 키보드로 0 ~ 100점 사이의 점수를 입력받아서 학점을 출력하는 프로그램을 작성
	// A학점 : 90 ~ 100
	// B학점 : 80 ~ 89
	// C학점 : 70 ~ 79
	// D학점 : 60 ~ 69
	// F학점 : 60점 미만
	
	var s = prompt("0 ~ 100점 사이의 점수를 입력하세요","");
	
	if(s >= 90) {
		alert("A학점");
	} else if(s >= 80) {
		alert("B학점");
	} else if(s >= 70) {
		alert("C학점");	
	} else if(s >= 60) {
		alert("D학점");	
	} else {		
		alert("F학점");
	}
	

</script>
</body>
</html>

- 문자 데이터도 크기 대소 비교가능하므로 실행된다.

- 위에서 만족하면 아래쪽 조건 실행하지 않고 빠져나간다.

- 그런면에서 if를 여러개 쓰는것과는 다르다

 

자바스크립트 조건문 예시4

switch ~ case 문 1

- 위에서 만족해도 빠져나가지 않고 아래쪽으로 내려간다

- 빠져나오기 위해서 break; 를 쓴다.

- switch01.html (수정 전 잘못된 코드)

- 이러면 82를 넣었을때 F학점이 나온다

- 자바에서는 int형과 int형을 / 연산하면 int형으로 결과가 나왔다는 점을 이용해서 이렇게 풀었다

- 하지만 자바스크립트에서는 82/10 은 8.2 이므로 default의 F가 나온다, 원하는 결과가 나오지 않는다.

- 자바스크립트의 변수에서 자료형을 쓰지 않음으로서 생기는 문제

- 이 문제 해결을 위해서 함수 중 하나를 써야한다.

- parseInt() 는 실수형에서 소숫점을 버려서 정수로 만들어준다.

 

+ prompt 두번째에 "" 는 초기값 설정하지 않는 것임

+ 문자데이터끼리 / (나누기) 연산 안된다. % (나머지) 연산은 되었다

+ 자바스크립트는 되는것도 있고 안되는 것도 있어서 헷갈림

 

- switch01.html (수정 후)

<!DOCTYPE html>+
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
	// switch ~ case 문
	// 키보드로 0 ~ 100점 사이의 점수를 입력받아서 학점을 출력하는 프로그램을
	// switch ~ case 문으로 작성하세요 (학점기준은 if03.html 참고)

	var s = Number(prompt("0 ~ 100점 사이의 점수를 입력하세요",""));
	
	// parseInt("9.5") --> 9
	switch(parseInt(s/10)){
	case 10 :
	case 9 : alert("A학점");
			 break;
	case 8 : alert("B학점");
			 break;
	case 7 : alert("C학점");
			 break;
	case 6 : alert("D학점");
			 break;
	default : alert("F학점");
			 break;
	}
	
</script>
</body>
</html>

- parseInt("9.5") -> 9 처럼 parseInt() 함수를 쓰면 실수의 소숫점을 버려서 정수로 만든다.

 

자바스크립트 조건문 예시5

switch ~ case 문 2

- switch02.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
	// switch ~ case 문
	
	var site = prompt("네이버,다음,네이트,구글 중에서 즐겨 사용하는 사이트는?","");
	
	switch(site) {
		case "네이버" : url = "www.naver.com";
					  break;
		case "다음" : url = "www.daum.net";
					  break;
		case "네이트" : url = "www.nate.com";
					  break;
		case "구글" : url = "www.google.com";
					  break;
		default : alert("보기 중에 없는 사이트 입니다.");
	}
	
	if(url) {
		location.href = "http://" + url;
//		location.href = "http://www.oracle.com"
	}
	
</script>
</body>
</html>

- site 변수에 입력값이 저장되고, 그 입력값에 따라 switch ~ case 문으로 분기해서 처리

- url 변수 값이 있을경우에 if문 안에서 페이지 이동을 시킴

- location 객체를 이용해서 해당 사이트로 이동한다.

- 프로토콜 http:// 에 사이트 url 을 붙임

- 네이버로 이동한다.

 

+ location 객체

- window 객체 하위 내장객체 객체 중 하나이다.

- 주로 페이지를 이동시켜주는 역할을 한다.
- 사용 방법 :

location.href = "이동할 url 주소";

- 이러면 해당 페이지로 이동한다.

- 프로토콜도 반드시 써야한다.

 

자바스크립트 반복문

- 변수 선언시 자료형 쓰지 않는것 외에는 거의 동일하다.

- for문, while문, do~while문

 

자바스크립트 반복문 예제1

for문 1

- for01.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
	// for문
	// for(초기값; 조건식; 증감식) {
	// 반복 실행할 문장;	
	//}
	
	// '사랑해요' 메세지를 10번 출력
	for(var i = 1; i <= 10 ; i++) {
		document.write(i + "사랑해요.<br>");
	}
	
</script>
</body>
</html>

- 웹상이다보니 무한루프 돌면서 1000000000까지 계속 출력해주진 않고 한계가 있다. -> out of memory 뜬다.

- 클라이언트 언어 (Javascript) 로 이걸 처리시 클라이언트의 컴퓨터가 바빠짐

- Java로 이걸 처리시 서버 부하, 클라이언트에서 처리하는것이 낫다.

 

자바스크립트 반복문 예제2

for문 2

- for02.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
	// 1 ~ 10까지 합을 구하는 프로그램을 작성하세요
	
	var sum = 0;
	for(var i=1; i<=10; i++) {
		sum += i;		// sum = sum + i;
	}
	
	document.write("1 ~ 10 합 : " + sum);
	
</script>
</body>
</html>

 

자바스크립트 반복문 예제3

for문 3

- for03.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
	// 1 ~ 100 까지 홀수, 짝수의 합을 구하는 프로그램 작성
	
	var odd = 0, even = 0;
	for (var i = 1; i <= 100; i++) {
		if(i % 2 == 1) {	// 홀수
			odd += i;
		} else {			// 짝수
			even += i;
		}
	}
	 document.write("1 ~ 100 홀수의 합 : " + odd + "<br>");
	 document.write("1 ~ 100 짝수의 합 : " + even + "<br>");
	
</script>
</body>
</html>

 

자바스크립트 반복문 예제4

for문 4

- 아직 배우진 않았지만 배열 활용

- 태그는 document.write("") 의 " " 안에 들어가야함.

- "자바스크립트" 를 7번 출력하고, html의 font 태그를 이용해서 루프가 돌아갈때마다 글자크기를 다르게 설정

- 이건 속성값이 숫자이므로 i와 맞출수있다 -> 배열 쓰지 않아도 처리되는 경우이다.

- 만약 7개의 문자마다 다른 색을 쓰고 싶다면? -> 배열을 써야한다.

 

+ 자바스크립트 배열 생성 3가지 방법

- 1번방식은 배열에 어떤값 들어갈지 모를때 사용함

 

- 만약 font 태그를 이용해서 7개의 문자마다 다른 색을 쓰고 싶다면 문자데이터 이므로, 배열을 사용해아한다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
	// 배열을 활용하는 for문
	var col = ['red','orange','yellow','green','blue','navy','purple'];
	
	for(var i = 1; i <= 7; i++) {
		document.write("<font size= " + i + " color=" + col[i-1] + ">자바스크립트</font><br>");
	}
	
</script>
</body>
</html>

- 값은 " " 안에 들어가지 않으므로 속성값을 쓸때 유의

 

- 만약 font 태그를 이용해서 7개의 문자마다 다른 글꼴을 사용하고 싶다면 문자데이터이므로, 배열을 사용해야한다

- for04.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
	// 배열을 활용하는 for문
	var col = ['red','orange','yellow','green','blue','navy','purple'];
	var f = ['고딕','명조','궁서','바탕','돋움','견고딕','새고딕'];
	
	for(var i = 1; i <= 7; i++) {
		document.write("<font size= " + i +
				" color=" + col[i-1] + 
				" face=" + f[i-1] + 
				">자바스크립트</font><br>");
	}
	
</script>
</body>
</html>

+ 적용되는 글꼴도 있고 적용되지 않는 글꼴도 있다.

 

자바스크립트 반복문 예제5

for문 5

- for05.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
	// 키보드로 원하는 단을 입력받아서 구구단 1개단을 출력하는 프로그램을 작성
	
	var dan = prompt("원하는 단을 입력하세요","");
	
	for(var i = 1; i <= 9; i++) {
		document.write(dan + " * " + i + " = " + dan*i + "<br>");
	}
</script>
</body>
</html>

- * 연산은 문자 산술연산 가능 ( +는 안됨), Javascript 에서는 이런것들이 명확하지 않다.

 

자바스크립트 반복문 예제6

for문 6

- for06.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
	// 구구단 2 ~ 9 단을 출력하는 프로그램을 작성하세요.
	
	for(var dan=2; dan <= 9; dan ++) {
		document.write("[ " + dan + "단 ]<br>")
		for(var i=1; i <=9; i++) {
			document.write(dan + " * " + i + " = " + dan*i + "<br>");
		}
		document.write("<br>");	// 각 단 줄간격 벌리기
	}
</script>
</body>
</html>

 

자바스크립트 반복문 예제7

while문 1

- while01.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
	// while문
	// '사랑해요' 메세지를 10번 출력
	
	var i=1;	// 초기값
	while(i <= 10) {	// 조건식
		document.write(i + "사랑해요.<br>");
		i++;	// 증감식 : i++, ++i, i+=1, i=i+1
		
	}
	
</script>
</body>
</html>

- 초기값을 while문 바깥 위쪽에 써야한다.

- 증감식을 while문 안, 주로 끝부분에 작성한다.

 

자바스크립트 반복문 예제8

while문 2

- while02.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
	// 1 ~ 100 까지 홀수, 짝수의 합을 구하는 프로그램 작성
	
	var i = 1, odd = 0, even = 0;	// 초기값
	while(i <= 100) {				// 조건식
		if(i % 2 == 1) {	// 홀수
			odd += i;
		} else {			// 짝수
			even += i;
		}
		i++;
	}
	document.write("1 ~ 100까지 홀수의 합 : " + odd + "<br>");
	document.write("1 ~ 100까지 짝수의 합 : " + even + "<br>");
</script>
</body>
</html>

 

자바스크립트 반복문 예제9

while문 3

- while03.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
	// 키보드로 원하는 단을 입력받아서 구구단 1개단을 출력하는 프로그램을 작성
	var dan = prompt("원하는 단을 입력하세요","");
	
	var i = 1;		// 초기값
	while(i <= 9) {	// 조건식
		document.write(dan + " * " + i + " = " + dan*i + "<br>");
		i++			// 증감식
	}
</script>
</body>
</html>

- 문자와 * 연산이 된다.

 

자바스크립트 반복문 예제10

while문 4

- while04.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
	// while문을 이용해서 구구단 (2 ~ 9단)을 출력하는 프로그램을 작성
	
	var dan = 2;
	while(dan <= 9) {
		document.write("[ " + dan + "단 ]<br>");
		var i = 1;
		while(i <= 9) {
			document.write(dan + " * " + i + " = " + dan*i + "<br>");
			i++;
		}
		dan++;
		document.write("<br>");
	}
</script>
</body>
</html>

- 초기값 위치 설정 잘못하면 2단만 출력된다.

- 바깥쪽 while루프를 한번돌면 i는 10이 되므로 다시 i 를 1로 초기화 시켜야한다.

 

자바스크립트 반복문 예제11

do ~ while문 1

- dowhile01.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
	// do ~ while문
	// '사랑해요' 메세지를 10번 출력
	
	var i = 1; // 초기값
	do{
		document.write(i + "사랑해요.<br>");
		i++;	// 증감식
	} while(i <= 10);	// 조건식
	
</script>
</body>
</html>

- 초기값과 증감식을 씌기

- 초기값은 do ~ while 문 바깥쪽 위에, 증감식은 do ~ while 문 내부에 쓴다.

- 자바스크립트에서는 while() 뒤에 ; 를 쓰지 않아도 된다.

자바스크립트 반복문 예제12

do ~ while문 2

- dowhile02.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
	// 키보드로 수식(ex. 10 + 20)을 입력받아서 연산결과를 출력하는 프로그램을 작성
	
	do {
		s = prompt("수식을 입력하세요 (종료하려면 0을 입력)","");
		
		if(s == 0) break;
        
		// eval() : 문자 형식의 수식을 연산 해주는 함수
		// eval("10+20") --> 30
		document.write(s + " 의 결과는 " + eval(s) + "<br>");
	} while (true);	// 무한루프

</script>
</body>
</html>

- 무한루프를 돌리면서 사용자의 입력을 계속해서 받아야한다, 빠져나가는건 break 사용

- eval() 함수는 문자 형식의 수식을 연산해준다.

- 연산결과 30은 숫자 데이터로 나온다.

- 입력한 전체는 문자 데이터이다.

- 함수 사이의 우선순위때문에 수식 작성 후 확인을 눌러도 계속해서 이 창이 뜬다

+ alert() 과 document.write() 가 중 alert()가 우선순위가 높다.

- prompt()가 document.write() 보다 우선순위가 높기때문에 prompt()가 완전히 끝나야만 문서에 출력함

- 0 을 눌러줘서 prompt() 창을 완전히 끝내야 결과가 화면에 출력된다.

보조제어문

- break문, continue문

- 자바와 같은 기능이므로 예제를 하지는 않음


내장함수

- 대소문자 구분한다

 

+ isNaN() 함수

- 사용자가 숫자를 입력해야하는 곳에 문자를 입력하였을때를 대비해서 사용

- 문자가 포함되면 true를 반환함

 

parseInt() 함수

- 문자형 데이터를 정수형 데이터로 변환해줌

- 정수형 데이터로 변환할때, 소숫점 이하 부분을 버린다.

 

내장함수 예제1

parseInt() 함수 예제

- builtin.html 부분

<script>
	// 1. parseInt("3.14") --> 3
	document.write("문자형 데이터를 정수형 데이터로 변환 : " + parseInt("3.14") + "<br>");
</script>

출력

parseFloat() 함수

- 문자형 데이터를 실수형 데이터로 변환

 

내장함수 예제2

parseFloat() 함수 예제

- builtin.html 부분

	// 2. parseFloat("3.14") --> 3.14
	document.write("문자형 데이터를 실수형 데이터로 변환 : " + parseFloat("3.14") + "<br>");

출력

- 숫자형 데이터가 되었으므로 + 산술연산이 가능하다

	// 2. parseFloat("3.14") --> 3.14
	document.write("문자형 데이터를 실수형 데이터로 변환 : " + (parseFloat("3.14") + 10) + "<br>");

출력

Number() 함수

- 문자형 데이터를 숫자형 데이터로 변환

- 정수형태 문자는 정수형 데이터로 변환, 실수형태 문자는 실수형 데이터로 변환함

 

내장함수 예제3

Number() 함수 예제

- builtin.html 부분

	// 3. Number("3.14") --> 3.14
	document.write("문자형 데이터를 숫자형 데이터로 변환 : " + Number("3.14") + "<br>");

출력

- 외관상 확인 불가하므로 typeof() 사용

	document.write(typeof("3.14") + "<br>");			// string
	document.write(typeof(Number("3.14")) + "<br>");	// number

출력

String() 함수

- Number() 함수와 반대

- 숫자형 데이터를 문자형 데이터로 변환

 

내장함수 예제4

String() 함수 예제

- builtin.html 부분

	// 4. String(1000) --> "1000"
	document.write("숫자형 데이터를 문자형 데이터로 변환 : " + String(1000) + "<br>");

출력

	document.write(typeof(1000) + "<br>");			// number
	document.write(typeof(String(1000)) + "<br>");	// string

출력

 

eval() 함수

- 문자형 산술식을 연산 수행

 

내장함수 예제5

eval() 함수 예제

- builtin.html 부분

	// 5. eval("10+20") --> 30
	document.write("문자형 산술식을 연산 수행 : " + eval(10+20) + "<br>");

출력

isNaN() 함수

- 문자가 아니면 true를 리턴

- 사용자가 문자를 입력했는지 숫자를 입력했는지 판별

- 반드시 문자를 입력해야하거나, 반드시 숫자를 입력해야할 때 사용

ex) 유효성 검사에 사용, 전화번호 앞자리값을 불러와서 숫자인지 문자인지 판별

- 변수명/함수명 대소문자 구분한다

 

내장함수 예제6

isNaN() 함수 예제

- builtin.html 부분

	// 6. isNaN(Not a Number) : 숫자가 아니면(문자가 포함되면) true 반환하는 함수
	//	isNaN("10+20") --> true
	//	isNaN("10") --> false
	document.write("문자가 포함되면 true 값을 리턴 : " + isNaN("10+20") + "<br>");
	document.write("문자가 포함되면 true 값을 리턴 : " + isNaN("10") + "<br>");
	document.write("문자가 포함되면 true 값을 리턴 : " + isNaN(10) + "<br>");

- isNaN("10+20") 에서 안에 있는 것은 문자임, 산술연산 + 안되므로 "10+20"은 문자이다.

+ isNaN(10+20)은 숫자이다.

- isNaN() 에서 "10" 은 쌍따옴표가 있지만 숫자로 인식한다.

출력

 

함수

- 내장 함수 : 지금까지 공부했다.

- 사용자 정의 함수 : 자바스크립트에선 function으로 함수를 만든다

복습

부트스트랩 사용 방법

1. 라이브러리를 직접 다운하고 link 태그로 불러오는 방법

- 선택자의 속성값들을 수정이나 변경이 가능한게 장점

2. 원격의 서버에 올라간 것을 주소로 사용

 

실습 환경

- download 안의 bootstrap 4점대를 가져와서 쓰자

- 공식사이트에서 직접 다운 방식으로 쓰는 것과 같다.

 

부트스트랩 기타

- 템플릿 및 여러 선택자를 지원한다

- w3schools.com 에서 기능들을 살펴볼 수 있다.
- 전체적인 메인화면 템플릿도 있다

- 부트스트랩은 기본적으로 반응형 웹으로 반들어준다.

 

+ Javascript

- HTML코드에 포함되어서 사용됨

- 웹 상에서만 사용 가능하다

- 동적인 이벤트 처리를 해준다

 

부트스트랩 찾아서 쓰기 (w3schools.com)

- 직접 다운한 경우엔 여기의 클래스를 보고 사용하기

- CDN 방식을 사용하는 경우에는 여기의 코드를 그대로 가져오기

 

+ 부트스트랩으로 버튼 형태 만드는법

  <button type="button" class="btn btn-secondary">가입</button> 
  <input type="button" value="확인" class="btn btn-secondary">
  
  <a href="#" class="btn btn-secondary">글작성</a>
  <div class="btn btn-secondary">로그인</div>

- 부트스트랩을 사용해서 .class 속성을 이용해서 CSS를 적용하고 있다

- 가입 버튼은 <button type="button">, 확인버튼은 <input type="button"> 으로 버튼을 만들고 버튼 모양을 적용함

- 글작성 버튼은 버튼이 아니라 anchor (링크) 이지만 부트스트랩 클래스값이 적용되어 버튼처럼 된다.

- 로그인 버튼은 div 태그이지만 부트스트랩 클래스값이 적용되어 버튼처럼 된다


부트스트랩 자주쓰는 기능

 

부트스트랩 사용 예제1

1. 버튼

- 테두리가 있는 형태의 버튼으로 출력

- button02.html

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Button Outline</h2>
  <button type="button" class="btn btn-outline-primary">Primary</button>
  <button type="button" class="btn btn-outline-secondary">Secondary</button>
  <button type="button" class="btn btn-outline-success">Success</button>
  <button type="button" class="btn btn-outline-info">Info</button>
  <button type="button" class="btn btn-outline-warning">Warning</button>
  <button type="button" class="btn btn-outline-danger">Danger</button>
  <button type="button" class="btn btn-outline-dark">Dark</button>
  <button type="button" class="btn btn-outline-light text-dark">Light</button>
  <br><br><br>
  
  <button type="button" class="btn btn-outline-success">ID중복검사</button>
  <button type="submit" class="btn btn-outline-success">가입</button>
  <button type="reset" class="btn btn-outline-success">취소</button>

</div>

</body>
</html>

- 클래스값만 다르게 하여 원하는 버튼 형태로 출력시킬수 있다.

+ 버튼 관련 w3schools 페이지

 

부트스트랩 사용 예제2

2. 테이블

- table01.html

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Basic Table</h2>
  <p>The .table class adds basic styling (light padding and horizontal dividers) to a table:</p>            
  <table class="table">
    <thead>
      <tr>
        <th>Firstname</th>
        <th>Lastname</th>
        <th>Email</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>John</td>
        <td>Doe</td>
        <td>john@example.com</td>
      </tr>
      <tr>
        <td>Mary</td>
        <td>Moe</td>
        <td>mary@example.com</td>
      </tr>
      <tr>
        <td>July</td>
        <td>Dooley</td>
        <td>july@example.com</td>
      </tr>
    </tbody>
  </table>
</div>

</body>
</html>

- table태그에서 클래스값만 설정해줌

 

+ 테이블 관련 w3schools 페이지

 

부트스트랩 사용 예제3

2. 테이블

- table02.html

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Striped Rows</h2>
  <p>The .table-striped class adds zebra-stripes to a table:</p>            
  <table class="table table-striped">
    <thead>
      <tr>
        <th>Firstname</th>
        <th>Lastname</th>
        <th>Email</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>John</td>
        <td>Doe</td>
        <td>john@example.com</td>
      </tr>
      <tr>
        <td>Mary</td>
        <td>Moe</td>
        <td>mary@example.com</td>
      </tr>
      <tr>
        <td>July</td>
        <td>Dooley</td>
        <td>july@example.com</td>
      </tr>
    </tbody>
  </table>
</div>

</body>
</html>

- 스트라이프가 있는 모양으로 표를 만들어준다.

 

부트스트랩 사용 예제4

2. 테이블

- table03.html

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Hover Rows</h2>
  <p>The .table-hover class enables a hover state (grey background on mouse over) on table rows:</p>            
  <table class="table table-hover">
    <thead>
      <tr>
        <th>Firstname</th>
        <th>Lastname</th>
        <th>Email</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>John</td>
        <td>Doe</td>
        <td>john@example.com</td>
      </tr>
      <tr>
        <td>Mary</td>
        <td>Moe</td>
        <td>mary@example.com</td>
      </tr>
      <tr>
        <td>July</td>
        <td>Dooley</td>
        <td>july@example.com</td>
      </tr>
    </tbody>
  </table>
</div>

</body>
</html>

- hover기능이 있는 표를 만들어준다

- 마우스를 올린 곳의 색이 변함

 

부트스트랩 사용 예제5

2. 테이블

- table04.html

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Hoverable Dark Table</h2>
  <p>The .table-hover class adds a hover effect (grey background color) on table rows:</p>            
  <table class="table table-dark table-hover">
    <thead>
      <tr>
        <th>Firstname</th>
        <th>Lastname</th>
        <th>Email</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>John</td>
        <td>Doe</td>
        <td>john@example.com</td>
      </tr>
      <tr>
        <td>Mary</td>
        <td>Moe</td>
        <td>mary@example.com</td>
      </tr>
      <tr>
        <td>July</td>
        <td>Dooley</td>
        <td>july@example.com</td>
      </tr>
    </tbody>
  </table>
</div>

</body>
</html>

- table-dark 와 table-hover 두가지 값을 다 쓰고 있다

+ 테이블 관련 w3schools 페이지

 

부트스트랩 사용 예제6

3. Pagination

- Pagination : 게시판 만들때 내용이 많아지면 페이지가 필요함, 페이지 하단 만들어줌

- page01.html

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Pagination</h2>
  <p>To create a basic pagination, add the .pagination class to an ul element. Then add the .page-item to each li element and a .page-link class to each link inside li:</p>                  
  <ul class="pagination">
    <li class="page-item"><a class="page-link" href="#">이전</a></li>
    <li class="page-item active"><a class="page-link" href="#">1</a></li>
    <li class="page-item"><a class="page-link" href="#">2</a></li>
    <li class="page-item"><a class="page-link" href="#">3</a></li>
    <li class="page-item"><a class="page-link" href="#">다음</a></li>
  </ul>
</div>

</body>
</html>

- CDN 방식으로 부트스트랩을 적용하고 있다, CSS파일은 link 태그로, JS파일은 script 태그로 불러오고 있다

- 기본적으로 반응형 웹으로 제공되므로 viewport 가 있다

- <ul> 태그에 class="pagination" 그리고 안의 <li> 태그마다 "page-item" 과, <a> 태그마다 class="page-link"가 적용되어있다.

- class="active" 인 것이 활성화 됨, 즉 1 이 활성화됨

- 코드에서 1 이 class="active" 가 적용되었으므로 1이 active 상태가 되어있다.

 

+ 페이지 관련 w3schools 페이지

부트스트랩 사용 예제7

3. Pagination

- Pagination : 게시판 만들때 내용이 많아지면 페이지가 필요함, 페이지 하단 만들어줌

- page02.html

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Pagination - Disabled State</h2>
  <p>Add class .disabled if a page for some reason is disabled:</p>
  <ul class="pagination">
    <li class="page-item disabled"><a class="page-link" href="#">Previous</a></li>
    <li class="page-item"><a class="page-link" href="#">1</a></li>
    <li class="page-item"><a class="page-link" href="#">2</a></li>
    <li class="page-item"><a class="page-link" href="#">3</a></li>
    <li class="page-item"><a class="page-link" href="#">Next</a></li>
  </ul>
</div>

</body>
</html>

- Previous 버튼의 class="disabled" 가 되어있음, 이전페이지가 없을때 클릭이 되지 않도록 막음

- Previous를 비활성화시킴, 이전페이지가 존재하지 않을때 이전페이지가 클릭되지 않게함

 

부트스트랩 사용 예제8

3. Pagination

- Pagination : 게시판 만들때 내용이 많아지면 페이지가 필요함, 페이지 하단 만들어줌

- page03.html

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Pagination</h2>
  <p>Use utilitiy classes to change the alignment of the pagination:</p>                  
 
  <!-- 왼쪽 정렬(기본값) -->
  <ul class="pagination">
    <li class="page-item"><a class="page-link" href="javascript:void(0);">Previous</a></li>
    <li class="page-item"><a class="page-link" href="javascript:void(0);">1</a></li>
    <li class="page-item"><a class="page-link" href="javascript:void(0);">2</a></li>
    <li class="page-item"><a class="page-link" href="javascript:void(0);">Next</a></li>
  </ul>
  
  <!-- 가운데 정렬 -->
  <ul class="pagination justify-content-center">
    <li class="page-item"><a class="page-link" href="javascript:void(0);">Previous</a></li>
    <li class="page-item"><a class="page-link" href="javascript:void(0);">1</a></li>
    <li class="page-item"><a class="page-link" href="javascript:void(0);">2</a></li>
    <li class="page-item"><a class="page-link" href="javascript:void(0);">Next</a></li>
  </ul>
  
  <!-- 오른쪽 정렬 -->
  <ul class="pagination justify-content-end">
    <li class="page-item"><a class="page-link" href="javascript:void(0);">Previous</a></li>
    <li class="page-item"><a class="page-link" href="javascript:void(0);">1</a></li>
    <li class="page-item"><a class="page-link" href="javascript:void(0);">2</a></li>
    <li class="page-item"><a class="page-link" href="javascript:void(0);">Next</a></li>
  </ul>
  
</div>

</body>
</html>

- 정렬기능을 가지고 있다, 페이지 처리하는 걸 목록페이지 하단영역에 왼쪽에 정렬할지, 가운데 정렬할지 ,오른쪽에 정렬할지 지정가능

- 기본값은 왼쪽 정렬이므로 왼쪽 정렬을 할때는 class:"pagination" 외에 따로 지정하지 않는다.

- 가운데 정렬을 위해선 class="justify-content-center 를 넣어준다.

+ 페이지 관련 w3schools 페이지

 

부트스트랩 사용 예제9

3. Dropdowns

- Dropdowns : 클릭시 옵션목록이 나오고 다시 클릭시 옵션목록이 없어짐

- dropdown.html

<!DOCTYPE html>
<html>
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Dropdowns</h2>
  <p>The .dropdown class is used to indicate a dropdown menu.</p>
  <p>Use the .dropdown-menu class to actually build the dropdown menu.</p>
  <p>To open the dropdown menu, use a button or a link with a class of .dropdown-toggle and data-toggle="dropdown".</p>                                          
  
  <div class="dropdown">
    <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
      Dropdown button
    </button>
    <div class="dropdown-menu">
      <a class="dropdown-item" href="http://www.naver.com">네이버</a>
      <a class="dropdown-item" href="http://www.daum.net">다음</a>
      <a class="dropdown-item" href="http://www.google.com">구글</a>
    </div>
  </div>
  
</div>

</body>
</html>

- CDN 방식으로 원격서버의 라이브러리를 불러오고 있다.

- Dropdown 기능 수행하기 위해서 div class=dropdown 으로 감싸준다.

- 버튼에서 class="dropdown-toggle" data-toggle="dropdown" 를 적용해야한다

- 다음으로 버튼을 누를따 나타나는 옵션메뉴들을 div class="dropdown-menu"로 감싸준다.

- 구체적인 개별 목록들은 class="dropdown-item" 을 적용한다.

- 바꿀수 있는 부분이 있고 바꾸지 못하는 부분들이 있음, 위의 글에서 언급한 것은 바꾸지 못한다.

- 링크가 걸려있으므로 네이버 선택시 네이버로 이동한다.

 

+ Dropdown 관련 w3schools 페이지

 

부트스트랩 사용 예제10

4. Collapse

- Collapse : 클릭하면 메뉴가 나타났다가 다시 클릭하면 메뉴가 사라짐, 접혔다 펴졌다 하는 기능

- collapsible.html

<!DOCTYPE html>
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Simple Collapsible</h2>
  <p>Click on the button to toggle between showing and hiding content.</p>
  
  <button type="button" class="btn btn-primary" data-toggle="collapse" data-target="#demo">Simple collapsible</button>
  <div id="demo" class="collapse">
    Lorem ipsum dolor sit amet, consectetur adipisicing elit,
    sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
    quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  </div>
</div>

</body>
</html>

- 일종의 자바스크립트 기능, 부트스트랩으로 적용 가능하다.

-  함수형태의 Javascript 라이브러리인 jQuery 라이브러리도 포함되어있다. (jquery.slim.min.js)

- 버튼을 만들고 data-toggle="collapse" 와 data-target="#demo" 속성을 추가한다.

- 여기서 #demo 는 펼쳐칠 div 의 id값을 의미한다!

- 그리고 펼쳐졌다 졉혀질 div 상자의 id를 "demo"로 한다.

- demo 말고도 다른 이름 사용가능, button의 data-target="#원하는이름" 으로, div의 id="원하는 이름" 으로 맞춰주면 된다.

부트스트랩 사용 예제11

5. Accordion

- Accordion : 여러개중 한가지만 펼쳐진다, 한가지가 펼쳐지면 나머지는 접힌다.

- Collapse 와 비슷한 기능 수행

- accordion.html

<!DOCTYPE html>
<html>
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Accordion Example</h2>
  <p><strong>Note:</strong> The <strong>data-parent</strong> attribute makes sure that all collapsible elements under the specified parent will be closed when one of the collapsible item is shown.</p>
 
  <div id="accordion">
  
    <div class="card">
      <div class="card-header">
        <a class="card-link" data-toggle="collapse" href="#collapseOne">
          	자바
        </a>
      </div>      
      <div id="collapseOne" class="collapse show" data-parent="#accordion">
        <div class="card-body">
          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
        </div>
      </div>      
    </div>
    
    <div class="card">
      <div class="card-header">
        <a class="collapsed card-link" data-toggle="collapse" href="#collapseTwo">
       		파이썬
      </a>
      </div>
      <div id="collapseTwo" class="collapse" data-parent="#accordion">
        <div class="card-body">
          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
        </div>
      </div>
    </div>
    
    <div class="card">
      <div class="card-header">
        <a class="collapsed card-link" data-toggle="collapse" href="#collapseThree">
         	 오라클
        </a>
      </div>
      <div id="collapseThree" class="collapse" data-parent="#accordion">
        <div class="card-body">
          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
        </div>
      </div>
    </div>
  </div>
</div>
    
</body>
</html>

 

- 각 목록인 anchor 태그에 href="#collapseOne" 의 #collapseOne은 펼쳐질 div의 id값을 의미한다, 이름값을 맞춰야한다

- 클래스값들은 이미 정해져 있으므로 그대로 써야함

+ jQuery UI 를 사용해서도 이런기능을 만들 수 있다.(jqueryui.com)

- 여러개중 한가지만 펼쳐진다, 한가지가 펼쳐지면 나머지는 접힌다.

 

+ 부트스트랩의 반응형 웹 지원

- 줄이면 맞춰서 변화한다.

 

+ 아코디언 메뉴 만드는 방법 여러가지 있다

- jQuery로도 적용 가능

 

부트스트랩 사용 예제12

6. Forms

- Forms : 폼태그 관련 기능

- ex) 모서리가 라운드 처리된 깔끔한 기능

- forms01.html

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Stacked form</h2>
  
  <form action="/action_page.php">
    <div class="form-group">
      <label for="email">Email:</label>
      <input type="email" class="form-control" id="email" placeholder="Enter email" name="email">
    </div>
    <div class="form-group">
      <label for="pwd">Password:</label>
      <input type="password" class="form-control" id="pwd" placeholder="Enter password" name="pswd">
    </div>
    <div class="form-group form-check">
      <label class="form-check-label">
        <input class="form-check-input" type="checkbox" name="remember"> Remember me
      </label>
    </div>
    <button type="submit" class="btn btn-primary">Submit</button>
  </form>
</div>

</body>
</html>

- 각 <input> 태그를 감싸는 각 <div> 에서 class="form-group"으로 묶어줘야한다.

- <input> 태그안에 class="form-control" 을 넣으면 모서리 라운드 처리를 해준다.

- 2가지를 적용해야한다. "form-group"으로 묶여져야 하고 <input> 태그 안에서 class="form-control"을 해야한다.

 

+ CSS 적용을 잘 하기 위해 <label> 태그를 쓰고 for="원하는값" 과 아래 <input> 태그의 id="원하는값" 을 맞춰준다.

+ <input type="email"> 로 설정하면 이메일 주소 형식 ( @등) 을 검사해주는 점이 <input type="text">로 만드는 것과 다르다.

- email 주소 입력창이 라운드 처리되어있고

- 반응형 웹으로 만들어져있으므로 크기에 따라 길이가 변화한다.

 

 

부트스트랩 사용 예제13

6. Inputs

- Inputs : 입력양식/선택양식에 관련, input, textarea, checkbox, radio, select 등

- ex)

- input01.html

<!DOCTYPE html>
<html lang="en">
<head>
<title>Bootstrap Example</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
	href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script
	src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<script
	src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</head>
<body>

	<div class="container">
		<h2>Form control: input</h2>
		<p>The form below contains two input elements; one of type text
			and one of type password:</p>
		<form action="action_page.php">

			<div class="form-group">
				<label for="usr">Name:</label> <input type="text"
					class="form-control" id="usr" name="username">
			</div>

			<div class="form-group">
				<label for="pwd">Password:</label> <input type="password"
					class="form-control" id="pwd" name="password">
			</div>

			<div class="form-group">
				<label for="comment">Comment:</label>
				<textarea class="form-control" rows="5" id="comment"></textarea>
			</div>

			<!-- checkbox -->
			취미
			<div class="form-check">
				<label class="form-check-label"> 
				<input type="checkbox" class="form-check-input" value="">게임
				</label>
			</div>
			<div class="form-check">
				<label class="form-check-label"> 
				<input type="checkbox"	class="form-check-input" value="">쇼핑
				</label>
			</div>
			<div class="form-check">
				<label class="form-check-label"> 
				<input type="checkbox" class="form-check-input" value="" disabled>등산
				</label>
			</div>

			<!-- radio button -->
			좋아하는 계절은?
			<div class="form-check">
				<label class="form-check-label"> 
				<input type="radio"	class="form-check-input" name="optradio">봄
				</label>
			</div>
			<div class="form-check">
				<label class="form-check-label"> 
				<input type="radio"	class="form-check-input" name="optradio">여름
				</label>
			</div>
			<div class="form-check disabled">
				<label class="form-check-label"> 
				<input type="radio"	class="form-check-input" name="optradio">가을
				</label>
			</div>
			<div class="form-check disabled">
				<label class="form-check-label"> 
				<input type="radio"	class="form-check-input" name="optradio" disabled>겨울
				</label>
			</div>

			<!-- select list -->
			<div class="form-group">
  				<label for="sel1">Select list:</label>
  				<select class="form-control" id="sel1">
    				<option>1</option>
    				<option>2</option>
    				<option>3</option>
    				<option>4</option>
  				</select>
			</div>
			
			<!-- Form Control File and Range -->
			<input type="range" class="form-control-range">
			<input type="file" class="form-control-file border">

			<button type="submit" class="btn btn-primary">Submit</button>
		</form>
	</div>

</body>
</html>

- CDN 방식으로 불러오고 있다.

1. text와 textarea

- <input type=text> 와 <textarea> 에서는 라운드 형태로 만들고 있다.

- 각 <input type=text> 와 <textarea> 를 감싼 div 태그에서 class="form-group", input 태그 / textarea 태그에서 class="form-control" 적용

2. checkbox와 radio

- 각 체크박스와 라디오버튼은 <div>로 감싸져 있고 거기서 class="form-check" , <input> 태그에서 class="form-check-input" 적용

- 체크박스와 라디오버튼에 같은 클래스가 적용됨

- select 박스에서 전체를 div로 감싸고 클래스값이 class="form-group" 이고 <select> 태그에서 <selec class="form-control"을 적용해준다.

- <input type="range"> 는 움직일 수 있는 바이다, class="form-control-range" 를 적용해준다.

- <input type="file">을 하면 첨부파일 올릴수있는 기능이 만들어지고 class="form-control-file border" 적용시 테두리가 만들어짐

- <input type="submit">을 하면 전송기능이 있는 버튼이 만들어지고 그 버튼에 CSS를 적용해서 파란색으로 만들었다.

 

+ 체크박스와 라디오버튼은 CSS 적용되어 파란색으로 체크가 표시된다는 점이 다르다

+ select 박스에 CSS가 적용되어 전체화면에 꽉찬 형태로 길게 출력된다 (기존은 안의 내용 길이에 맞게 만들어짐)

+ 등산이라는 체크박스에는 disabled 가 되어있으므로 비활성화(체크불가)

+ input type="range"는 웹표준을 준수하는 브라우저에서 사용 가능하다.

 

+ Inputs 관련 w3schools 페이지

 

부트스트랩 사용 예제14

7. Carousel

- Carousel : 자동으로 다음 이미지로 넘어가기도 하고 제어버튼을 통해서 다음 이미지로 넘어갈 수 있다.

Carousel 용어

- Indicators : 이미지 하단의 바

- slideshows : 돌아가는 이미지등, 자동으로 돌아가는 슬라이드쇼

- left and right controls : 이미지 좌우의 화살표 모양

- ex)

- carousel.html

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
  <style>
  /* Make the image fully responsive */
  .carousel-inner img {
    width: 100%;
    height: 300;
  }
  </style>
</head>
<body>

<div id="demo" class="carousel slide" data-ride="carousel">

  <!-- Indicators -->
  <ul class="carousel-indicators">
    <li data-target="#demo" data-slide-to="0" class="active"></li>
    <li data-target="#demo" data-slide-to="1"></li>
    <li data-target="#demo" data-slide-to="2"></li>
  </ul>
  
  <!-- The slideshow -->
  <div class="carousel-inner">
    <div class="carousel-item active">
      <img src="img/Koala.jpg" alt="Los Angeles" width="100%" height="300">
    </div>
    <div class="carousel-item">
      <img src="img/Lighthouse.jpg" alt="Chicago" width="100%" height="300">
    </div>
    <div class="carousel-item">
      <img src="img/Tulips.jpg" alt="New York" width="100%" height="300">
    </div>
  </div>
  
  <!-- Left and right controls -->
  <a class="carousel-control-prev" href="#demo" data-slide="prev">
    <span class="carousel-control-prev-icon"></span>
  </a>
  <a class="carousel-control-next" href="#demo" data-slide="next">
    <span class="carousel-control-next-icon"></span>
  </a>
  
</div>

</body>
</html>

- 전체가 바깥쪽 div로 감싸져 있고 id="demo"로 되어있음

- Indicator 부분에서 class="active"로 선택된 li 가 가장 처음에 나타남

- Indicator 부분에서 data-target="#demo" 이다, 즉 바깥쪽 div 태그와 이름을 맞춰야함

- slidshow 부분에서 전체를 <div class="carousel-inner"> 로 하고 그 안의 이미지들은 각 <div>로 감싸져있고 class="carousel-item" 을 적용한다, active인게 처음 나타나는 것

- control 부분에서 왼쪽 화살표와 오른쪽 화살표가 각각 <a>로 감싸져 있고 class="carousel-control-prev" 적용

- left control 에서 span 태그에 class="carousel-control-prev-icon" 가 적용되면 왼쪽 화살표(<) 를 만들어줌

- 끝까지 도달시 로테이션이 됨

- 가만히 둬도 자동으로 넘어감

- 화살표를 눌러서도 넘길 수 있음

 

+ Carousel 용어 정리

 

부트스트랩 사용 예제15

8. Modal

- Modal : 모달창은 많은 내용을 띄워주는 팝업창

- ex) 

- 버튼 클릭시 모달창을 띄워주고 있다, 안에 많은 내용 넣을 수 있음

- modal.html

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Modal Example</h2>
  <!-- Button to Open the Modal -->
  <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myModal">
    Open modal
  </button>

  <!-- The Modal -->
  <div class="modal" id="myModal">
    <div class="modal-dialog">
      <div class="modal-content">
      
        <!-- Modal Header -->
        <div class="modal-header">
          <h4 class="modal-title">모달 헤드</h4>
          <button type="button" class="close" data-dismiss="modal">&times;</button>
        </div>
        
        <!-- Modal body -->
        <div class="modal-body">
          Modal body..
        </div>
        
        <!-- Modal footer -->
        <div class="modal-footer">
          <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
        </div>
        
      </div>
    </div>
  </div>
  
</div>

</body>
</html>

- 버튼을 누르면 모달창을 띄우고 싶을때 그 버튼은 data-toggle="modal" data-target="#myModal" 로 되어있다, 이때 이 #myModal 은 모달창의 div id값과 일치해야한다.

- 모달은 모달헤드, 모달바디, 모달푸트 로 3가지 영역으로 나눠져있다. 각 영역의 div에 modal-header 등의 클래스를 적용해줘야한다.

- 모달 헤드 부분에 우측 상단의 X 버튼을 만들기위해 버튼에 class="close"를 적용시 X를 누르면 모달창을 닫아준다.

- 모달 푸트 부분에 Close 버튼을 만들기 위해 data-dismiss="modal" 를 적용한다.

 

- Close 를 누르거나 바깥쪽을 찍으면 모달창이 닫힌다

 

부트스트랩 사용 예제16

9. Scrollspy

- Scrollspy : 섹션을 누를때마다 그 내용만 나오게 한다.

ex) 

- scrollspy.html

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
  <style>
  body {
      position: relative; 
  }
  </style>
</head>
<body data-spy="scroll" data-target=".navbar" data-offset="50">

<nav class="navbar navbar-expand-sm bg-dark navbar-dark fixed-top">  
  <ul class="navbar-nav">
    <li class="nav-item">
      <a class="nav-link" href="#section1">Section 1</a>
    </li>
    <li class="nav-item">
      <a class="nav-link" href="#section2">Section 2</a>
    </li>
    <li class="nav-item">
      <a class="nav-link" href="#section3">Section 3</a>
    </li>
    <li class="nav-item dropdown">
      <a class="nav-link dropdown-toggle" href="#" id="navbardrop" data-toggle="dropdown">
        Section 4
      </a>
      <div class="dropdown-menu">
        <a class="dropdown-item" href="#section41">Link 1</a>
        <a class="dropdown-item" href="#section42">Link 2</a>
      </div>
    </li>
  </ul>
</nav>

<div id="section1" class="container-fluid bg-success" style="padding-top:70px;padding-bottom:70px">
  <h1>Section 1</h1>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>
<div id="section2" class="container-fluid bg-warning" style="padding-top:70px;padding-bottom:70px">
  <h1>Section 2</h1>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>
<div id="section3" class="container-fluid bg-secondary" style="padding-top:70px;padding-bottom:70px">
  <h1>Section 3</h1>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>
<div id="section41" class="container-fluid bg-danger" style="padding-top:70px;padding-bottom:70px">
  <h1>Section 4 Submenu 1</h1>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>
<div id="section42" class="container-fluid bg-info" style="padding-top:70px;padding-bottom:70px">
  <h1>Section 4 Submenu 2</h1>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
  <p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>

</body>
</html>

- <body> 태그 안에 data-spy="scroll" data-target=".navbar" 와 data-offset = 5 를 적용

- 상단의 바가 네비게이션 바이다, 그걸 선택시 링크를 걸어 관련 내용이 밑에 나타나도록 함, 링크 <a> 의 href= 에는 내용을 보여줄 <div>의 id값과 일치되어야한다. ex) a태그 안 href="#section1" , div 태그 안 id=section1

- 그렇게 id값을 일치시키면 그 링크(네비게이션 메뉴) 를 눌렀을때 그 div 태그안의 내용이 나타난다.

- Section 4는 다시 서브메뉴를 만들어야하므로 dropdown 을 적용함.

- <nav> 태그 안의 내용이 네비게이션 바를 만드는 역할, 여러 클래스값 적용되어있고 , <nav> 태그 안 <ul> 태그와 <li>태그를 를 통해 목록을 작성해준다.

- 클릭시 그 메뉴와 연결된 내용이 바로 아래쪽에 나온다

- Section 4는 분기를 시켜서 보여주고 있음

- 상단바는 고정되어있고 본문만 바뀌고있다.

- 스크롤바를 움직여서도 아래내용을 볼수있다.

 

부트스트랩 사용 예제17

10. Filters

- Filters : 일종의 검색기능 지원, 안의 데이터를 search

ex) j입력시 j가포함된 데이터를 뽑아온다.

- filter.html

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<div class="container mt-3">
  <h2>Filterable Table</h2>
  <p>Type something in the input field to search the table for first names, last names or emails:</p>  
  <input class="form-control" id="myInput" type="text" placeholder="Search..">
  <br>
  <table class="table table-bordered">
    <thead>
      <tr>
        <th>Firstname</th>
        <th>Lastname</th>
        <th>Email</th>
      </tr>
    </thead>
    <tbody id="myTable">
      <tr>
        <td>John</td>
        <td>Doe</td>
        <td>john@example.com</td>
      </tr>
      <tr>
        <td>Mary</td>
        <td>Moe</td>
        <td>mary@mail.com</td>
      </tr>
      <tr>
        <td>July</td>
        <td>Dooley</td>
        <td>july@greatstuff.com</td>
      </tr>
      <tr>
        <td>Anja</td>
        <td>Ravendale</td>
        <td>a_r@test.com</td>
      </tr>
    </tbody>
  </table>
  
  <p>Note that we start the search in tbody, to prevent filtering the table headers.</p>
</div>

<script>
$(document).ready(function(){
  $("#myInput").on("keyup", function() {
    var value = $(this).val().toLowerCase();
    $("#myTable tr").filter(function() {
      $(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
    });
  });
});
</script>

</body>
</html>

- 부트스트랩만으로 구현 불가능하고 안에 jQuery 기능이 들어가야 검색기능 지원 가능

- 검색어 입력 양식 input 안에 class="form-control" 을 적용하고 있다

- 테이블에도 부트스트랩을 적용해서 테두리있는 표를 만들어준다.

 

jQuery 코드 간략 설명

- $ 는 jQuery 함수를 의미한다, $()대신 jQuery() 라고 써도 된다.

- jQuery 함수는 태그를 구해오는 역할을 한다.

- $(document).ready(function(){}); 는 html 문서의 로딩이 끝나 준비가 되면 안의 내용을 실행시켜라는 의미이다.

- $("#myInput") 은 id값이 myInput 인 태그를 구해와라는 의미, 즉 검색어 입력양식을 구해오는 함수이다.

- $("#myInput").on("keyup", function(){}); 은 keyup 이벤트가 발생하면 안의 내용을 실행시켜라는 의미이다.

- $(this).val().toLowerCase() 는 현재 이벤트가 발생한 태그의 값을 소문자로 변환해서 반환한다.

- $("myTable tr").filter(function(){}); 에서 filter() 함수로 필터기능을 수행한다, 검색된 내용을 테이블에 보여주는 기능을 수행함.

+ 값을 입력하고 손을 떼는 순간 keyup이벤트, 값을 입력하려 키보드를 눌렀을때는 keydown 이벤트가 발생한다.

 

+ 필터 관련 w3school 페이지

 

부트스트랩 사용 예제18

11.Tab

- 토글 탭

- w3school 에서 CSS 부분 아닌 JS Tab 으로 들어가야함

- jQuery 나 JS로 구현해야한다.

ex)

- tab.html

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<div class="container mt-3">
  <h2>Toggleable Tabs</h2>
  <br>
  
  <!-- Nav tabs -->
  <ul class="nav nav-tabs">
    <li class="nav-item">
      <a class="nav-link active" data-toggle="tab" href="#home">Home</a>
    </li>
    <li class="nav-item">
      <a class="nav-link" data-toggle="tab" href="#menu1">회원가입</a>
    </li>
    <li class="nav-item">
      <a class="nav-link" data-toggle="tab" href="#menu2">로그인</a>
    </li>
    <li class="nav-item">
      <a class="nav-link" data-toggle="tab" href="#menu3">게시판</a>
    </li>
  </ul>

  <!-- Tab panes -->
  <div class="tab-content">
    <div id="home" class="container tab-pane active"><br>
      <h3>HOME</h3>
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
    </div>
    <div id="menu1" class="container tab-pane fade"><br>
      <h3>Menu 1</h3>
      <p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
    </div>
    <div id="menu2" class="container tab-pane fade"><br>
      <h3>Menu 2</h3>
      <p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam.</p>
    </div>
    <div id="menu3" class="container tab-pane fade"><br>
      <h3>Menu 3</h3>
      <p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam.</p>
    </div>
  </div>
</div>

</body>
</html>

- <nav> 태그 안의 네비게이션 메뉴들은 주로 ul 태그로 만든다

- <li> 태그 안 <a> 태그안에 href="#home" 으로 하면 그 탭을 눌렀을때 보여줄 내용 div 의 id값이 home 이다.

- 즉 <a> 태그의 href= 값과 타깃이 되는 div id값과 맞춰야한다.

- <li> 태그 안 <a> 태그안에 class="active" 인 탭이 가장 먼저 활성화(선택된) 상태로 나타나고, 그 관련 내용이 아래에 나타난다.

- 내용부분은 <div class="tab-content"> 로 전체를 감싸야하고 각각의 내용들은 div 태그 안에서 class="container tab-pane fade" 를 적용한다.

 

+ Tab은 부트스트랩으로도 만들수 있고 jQuery UI 로도 만들수있다.

 

부트스트랩 사용 예제19

12. Tamplate

- Template : 전체적인 레이아웃을 잡아줌

1. Bootstrap4 의 Tamplate (많이 없다)

ex) Bootstrap3 의 Template

- 템플릿을 가져와서 필요에 맞게 바꿀 수 있다.

- Simply Me 는 개인용 페이지, Company 는 회사용 페이지, Band는 밴드용 페이지 템플릿 지원

- Webpage Try it Yourself 로 들어가보자

- 이 Webpage 가져와서 만들어볼것, 코드 그대로 가져오자

- webpage.html

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
  <style>
    /* Remove the navbar's default margin-bottom and rounded borders */ 
    .navbar {
      margin-bottom: 0;
      border-radius: 0;
    }
    
    /* Set height of the grid so .sidenav can be 100% (adjust as needed) */
    .row.content {height: 450px}
    
    /* Set gray background color and 100% height */
    .sidenav {
      padding-top: 20px;
      background-color: #f1f1f1;
      height: 100%;
    }
    
    /* Set black background color, white text and some padding */
    footer {
      background-color: #555;
      color: white;
      padding: 15px;
    }
    
    /* On small screens, set height to 'auto' for sidenav and grid */
    @media screen and (max-width: 767px) {
      .sidenav {
        height: auto;
        padding: 15px;
      }
      .row.content {height:auto;} 
    }
  </style>
</head>
<body>

<nav class="navbar navbar-inverse">
  <div class="container-fluid">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>                        
      </button>
      <a class="navbar-brand" href="#">Logo</a>
    </div>
    <div class="collapse navbar-collapse" id="myNavbar">
      <ul class="nav navbar-nav">
        <li class="active"><a href="#">Home</a></li>
        <li><a href="#">About</a></li>
        <li><a href="#">Projects</a></li>
        <li><a href="#">Contact</a></li>
      </ul>
      <ul class="nav navbar-nav navbar-right">
        <li><a href="#"><span class="glyphicon glyphicon-log-in"></span> Login</a></li>
      </ul>
    </div>
  </div>
</nav>
  
<div class="container-fluid text-center">    
  <div class="row content">
    <div class="col-sm-2 sidenav">
      <p><a href="#">Link</a></p>
      <p><a href="#">Link</a></p>
      <p><a href="#">Link</a></p>
    </div>
    <div class="col-sm-8 text-left"> 
      <h1>Welcome</h1>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
      <hr>
      <h3>Test</h3>
      <p>Lorem ipsum...</p>
    </div>
    <div class="col-sm-2 sidenav">
      <div class="well">
        <p>ADS</p>
      </div>
      <div class="well">
        <p>ADS</p>
      </div>
    </div>
  </div>
</div>

<footer class="container-fluid text-center">
  <p>Footer Text</p>
</footer>

</body>
</html>

 


프로젝트 시작 (개요)

위의 내용을 응용을 해서 네비게이션에 나타나는 내용을 바꾸자

1. About, Projects, Contact > 게시판, 회원관리, 로그인 으로 변경

2. 각 네비게이션 메뉴를 누르면 맞는 화면이 center영역에 나타도록하자

- 회원가입 버튼을 누르면 회원가입 폼, 로그인을 누르면 로그인 폼, 게시판 누르면 게시판 폼 이 center영역에 나타나도록 하자.

- 공통적으로 들어가는 내용(네비게이션, 푸터) 부분을 고정하고, 본문내용만 바꾸자

- 그것을 위해서 header와 footer를 파일로 만들어서 따로 빼고 jsp의 include 를 통해 넣는 분리작업을 해야한다.

- 상단의 네비게이션 메뉴까지를 따로 파일로 만들자 -> header.jsp

- 하단의 footer 부분을 따로 파일로 만들자 -> footer.jsp

3. header 부분과 footer 부분을 분리

- 헤더부분

- 푸터부분


프로젝트

1. 새로운 프로젝트 myhome 프로젝트를 만들자 

- File-New-Dynamic Web Project

 

2. myhome/WebConent 하위에 index.jsp 라는 파일 생성

- index.html 에는 webpage.html 의 내용을 모두 복붙한다. (맨 위 2줄 jsp부분 제외)

index.jsp

3. index.jsp 내용 수정

- 회원가입, 로그인, 게시판에 링크 연결

- a href= 에 # 대신 index.jsp 와 memberform.jsp, loginform.jsp, boardform.jsp 로 연결한다.

 

4. myhome/Webcontent 에 header.jsp 와 footer.jsp 파일 생성 후 작성

- index.jsp 파일의 header 부분을 잘라서 header.jsp 파일에 복붙

- 기존의 내용은 주석으로 막기

- header와 footer 모듈을 만드는 과정이다.

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
  <style>
    /* Remove the navbar's default margin-bottom and rounded borders */ 
    .navbar {
      margin-bottom: 0;
      border-radius: 0;
    }
    
    /* Set height of the grid so .sidenav can be 100% (adjust as needed) */
    .row.content {height: 450px}
    
    /* Set gray background color and 100% height */
    .sidenav {
      padding-top: 20px;
      background-color: #f1f1f1;
      height: 100%;
    }
    
    /* Set black background color, white text and some padding */
    footer {
      background-color: #555;
      color: white;
      padding: 15px;
    }
    
    /* On small screens, set height to 'auto' for sidenav and grid */
    @media screen and (max-width: 767px) {
      .sidenav {
        height: auto;
        padding: 15px;
      }
      .row.content {height:auto;} 
    }
  </style>
</head>
<body>

<nav class="navbar navbar-inverse">
  <div class="container-fluid">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>                        
      </button>
      <a class="navbar-brand" href="#">Logo</a>
    </div>
    <div class="collapse navbar-collapse" id="myNavbar">
      <ul class="nav navbar-nav">
        <li class="active"><a href="index.jsp">Home</a></li>
        <li><a href="memberform.jsp">회원가입</a></li>
        <li><a href="loginform.jsp">로그인</a></li>
        <li><a href="boardform.jsp">게시판</a></li>
      </ul>
      <ul class="nav navbar-nav navbar-right">
        <li><a href="#"><span class="glyphicon glyphicon-log-in"></span> Login</a></li>
      </ul>
    </div>
  </div>
</nav>

- index.jsp 에서 이 부분을 복사를 하고 , index.jsp 파일 에서는 이 부분을 주석을 막음

- 이 부분을 header.jsp 의 1,2라인을 제외한 곳에 붙여넣기 한다

- header.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
  <style>
    /* Remove the navbar's default margin-bottom and rounded borders */ 
    .navbar {
      margin-bottom: 0;
      border-radius: 0;
    }
    
    /* Set height of the grid so .sidenav can be 100% (adjust as needed) */
    .row.content {height: 450px}
    
    /* Set gray background color and 100% height */
    .sidenav {
      padding-top: 20px;
      background-color: #f1f1f1;
      height: 100%;
    }
    
    /* Set black background color, white text and some padding */
    footer {
      background-color: #555;
      color: white;
      padding: 15px;
    }
    
    /* On small screens, set height to 'auto' for sidenav and grid */
    @media screen and (max-width: 767px) {
      .sidenav {
        height: auto;
        padding: 15px;
      }
      .row.content {height:auto;} 
    }
  </style>
</head>
<body>

<nav class="navbar navbar-inverse">
  <div class="container-fluid">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>                        
      </button>
      <a class="navbar-brand" href="#">Logo</a>
    </div>
    <div class="collapse navbar-collapse" id="myNavbar">
      <ul class="nav navbar-nav">
        <li class="active"><a href="index.jsp">Home</a></li>
        <li><a href="memberform.jsp">회원가입</a></li>
        <li><a href="loginform.jsp">로그인</a></li>
        <li><a href="boardform.jsp">게시판</a></li>
      </ul>
      <ul class="nav navbar-nav navbar-right">
        <li><a href="#"><span class="glyphicon glyphicon-log-in"></span> Login</a></li>
      </ul>
    </div>
  </div>
</nav>

 

5. header.jsp 파일을 index.jsp에서 불러오기

- 마치 그 자리에 있는것처럼 포함됨

<!-- header.jsp 파일 불러오기 -->
<%@ include file="header.jsp" %>

- index.jsp 파일에 이 include 코드를 넣으면 마치 이 자리에 header.jsp의 내용이 있는것 처럼 작동함

- 똑같이 동작함

 

6. footer도 마찬가지로 따로 뽑아서 footer.jsp 파일로 생성

<footer class="container-fluid text-center">
  <p>Footer Text</p>
</footer>

</body>
</html>

- 이 부분을 index.jsp 에서 복사하고 index.jsp 파일에서 이 부분 주석처리

- 이 부분을 footer.jsp에 1,2 라인을 제외한 곳에 복사하기

- footer.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<footer class="container-fluid text-center">
  <p>Footer Text</p>
</footer>

</body>
</html>

 

7. footer.jsp 파일을 index.jsp에서 불러오기

<!-- footer.jsp 파일 불러오기 -->
<%@ include file="footer.jsp" %>

- index.jsp 파일에 이 include 코드를 넣으면 마치 이 자리에 footer.jsp의 내용이 있는것 처럼 작동함

+ 같은 디렉토리 내에 파일이 있으므로 이름만으로 불러올 수 있다.

- 똑같이 동작함

 

index.jsp 현재 코드

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- <!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
  <style>
    /* Remove the navbar's default margin-bottom and rounded borders */ 
    .navbar {
      margin-bottom: 0;
      border-radius: 0;
    }
    
    /* Set height of the grid so .sidenav can be 100% (adjust as needed) */
    .row.content {height: 450px}
    
    /* Set gray background color and 100% height */
    .sidenav {
      padding-top: 20px;
      background-color: #f1f1f1;
      height: 100%;
    }
    
    /* Set black background color, white text and some padding */
    footer {
      background-color: #555;
      color: white;
      padding: 15px;
    }
    
    /* On small screens, set height to 'auto' for sidenav and grid */
    @media screen and (max-width: 767px) {
      .sidenav {
        height: auto;
        padding: 15px;
      }
      .row.content {height:auto;} 
    }
  </style>
</head>
<body>

<nav class="navbar navbar-inverse">
  <div class="container-fluid">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>                        
      </button>
      <a class="navbar-brand" href="#">Logo</a>
    </div>
    <div class="collapse navbar-collapse" id="myNavbar">
      <ul class="nav navbar-nav">
        <li class="active"><a href="index.jsp">Home</a></li>
        <li><a href="memberform.jsp">회원가입</a></li>
        <li><a href="loginform.jsp">로그인</a></li>
        <li><a href="boardform.jsp">게시판</a></li>
      </ul>
      <ul class="nav navbar-nav navbar-right">
        <li><a href="#"><span class="glyphicon glyphicon-log-in"></span> Login</a></li>
      </ul>
    </div>
  </div>
</nav> -->
  
<!-- header.jsp 파일 불러오기 -->
<%@ include file="header.jsp" %>

<div class="container-fluid text-center">    
  <div class="row content">
    <div class="col-sm-2 sidenav">
      <p><a href="#">Link</a></p>
      <p><a href="#">Link</a></p>
      <p><a href="#">Link</a></p>
    </div>
    <div class="col-sm-8 text-left"> 
      <h1>Welcome</h1>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
      <hr>
      <h3>Test</h3>
      <p>Lorem ipsum...</p>
    </div>
    <div class="col-sm-2 sidenav">
      <div class="well">
        <p>ADS</p>
      </div>
      <div class="well">
        <p>ADS</p>
      </div>
    </div>
  </div>
</div>

<!-- footer.jsp 파일 불러오기 -->
<%@ include file="footer.jsp" %>

<!-- <footer class="container-fluid text-center">
  <p>Footer Text</p>
</footer>

</body>
</html> -->

 

8. center에 보여줄 내용인 파일들을 만들기

- 예전에 만들었던 회원가입, 로그인, 게시판 html 폼에서 복붙을 해서 memberform.jsp, loginform.jsp, boardform.jsp 파일 생성

- jsp 태그를 쓰기 위해선 jsp파일을 써야하므로 복붙해서 jsp파일로 만드는 것

- 파일 생성 완료

 

9. memberform.jsp 파일에는 예전에 만들었던 memberform.html 파일 내용을 복사해서 1,2라인을 제외한 곳에 붙여넣기

+ 1,2 라인은 인코딩 관련 내용이므로 빠지면 안된다.

- 현재 memberform.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입 폼</title>
</head>
<body>

<form method="post" action="member.jsp">
<table border=1 width=600 align=center>
	<caption>회원 가입폼</caption>
	<tr>
		<th>ID</th>
		<td><input type=text name="id" id="id" autofocus="autofocus">
			<input type="button" value="ID중복검사">
		</td>
	</tr>
	<tr>
		<th>비밀번호</th>
		<td><input type=password name="passwd" id="passwd">
		</td>
	</tr>
	<tr>
		<th>성명</th>
		<td><input type=text name="name" id="name">
		</td>
	</tr>
	<tr>
		<th>주민번호</th>
		<td><input type=text size=6 maxlength=6 name="jumin1" id="jumin1">-
			<input type=text size=7 maxlength=7 name="jumin2" id="jumin2">
		</td>
	</tr>
	<tr>
		<th>E-Mail</th>
		<td><input type=text size=10 name="mailid" id="mailid">@
			<input type=text size=15 name="domain" id="domain">
			<select>
				<option value="">직접입력</option>
				<option value="naver.com">네이버</option>
				<option value="daum.net">다음</option>
				<option value="nate.com">네이트</option>
				<option value="gmail.com">구글</option>
			</select>
		</td>
	</tr>
	<tr>
		<th>전화번호</th>
		<td>
			<input type=text size=4 maxlength=4 name="tel1" id="tel1">-
			<input type=text size=4 maxlength=4 name="tel2" id="tel2">-
			<input type=text size=4 maxlength=4 name="tel3" id="tel3">
		</td>
	</tr>
	<tr>
		<th>핸드폰</th>
		<td><select name="phone1" id="phone1">
				<option value="">번호선택</option>
				<option value="010">010</option>
				<option value="011">011</option>
				<option value="016">016</option>
				<option value="018">018</option>
				<option value="019">019</option>
			</select>-
			<input type=text size=4 maxlength=4 name="phone2" id="phone2">-
			<input type=text size=4 maxlength=4 name="phone3" id="phone3">
		</td>
	</tr>
	<tr>
		<th>우편번호</th>
		<td><input type=text size=5 maxlenth=5 name="post" id="post">
			<input type="button" value="우편검색">
		</td>
	</tr>
	<tr>
		<th>주소</th>
		<td><input type=text size=70 name="address" id="address">
		</td>
	</tr>
	<tr>
		<th>성별</th>
		<td><input type="radio" name="gender" value="남자">남자
			<input type="radio" name="gender" value="여자">여자
		</td>
	</tr>
	<tr>
		<th>취미</th>
		<td><input type="checkbox" name="hobby" value="공부" checked="checked">공부
			<input type="checkbox" name="hobby" value="등산">등산
			<input type="checkbox" name="hobby" value="게임">게임
			<input type="checkbox" name="hobby" value="낚시">낚시
			<input type="checkbox" name="hobby" value="쇼핑">쇼핑
		</td>
	</tr>
	<tr>
		<th>자기소개</th>
		<td><textarea rows="5" cols="70"
				name="intro" id="intro"
				placeholder="자기소개를 100자 이내로 입력하세요"></textarea>
		</td>
	</tr>
	<tr>
		<td colspan=2 align=center>
			<input type="submit" value="회원가입">
			<input type="reset" value="취소">
			
			<!-- 이미지 버튼 : 전송 기능 있음 -->
			<input type="image" src="img/clock.jpg" width=30>
		</td>
	</tr>
</table>
</form>

</body>
</html>

 

10. loginform.jsp 파일에는 예전에 만들었던 loginform.html 파일 내용을 복사해서 1,2라인을 제외한 곳에 붙여넣기

- 현재 loginform.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 폼</title>
</head>
<body>

<!-- 
method : 값을 전달하는 방식을 설정 : get, post
action : 값이 전달될 파일을 설정
-->

<form method="get" action="login.jsp">
<table border=1 width=350 align=center>
	<caption>로그인</caption>
	<tr>
		<td>ID</td>
		<td><input type=text size=20
							 maxlength=10
							 autofocus="autofocus"
							 required="required"
							 name="id"
							 id="id">
		</td>
	</tr>
	<tr>
		<td>비밀번호</td>
		<td><input type=password size=20
								 required="required"
								 name="passwd"
								 id="passwd"></td>
	</tr>
	<tr>
		<td colspan=2 align=center>
			<input type=submit value="로그인"><!-- 전송기능이 있는 버튼 -->
			<input type=reset value="취소"><!-- 초기화 버튼 -->
		</td>
	</tr>
</table>
</form>

</body>
</html>

 

11. boardform.jsp 파일에는 예전에 만들었던 boardform.html 파일 내용을 복사해서 1,2라인을 제외한 곳에 붙여넣기

- 현재 boardform.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판</title>
</head>
<body>

<form method="post" action="board.jsp">
<table border=1 width=500 align=center>
	<caption>게시판</caption>
	<tr>
		<th>작성자</th>
		<td><input type=text size=20 name="writer"
									 id="writer"
									 placeholder="작성자명 입력"
									 value="lay">
		</td>
	</tr>
	<tr>
		<th>비밀번호</th>
		<td><input type=password size=20 name="passwd"
									     id="passwd"
									     placeholder="2~8자 이내 입력">
		</td>
	</tr>
	<tr>
		<th>제목</th>
		<td><input type=text size=50 name="subject"
									 id="subject"
									 placeholder="50자 이내로 입력">
		</td>
	</tr>
	<tr>
		<th>내용</th>
		<td><textarea rows="5" cols="50" name="content"
				id="content" placeholder="200자 이내로 입력">내용입력</textarea>
		</td>
	</tr>
	<tr>
		<th>파일첨부</th>
		<td><input type=file name="myfile" id="myfile">
		</td>
	</tr>
	<tr>
		<td colspan=2 align=center>
			<input type="submit" value="글작성1"><!-- 전송기능 있는 버튼 -->
			<input type="button" value="글작성2"><!-- 전송기능 없는 버튼 -->
			
			<button>글작성3</button><!-- 전송기능 있는 버튼 -->
			<button type="submit">글작성4</button><!-- 전송기능 있는 버튼 -->
			<button type="button">글작성5</button><!-- 전송기능 없는 버튼 -->
			
			<input type="reset" value="취소"><!-- 초기화 버튼 -->
			<button type="reset">초기화</button><!-- 초기화 버튼 -->
		</td>
	</tr>
</table>
</form>

</body>
</html>

 

12. index.jsp 실행하기

- 회원가입 메뉴를 누르면

- 로그인 메뉴를 누르면

- 폼은 출력되지만 header 와 footer 부분이 안나온다

- 각 jsp 파일에 header, footer 부분을 include해서 불러온다.

 

13. memberform.jsp 파일에서 header.jsp 와 footer.jsp 파일 불러오기

<!-- header.jsp 파일 불러오기 -->
<%@ include file="header.jsp" %>

- memberform.jsp 위쪽 부분에 include 함

<!-- footer.jsp 파일 불러오기 -->
<%@ include file="footer.jsp" %>

- memberform.jsp 아래쪽 부분에 include 함

 

- index.jsp 파일을 실행하고 회원가입 메뉴를 누르면 헤더와 푸터 부분이 나오고 센터에 회원가입 폼이 나온다

- 회원가입 메뉴를 누르면 뜨는 창

 

13. loginform.jsp 파일과 boardform.jsp 파일에서도 header.jsp 와 footer.jsp 파일 불러오기

- 로그인 메뉴를 누르면 뜨는 창

- 게시판 메뉴를 누르면 뜨는 창

 

+ Home 메뉴를 누르면 index.jsp 가 실행됨

.

13. myhome 프로젝트를 Export 해보자

- Dynamic Web Project는 Export 기능이 있다.

- Export시 .war 파일로 압축되어 1개의 파일이 된다.

- 이걸로 프로젝트를 집에 가져가거나 다른 시스템으로 export 가능

- 현재 프로젝트명.war 로 프로젝트가 압축됨 (알집, 반디집등으로 압축해제 가능)

 

+ web 프로젝트부터 .war로 압축해보자 (export)

- 어디에 저장할건지 저장위치 설정

- 소스파일도 export 하고 동일파일이 있으면 overwrite하도록 체크했다

- web.war 가 생성되었다

+ 배포할때도 이런방식으로 배포한다.

 

+ web.war를 import 해보자 (불러오자)

- 집으로 와서 이 파일을 import

- 이렇게 import 가능하다

- 또는 File-Import... 에서

- 이렇게 들어가도 된다.

+ 이미 web 프로젝트가 있으므로 import할때는 다른이름으로 import하자 (동일 이름 프로젝트 만들지 않기위해)

- web과 똑같은 내용의 web1이 생긴다.

- 삭제할땐 delete를 누르고 반드시 체크를 해야 깔끔하게 지워진다.

 

14. Export 한 myhome 프로젝트를 아파치 톰캣에 배포

- 이제 myhome 프로젝트를 .war로 압축해서 export하고 아파치 톰캣에 배포해보자.

- 저장 위치는 바탕화면으로 설정했다.

- 확장자는 .war란 압축파일

- 배포하기 위해 이 .war를 압축해제하자 (반디집 사용)

- 이 파일들을 아파치 톰캣의 홈디렉토리인 ROOT 디렉토리에 넣으면 서비스 할 수 있다.

- 이클립스 종료 시키고(개발환경 끝) 아파치 톰캣을 구동시키자

- 서비스를 하기 위해 아파치 톰캣 서버를 구동

- 개발을 위해 중지했던 아파치 톰캣 서버를 시작하자.

- 웹 브라우저를 켜서 아파티 톰캣 서버 테스트 localhost 

- 아파치 톰캣 설치시에 80 포트로 했으므로 클라이언트 요청시 80 포트 생략 가능 (conf/server.xml 에서 볼 수 있다)

- 고양이 페이지는 ROOT 홈디렉토리의 index.jsp 가 실행되고 있는 것이다

- 아파치 톰캣이 설치된 C:\Program Files\Apache Software Foundation\Tomcat 9.0

- C:\Program Files\Apache Software Foundation\Tomcat 9.0\webapps\ROOT 가 홈 디렉토리이다.

- ROOT 안 기존 내용을 지우고 우리가 만들었던 myhome.war 압축 푼 내용을 ROOT 안에 복붙하자.

- 그러면 우리가 만든 컨텐츠를 서비스 할 수 있다.

- 이제 localhost를 주소창에 치면 우리가 만든 컨텐츠가 나온다.

- 배포 완료!

- 나중에 아마존에서 배포할떄도 같은 방식을 사용한다.

 

+ 배포 추가

- 현재는 사설 ip이므로 다른 컴에서 접근 불가능하다

- 항상 켜져있는 서버와 공인 ip가 필요하다

- 웹호스팅 신청이나 aws 를 이용해야함

 

+ 개발과 프로젝트

- 개발시에는 프로젝트 myhome이 필요했지만

- 배포시에는 안의 내용들을 복붙해서 옮겼다

- 즉 프로젝트는 개발시에 필요한 것이다.

 

+ 다음 Javascript 수업을 위해 개발환경으로 돌아가야 하므로 아파치 톰캣 중지

 

+ 개인 프로젝트시에 아이콘이 필요하면 Bootstrap3 Glyphicons에서 사용 가능.


Javascript

 

Javascript

- 자바는 다용도로 활용되지만 Javascript는 HTML에 추가되어 웹상에서만 사용 가능하다.

- 역할 : 유효성 검사, 여러 동적인 이벤트를 처리, 팝업창 등

- Javascript 라이브러리 프레임워크 : jQuery, React, Vue 등

- jQuery 는 Javascript 라이브러리 함수형태로 지원

- 자주쓰는 기능과 폼 관련 

 

실습 준비

1. web/WebContent 폴더 하위에 javascript 폴더를 생성하고 그 javascript 폴더 하위에 work 폴더 생성

2. first.html 파일 생성

- javascript도 html 코드 안에 추가해서 사용한다.

 

3. script 태그를 써서 알려줘야한다.

- html 파일 내에서 javascript를 쓰려면 javascript라는 것을 브라우저에게 알려줘야한다

- script 태그는 head 태그안에 써도 되고 body 태그 안에 써도 된다

- 다만, 함수를 만들때는 script 태그는 가능한한 head 태그안에 쓰자

+ javascript는 인터프리트 언어 이므로 함수 위치가 중요, body 태그에서 함수를 호출해야하므로 script 태그는 head 태그안에 넣기

+ javascript : 객체 기반 언어 (완전한 객체 지향 언어가 아니다) / java : 객체 지향 언어

- 내장 객체 중 document 객체를 불러와야함, 그냥 자바라고 쓰면 실행시 아무것도 안뜬다

- javascript에서 처음 지원하는 내장 객체가 document고 그 함수 중 write를 쓰면 출력해준다.

- 문서와 관련된 내장객체인 document 를 이용해야만 출력이 가능하다

4. 자바스크립트 문법 특성

- javascript는 문법이 느슨하다.

- ; 를 쓰지 않아도 실행됨

- javascript에서는 문자 출력시 " "(쌍따옴표) 를 써도 되고 ' ' (외따옴표) 를 써도 된다.( 자바는 쌍따옴표만 가능)

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<script>
	document.write('처음 작성하는 자바스크립트1');
	document.write("처음 작성하는 자바스크립트2");
</script>

</body>
</html>

- 줄이 바뀌지 않는다

- writeln 을 사용해도 줄이 바뀌지 않는다.

- br 태그나 p 태그를 써야 줄바꿈 가능하다

 

- br 태그를 그냥 쓰면 오류 발생

- 쌍따옴표나 외따옴표 안에 무엇이든 써야한다.

- <br> 이나 <p>를 쌍따옴표나 외따옴표 안에 써야한다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<script>
	document.write('처음 작성하는 자바스크립트1<br>'); 
	document.write("처음 작성하는 자바스크립트2"+"<br>");
	document.write("처음 작성하는 자바스크립트3"+'<br>');
</script>

</body>
</html>

 

+ head 태그안에 <script> 내용을 넣어도 똑같다

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
	document.write('처음 작성하는 자바스크립트1<br>'); 
	document.write("처음 작성하는 자바스크립트2"+"<br>");
	document.write("처음 작성하는 자바스크립트3"+'<br>');
</script>
</head>
<body>

</body>
</html>

 

+ javascript 에러 확인 : F12 개발자 도구

 

자바 스크립트 선언 방식

1. <script> </script>

2. <script> 를 작성할때 <script type="text/javascript>

<script type="text/javascript">
	document.write('처음 작성하는 자바스크립트1<br>'); 
</script>

3. 

<script language="javascript">
document.write('처음 작성하는 자바스크립트5<br>'); 
</script>

 

2. 콘솔창에서 출력할때는 colsole.log() 로 출력

 

- 브라우저가 아닌 콘솔창에 출력

<script language="javascript">
	document.write('처음 작성하는 자바스크립트5<br>');
	console.log('콘솔에 출력됨');
</script>

- 브라우저에는 console.log() 안의 내용이 출력되지 않는다.

- F12 개발자 도구에서 Console 을 누르면 확인 가능하다.

 

 

자바스크립트 주석

- 자바와 동일하다

1. 단일행 주석 : //
2. 다중행 주석 : /* ~ */
+ 주석 단축키 : Ctrl + Shift + /

 

- first.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<!-- 자바스크립트 주석
	1. 단일행 주석 : //
	2. 다중행 주석 : /* ~ */
	주석 단축키 : Ctrl + Shift + /
-->

<script>
	document.write('처음 작성하는 자바스크립트1<br>'); 
	document.write("처음 작성하는 자바스크립트2"+"<br>");
	document.write("처음 작성하는 자바스크립트3"+'<br>');
</script>

<script type="text/javascript">
	document.write('처음 작성하는 자바스크립트4<br>'); 
</script>

<script language="javascript">
 	document.write('처음 작성하는 자바스크립트5<br>');
	console.log('콘솔에 출력됨');
</script>

</body>
</html>

 

출력하는 방법

1. 브라우저로 출력할때는 document.write() 로 출력한다. (위에서 했음)

2. 콘솔창에서 출력할때는 colsole.log() 로 출력한다 (위에서 했음)

3. alert() 으로 메세지 박스로 메세지를 출력한다.

- 유효성 검사할때 메세지 출력이 필요하면 주로 alert()으로 출력을 한다.

 

3. alert() 으로 메세지를 출력

- WebContent/javascript/work 안에 alert.html 파일 생성

- alert.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<script>
	document.write("출력성공1<br>");	// 브라우저에 출력
	document.write("출력성공2<br>");
	console.log("콘솔창에 출력");	// 콘솔창에 출력 : 단축키(F12)
</script>

<script>
	alert("경고창 출력")	// 메세지 박스
	alert("이름을 입력하세요.")
</script>

</body>
</html>

- 현재는 경고창에 '확인'만 나온다

- alert이 우선순위가 높으므로 가장 먼저 출력

- 브라우저 최상위 객체인 window 에서 alert() 를 지원

 

 

 

자바스크립트 구조1

- 자바스크립트는 내장객체가 지원되는 언어이다.

- 내장 객체는 이미 자바스크립트 설계시부터 있어서 그냥 쓸 수있는 객체이다.

- window 객체는 브라우저 관련 최상위 객체

- window 객체를 상속받는 하위 객체는 document 객체(문서관련 최상위 객체), location 객체, history 객체, screen 객체, navigator 객체가 있다.

- document 객체를 상속받는 form 객체와 image 객체가 있다

- form 객체 하위 객체들은 button, submit, reset, radio 등...

 

자바스크립트 구조2

- 객체 사용시엔 최상위 객체부터 . 으로 연결해서 써야한다

- window 객체는 이떄 생략 가능 (window 객체 함수는 주로 팝업창 띄우기, 닫기 등)

ex) 원칙적으로는 window.document.write() 로 써야하지만 window 는 생략 가능

- 객체들은 모두 소문자이고 대소문자 구분한다.

- alert()은 window 객체에서 지원되는 메소드명 window.alert() 이지만 window 생략 가능

+ Javascript는 내장객체 api 문서가 없다, 정리된 자료를 찾아야함.

<script>
	window.alert("경고창 출력")	// 메세지 박스
	alert("이름을 입력하세요.")
</script>

 

객체의 구조

- 객체에는 특성들이 있다 (= 자바의 필드)

- 객체에는 메소드들이 있다 

ex) window 객체의 alert() -> window.alert() 처럼 객체명.메소드명() 으로 쓴다.

ex) window 객체의 confirm() 에서는 확인을 받기 위한 대화상자를 출력해준다.

ex) window 객체의 open() : 윈도우 열어줌 / close() : 윈도우 닫아줌

CSS배경 속성

- 배경 이미지 불러오기 등 배경 이미지와 관련된 속성들

- background-image : 배경 이미지 불러옴

- background-size : 배경 이미지 크기

- background-repeat : 배경 이미지 반복형태

- background-attachment : 배경 이미지를 화면에 부착시킬건지

- background : 이런것들을 한꺼번에 적용

 

배경 불러오기 속성

- background-image 속성으로 배경 이미지 불러옴

- 값으로 url 적기

 

배경 불러오기 예제

- background_image.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        body {
            background-image: url('BackgroundFront.png');
        }
    </style>
</head>
<body>

</body>
</html>

- CSS로 <body> 태그에 대해 배경 이미지를 불러오고 있다

- CSS를 쓰지 않고 HTML 만으로 쓰려면 <body> 태그 안에 background 속성을 쓴다

- 같은 폴더 안에 BackgroundFront.png 가 있으므로 이름만으로 이미지를 불러올 수 있다.

background_image.html 출력

- repeat 가 기본속성이어서, 이미지 크기가 작은 경우엔 반복된다

 

두 장의 배경 이미지 불러오기

- background-image의 값에서 url 을 , 으로 연결해줌

 

두 장의 배경 이미지 불러오기 예제

- background_imageLayer.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        body {
        	/* 각각의 그림을 레이어라고 부릅니다. */
            background-image: url('BackgroundFront.png'), url('BackgroundBack.png');
        }
    </style>
</head>
<body>

</body>
</html>

 

배경 이미지 너비와 높이 조절 속성

- background-size 속성 으로 조절

- background-size 설정 안하면 기본 크기로 나타남

- background-size의 값이 1개일때는, 가로(너비) 만 설정하는 것

- background-size의 값이 2개일때는, 너비, 높이 순서대로이다.

 

배경 이미지 너비와 높이 조절 예제

1. 너비(가로) 설정

-  background_size.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        body {
            background-image: url('BackgroundFront.png'), url('BackgroundBack.png');
            background-size: 100%; /* 배경 이미지의 너비(가로) */
        }
    </style>
</head>
<body>

</body>
</html>

- background-size : 100%는 가로로 브라우저에 꽉 찬 상태를 의미한다.

- background-size : 80%로 설정시 가로 80%만큼 채우고 남은 부분은 반복시킴

- 즉, background-size 속성 은 한개의 값만 설정시 배경이미지의 가로(너비) 만 설정하는 것임

 

1. 높이(세로) 설정

- 1개의 값을 더 부여하면 높이가 됨

- background_sizeEach.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        body {
            background-image: url('BackgroundFront.png'), url('BackgroundBack.png');
            /* 배경 이미지의 너비(가로) 높이(세로) */
            background-size: 100% 250px;
        }
    </style>
</head>
<body>

</body>
</html>

- 이렇게 background-size의 값이 2개가 왔을때는 각각 너비, 높이 가 된다

- 값은 % 비율로 설정할 수도 있고 절대값으로 설정할 수도 있다

- 이미지 높이가 작아서 같은 이미지가 여러번 반복됨

 

배경 이미지 반복 유무 속성

- 크기가 맞지 않을때 배경 이미지가 반복된다.

- 반복여부와 반복 방식을 background-repeat 속성으로 제어

 

1. 반복을 하지 않을때

-  background-repeat : no-repeat;

 

2. 반복을 할 때

- background-repeat : repeat;

- 기본값은 repeat이므로 background-repeat을 설정하지 않으면 반복된다.

 

+ 반복 방향 설정

- x방향으로 반복할건지 y방향으로 반복할건지 설정 가능

- repeat-x : x축 방향으로만 이미지 반복

- repeat-y : y축 방향으로만 이미지 반복

 

 

배경 이미지 반복 유무 속성 예제1

- 1. 반복을 하지 않을때

- background_repeatNone.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        body {
            background-image: url('BackgroundFront.png'), url('BackgroundBack.png');
            background-size: 100%;
            background-repeat: no-repeat;  
        }
    </style>
</head>
<body>

</body>
</html>

- background-repeat : no-repeat; 이므로 반복하지 않는다.

- 반복 없이 1번만 출력하고 있다

 

배경 이미지 반복 유무 속성 예제2

2. 반복을 할 때

- y축 방향으로만 반복하기 예제 (이전 코드 수정)

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        body {
            background-image: url('BackgroundFront.png'), url('BackgroundBack.png');
            background-size: 100%;
            background-repeat: repeat-y;  
        }
    </style>
</head>
<body>

</body>
</html>

- y축(세로) 방향으로만 반복하고 있다

- 가로 너비 100%이므로 가로는 꽉 채워서 나오는 것

 

스크롤링시 배경이미지 같이 스크롤링 할 것인지 고정할 것인지 설정하는 속성

- background-attachment 속성 으로 제어

- 내용이 많이 들어있을때 스크롤링을 하게되는데, 이때 배경 이미지를 같이 움직일건지, 고정하고 내용만 움직일건지 설정

- 속성값 : scroll, fixed

 

스크롤링시 배경이미지 같이 스크롤링 할 것인지 고정할 것인지 설정하는 속성 예제1

1. 배경이미지를 같이 스크롤링

- background_attachmentScroll.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        body {
            background-color: #E7E7E8;
            background-image: url('BackgroundFront.png'), url('BackgroundBack.png');
            background-size: 100%;
            background-repeat: no-repeat;
            background-attachment: scroll;  /* 배경 이미지 스크롤링 */
        }
    </style>
</head>
<body>
    <h1>Lorem ipsum dolor sit amet</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec facilisis enim vitae est elementum euismod. Duis lobortis euismod nunc a dapibus. Proin nulla enim, adipiscing ac pharetra quis, vehicula a mauris. Maecenas nec tellus metus. Fusce sollicitudin facilisis orci, vel fringilla nisi molestie lobortis. Suspendisse dapibus dapibus semper. Duis ac purus nulla. Quisque elementum nibh non ipsum feugiat placerat. Cras tristique urna non urna hendrerit lacinia. Pellentesque porta velit ut felis faucibus in mollis purus malesuada. Duis porta, nulla sed suscipit elementum, arcu mi consectetur enim, id auctor risus enim a metus. Phasellus lorem quam, suscipit a congue vel, viverra eu nisi. Mauris ac felis lorem.</p>
    <p>Suspendisse convallis orci a justo gravida et fringilla nulla commodo. Morbi laoreet ante quis massa ullamcorper quis viverra leo semper. Donec velit mauris, sodales ut interdum eget, imperdiet vel tellus. Aenean tincidunt feugiat ipsum, sit amet placerat nunc venenatis eget. Sed iaculis ultricies enim. Praesent sed libero diam. Quisque eu ante ultrices enim vulputate laoreet. Ut vitae elit nisi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas gravida erat ut est rhoncus pulvinar.</p>
    <p>Vestibulum mollis, ipsum eu ultrices commodo, metus mi tristique leo, at lacinia magna mi non justo. Suspendisse consequat, justo dictum scelerisque rutrum, mi massa placerat enim, in dictum dolor tellus vel justo. Suspendisse molestie dapibus augue quis cursus. Fusce volutpat, sapien eget fermentum congue, turpis est convallis urna, ac cursus diam ligula eu orci. Donec libero lacus, venenatis ac tempus sit amet, pretium in purus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent dapibus aliquam nisi a venenatis. Mauris porttitor purus ut felis dapibus et adipiscing ante bibendum. Aenean rutrum leo lorem.</p>
    <p>Fusce ante augue, rutrum sit amet malesuada nec, accumsan et metus. Duis eros est, fermentum sit amet posuere a, venenatis in est. Nulla scelerisque turpis a magna tincidunt placerat. Nullam vehicula arcu eu massa cursus scelerisque. Sed vitae volutpat elit. Sed tincidunt est at ipsum porttitor ut luctus metus accumsan. Cras sollicitudin eros quis quam adipiscing quis tempus tortor lacinia. Vestibulum sit amet odio tortor, ut molestie dolor. Aliquam erat volutpat. Integer malesuada sem non velit molestie sed adipiscing risus feugiat. Ut ullamcorper, velit sed facilisis lacinia, ante odio laoreet mauris, nec tempor lectus ipsum non dui. Suspendisse porta convallis sem, in consectetur risus porta a. Cras dignissim velit eu urna aliquam varius. Nullam tempus scelerisque metus non ultrices.</p>
    <p>Duis non orci erat. Mauris at dolor dolor. Nam porta placerat magna at posuere. Mauris at metus nisi, ut sodales nulla. Duis felis eros, lacinia id ultricies at, rhoncus non mi. Proin est arcu, vehicula nec tempus vel, cursus ac neque. In nec mauris velit. Sed tincidunt dapibus nibh, quis accumsan dui rhoncus vitae. Quisque convallis convallis lacus ut tempor. Duis vehicula ligula sit amet eros vestibulum tempor sit amet et leo. Praesent pellentesque accumsan iaculis. Fusce quis libero nisl, nec cursus nisi. Praesent auctor venenatis pulvinar. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sit amet odio vel nisi scelerisque sagittis sit amet a dui. Nullam scelerisque libero at nibh placerat hendrerit.</p>
</body>
</html>

- 스크롤링시 배경이미지도 같이 스크롤링 된다 (움직인다)

- 스크롤을 아래로 내리면 배경이미지(산 그림) 이 없어진 것을 보고 움직였음을 알 수 있다.

 

스크롤링시 배경이미지 같이 스크롤링 할 것인지 고정할 것인지 설정하는 속성 예제2

2. 배경이미지를 고정

- background_attachmentFixed.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        body {
            background-color: #E7E7E8;
            background-image: url('BackgroundFront.png'), url('BackgroundBack.png');
            background-size: 100%;
            background-repeat: no-repeat;
            background-attachment: fixed; /* 배경 이미지 고정 */
        }
    </style>
</head>
<body>
    <h1>Lorem ipsum dolor sit amet</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec facilisis enim vitae est elementum euismod. Duis lobortis euismod nunc a dapibus. Proin nulla enim, adipiscing ac pharetra quis, vehicula a mauris. Maecenas nec tellus metus. Fusce sollicitudin facilisis orci, vel fringilla nisi molestie lobortis. Suspendisse dapibus dapibus semper. Duis ac purus nulla. Quisque elementum nibh non ipsum feugiat placerat. Cras tristique urna non urna hendrerit lacinia. Pellentesque porta velit ut felis faucibus in mollis purus malesuada. Duis porta, nulla sed suscipit elementum, arcu mi consectetur enim, id auctor risus enim a metus. Phasellus lorem quam, suscipit a congue vel, viverra eu nisi. Mauris ac felis lorem.</p>
    <p>Suspendisse convallis orci a justo gravida et fringilla nulla commodo. Morbi laoreet ante quis massa ullamcorper quis viverra leo semper. Donec velit mauris, sodales ut interdum eget, imperdiet vel tellus. Aenean tincidunt feugiat ipsum, sit amet placerat nunc venenatis eget. Sed iaculis ultricies enim. Praesent sed libero diam. Quisque eu ante ultrices enim vulputate laoreet. Ut vitae elit nisi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas gravida erat ut est rhoncus pulvinar.</p>
    <p>Vestibulum mollis, ipsum eu ultrices commodo, metus mi tristique leo, at lacinia magna mi non justo. Suspendisse consequat, justo dictum scelerisque rutrum, mi massa placerat enim, in dictum dolor tellus vel justo. Suspendisse molestie dapibus augue quis cursus. Fusce volutpat, sapien eget fermentum congue, turpis est convallis urna, ac cursus diam ligula eu orci. Donec libero lacus, venenatis ac tempus sit amet, pretium in purus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent dapibus aliquam nisi a venenatis. Mauris porttitor purus ut felis dapibus et adipiscing ante bibendum. Aenean rutrum leo lorem.</p>
    <p>Fusce ante augue, rutrum sit amet malesuada nec, accumsan et metus. Duis eros est, fermentum sit amet posuere a, venenatis in est. Nulla scelerisque turpis a magna tincidunt placerat. Nullam vehicula arcu eu massa cursus scelerisque. Sed vitae volutpat elit. Sed tincidunt est at ipsum porttitor ut luctus metus accumsan. Cras sollicitudin eros quis quam adipiscing quis tempus tortor lacinia. Vestibulum sit amet odio tortor, ut molestie dolor. Aliquam erat volutpat. Integer malesuada sem non velit molestie sed adipiscing risus feugiat. Ut ullamcorper, velit sed facilisis lacinia, ante odio laoreet mauris, nec tempor lectus ipsum non dui. Suspendisse porta convallis sem, in consectetur risus porta a. Cras dignissim velit eu urna aliquam varius. Nullam tempus scelerisque metus non ultrices.</p>
    <p>Duis non orci erat. Mauris at dolor dolor. Nam porta placerat magna at posuere. Mauris at metus nisi, ut sodales nulla. Duis felis eros, lacinia id ultricies at, rhoncus non mi. Proin est arcu, vehicula nec tempus vel, cursus ac neque. In nec mauris velit. Sed tincidunt dapibus nibh, quis accumsan dui rhoncus vitae. Quisque convallis convallis lacus ut tempor. Duis vehicula ligula sit amet eros vestibulum tempor sit amet et leo. Praesent pellentesque accumsan iaculis. Fusce quis libero nisl, nec cursus nisi. Praesent auctor venenatis pulvinar. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sit amet odio vel nisi scelerisque sagittis sit amet a dui. Nullam scelerisque libero at nibh placerat hendrerit.</p>
</body>
</html>

- 배경이미지 고정하려면 background-attachment : fixed; 속성값을 준다.

- 스크롤링 해도 배경 이미지는 고정되어있다 

- 아래로 스크롤링해도 산 모양이 계속 나옴을 통해 배경 이미지는 움직이지 않음을 알 수 있음.

 

배경 이미지 위치 설정 속성

- backgrount-position 속성으로 설정함

- 한쪽방향으로만 위치를 설정할 수도 있고, x축, y축에서 떨어진 간격을 통해 위치를 설정할 수도 있다.

- 위쪽에 배치시 top, 아래쪽에 배치시 bottom, 왼쪽에 배치시 left, 오른쪽에 배치시 right 

- 반복이 안되도록 no-repeat 이어야만 위치 설정 가능함, 반복이 되면 위치 제어 불가

 

배경 이미지 위치 설정 속성 예제1

1. 한쪽방향으로만 위치를 설정

- background-positionBottom.html

- 배경 이미지를 브라우저 하단에 배치하는 예제

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        body {
            background-color: #E7E7E8;
            background-image: url('BackgroundFront.png'), url('BackgroundBack.png');
            background-size: 100%;
            background-repeat: no-repeat;
            background-attachment: fixed;
            background-position: bottom;
        }
    </style>
</head>
<body>
    <h1>Lorem ipsum dolor sit amet</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec facilisis enim vitae est elementum euismod. Duis lobortis euismod nunc a dapibus. Proin nulla enim, adipiscing ac pharetra quis, vehicula a mauris. Maecenas nec tellus metus. Fusce sollicitudin facilisis orci, vel fringilla nisi molestie lobortis. Suspendisse dapibus dapibus semper. Duis ac purus nulla. Quisque elementum nibh non ipsum feugiat placerat. Cras tristique urna non urna hendrerit lacinia. Pellentesque porta velit ut felis faucibus in mollis purus malesuada. Duis porta, nulla sed suscipit elementum, arcu mi consectetur enim, id auctor risus enim a metus. Phasellus lorem quam, suscipit a congue vel, viverra eu nisi. Mauris ac felis lorem.</p>
    <p>Suspendisse convallis orci a justo gravida et fringilla nulla commodo. Morbi laoreet ante quis massa ullamcorper quis viverra leo semper. Donec velit mauris, sodales ut interdum eget, imperdiet vel tellus. Aenean tincidunt feugiat ipsum, sit amet placerat nunc venenatis eget. Sed iaculis ultricies enim. Praesent sed libero diam. Quisque eu ante ultrices enim vulputate laoreet. Ut vitae elit nisi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas gravida erat ut est rhoncus pulvinar.</p>
    <p>Vestibulum mollis, ipsum eu ultrices commodo, metus mi tristique leo, at lacinia magna mi non justo. Suspendisse consequat, justo dictum scelerisque rutrum, mi massa placerat enim, in dictum dolor tellus vel justo. Suspendisse molestie dapibus augue quis cursus. Fusce volutpat, sapien eget fermentum congue, turpis est convallis urna, ac cursus diam ligula eu orci. Donec libero lacus, venenatis ac tempus sit amet, pretium in purus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent dapibus aliquam nisi a venenatis. Mauris porttitor purus ut felis dapibus et adipiscing ante bibendum. Aenean rutrum leo lorem.</p>
    <p>Fusce ante augue, rutrum sit amet malesuada nec, accumsan et metus. Duis eros est, fermentum sit amet posuere a, venenatis in est. Nulla scelerisque turpis a magna tincidunt placerat. Nullam vehicula arcu eu massa cursus scelerisque. Sed vitae volutpat elit. Sed tincidunt est at ipsum porttitor ut luctus metus accumsan. Cras sollicitudin eros quis quam adipiscing quis tempus tortor lacinia. Vestibulum sit amet odio tortor, ut molestie dolor. Aliquam erat volutpat. Integer malesuada sem non velit molestie sed adipiscing risus feugiat. Ut ullamcorper, velit sed facilisis lacinia, ante odio laoreet mauris, nec tempor lectus ipsum non dui. Suspendisse porta convallis sem, in consectetur risus porta a. Cras dignissim velit eu urna aliquam varius. Nullam tempus scelerisque metus non ultrices.</p>
    <p>Duis non orci erat. Mauris at dolor dolor. Nam porta placerat magna at posuere. Mauris at metus nisi, ut sodales nulla. Duis felis eros, lacinia id ultricies at, rhoncus non mi. Proin est arcu, vehicula nec tempus vel, cursus ac neque. In nec mauris velit. Sed tincidunt dapibus nibh, quis accumsan dui rhoncus vitae. Quisque convallis convallis lacus ut tempor. Duis vehicula ligula sit amet eros vestibulum tempor sit amet et leo. Praesent pellentesque accumsan iaculis. Fusce quis libero nisl, nec cursus nisi. Praesent auctor venenatis pulvinar. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sit amet odio vel nisi scelerisque sagittis sit amet a dui. Nullam scelerisque libero at nibh placerat hendrerit.</p>
</body>
</html>

- 배경 이미지(산 그림)가 하단 영역에 나타난다

 

배경 이미지 위치 설정 속성 예제2

2. 한쪽방향으로만 위치를 설정

- 방금은 한쪽 방향(y축방향)으로만 위치를 설정했지만 정교한 위치 설정을 하려면 x축, y 축 다 설정 가능

- x축 떨어진 간격, y축 떨어진 간격을 통해 위치를 설정 가능

- background_positionEach.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        body {
            font-family:
            background-color: #E7E7E8;
            background-image: url('BackgroundFront.png'), url('BackgroundBack.png');
            background-size: 100%;
            background-repeat: no-repeat;
            background-attachment: fixed;
            background-position: 0px 50%;
        }
    </style>
</head>
<body>
    <h1>Lorem ipsum dolor sit amet</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec facilisis enim vitae est elementum euismod. Duis lobortis euismod nunc a dapibus. Proin nulla enim, adipiscing ac pharetra quis, vehicula a mauris. Maecenas nec tellus metus. Fusce sollicitudin facilisis orci, vel fringilla nisi molestie lobortis. Suspendisse dapibus dapibus semper. Duis ac purus nulla. Quisque elementum nibh non ipsum feugiat placerat. Cras tristique urna non urna hendrerit lacinia. Pellentesque porta velit ut felis faucibus in mollis purus malesuada. Duis porta, nulla sed suscipit elementum, arcu mi consectetur enim, id auctor risus enim a metus. Phasellus lorem quam, suscipit a congue vel, viverra eu nisi. Mauris ac felis lorem.</p>
    <p>Suspendisse convallis orci a justo gravida et fringilla nulla commodo. Morbi laoreet ante quis massa ullamcorper quis viverra leo semper. Donec velit mauris, sodales ut interdum eget, imperdiet vel tellus. Aenean tincidunt feugiat ipsum, sit amet placerat nunc venenatis eget. Sed iaculis ultricies enim. Praesent sed libero diam. Quisque eu ante ultrices enim vulputate laoreet. Ut vitae elit nisi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas gravida erat ut est rhoncus pulvinar.</p>
    <p>Vestibulum mollis, ipsum eu ultrices commodo, metus mi tristique leo, at lacinia magna mi non justo. Suspendisse consequat, justo dictum scelerisque rutrum, mi massa placerat enim, in dictum dolor tellus vel justo. Suspendisse molestie dapibus augue quis cursus. Fusce volutpat, sapien eget fermentum congue, turpis est convallis urna, ac cursus diam ligula eu orci. Donec libero lacus, venenatis ac tempus sit amet, pretium in purus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent dapibus aliquam nisi a venenatis. Mauris porttitor purus ut felis dapibus et adipiscing ante bibendum. Aenean rutrum leo lorem.</p>
    <p>Fusce ante augue, rutrum sit amet malesuada nec, accumsan et metus. Duis eros est, fermentum sit amet posuere a, venenatis in est. Nulla scelerisque turpis a magna tincidunt placerat. Nullam vehicula arcu eu massa cursus scelerisque. Sed vitae volutpat elit. Sed tincidunt est at ipsum porttitor ut luctus metus accumsan. Cras sollicitudin eros quis quam adipiscing quis tempus tortor lacinia. Vestibulum sit amet odio tortor, ut molestie dolor. Aliquam erat volutpat. Integer malesuada sem non velit molestie sed adipiscing risus feugiat. Ut ullamcorper, velit sed facilisis lacinia, ante odio laoreet mauris, nec tempor lectus ipsum non dui. Suspendisse porta convallis sem, in consectetur risus porta a. Cras dignissim velit eu urna aliquam varius. Nullam tempus scelerisque metus non ultrices.</p>
    <p>Duis non orci erat. Mauris at dolor dolor. Nam porta placerat magna at posuere. Mauris at metus nisi, ut sodales nulla. Duis felis eros, lacinia id ultricies at, rhoncus non mi. Proin est arcu, vehicula nec tempus vel, cursus ac neque. In nec mauris velit. Sed tincidunt dapibus nibh, quis accumsan dui rhoncus vitae. Quisque convallis convallis lacus ut tempor. Duis vehicula ligula sit amet eros vestibulum tempor sit amet et leo. Praesent pellentesque accumsan iaculis. Fusce quis libero nisl, nec cursus nisi. Praesent auctor venenatis pulvinar. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sit amet odio vel nisi scelerisque sagittis sit amet a dui. Nullam scelerisque libero at nibh placerat hendrerit.</p>
</body>
</html>

- 0px은 x축에서 떨어진 간격, 50%는 y축에서 떨어진 간격을 의미

왜?

 

글자에 대한 속성

 

글자 크기 속성

- font-size 속성으로 글자 크기를 설정

- 속성값을 여러 단위로 설정 가능

 

글자 크기 속성 예제

- font_size.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Font Property</title>
    <style>
        .a { font-size: 32px; }
        .b { font-size: 2em; }
        .c { font-size: large; }
        .d { font-size: small; }
    </style>
</head>
<body>
    <h1>Lorem ipsum</h1>
    <p class="a">Lorem ipsum</p>
    <p class="b">Lorem ipsum</p>
    <p class="c">Lorem ipsum</p>
    <p class="d">Lorem ipsum</p> 
</body>
</html>

- px, em 등의 단위를 사용하고 있다

- large, small 등으로도 가능하다.

- 주로 px이나 %를 많이 쓴다

+ . 선택자이므로 class 속성으로 불러온다.

 

글꼴 설정 속성

- font-family 속성으로 글꼴을 설정 가능

 

글꼴 설정 속성 예제

- font_family.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Font Property</title>
    <style>
        .font_arial { font-family: Arial; }
        .font_roman { font-family: 'Times New Roman'; }
    </style>
</head>
<body>
    <h1 class="font_arial">Lorem ipsum</h1>
    <p class="font_roman">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam malesuada felis id massa adipiscing eget pellentesque ipsum lacinia. In orci massa, venenatis quis ultrices ac, accumsan vitae nunc. Sed eget pellentesque enim. Maecenas eros risus, hendrerit eget lacinia nec, mollis nec velit. Mauris sem mi, molestie sed bibendum eu, blandit et ante. Pellentesque vel mauris et mauris ornare pharetra. Etiam scelerisque pulvinar diam posuere ultrices. Duis et enim at velit ultricies cursus a at felis. Phasellus sit amet est hendrerit lorem convallis consequat ac ut massa. Aliquam luctus porttitor lacus id hendrerit. Nulla facilisi. Aliquam dictum tempus augue, eu tempor dui varius et. In pretium ultricies dapibus.</p>
</body>
</html>

글자 스타일 설정 속성

 - font-style 속성으로 글자 스타일 설정

- 속성값 : italic 등 (기울임)

- font-weight 속성으로 글자 굵기 설정

- 속성값 : bold 등 (굵은 글자)

 

글자 스타일 설정 속성 예제

- font_styleWeight.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Font Property</title>
    <style>
        .font_big { font-size: 2em; }
        .font_italic { font-style: italic; }
        .font_bold { font-weight: bold; }
    </style>
</head>
<body>
    <p class="font_big font_italic font_bold">Lorem ipsum dolor amet</p>
</body>
</html>

- class 속성으로 불러와서 font-size, font-style, font-weight 를 모두 적용하고 있다

- 2em, italic, bold -> 2em (영문 대문자 M의 2배) 크기로 기울임체로 굵게 출력하라

 

 

 

글자 정렬 속성

- text-align 속성으로 가운데, 왼쪽, 오른쪽 정렬이 가능하다

- 속성값 : center, left, right

- 기본값은 left 이다

 

글자 정렬 속성 예제

- font_textAlign.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Font Property</title>
    <style>
        .font_big { font-size: 2em; }
        .font_italic { font-style: italic; }
        .font_bold { font-weight: bold; }
        .font_center { text-align: center; }
        .font_right { text-align: right; }
    </style>
</head>
<body>
    <p class="font_big font_italic font_bold font_center">Lorem ipsum dolor amet</p>
    <p class="font_bold font_right">2019.07.10</p>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam malesuada felis id massa adipiscing eget pellentesque ipsum lacinia. In orci massa, venenatis quis ultrices ac, accumsan vitae nunc. Sed eget pellentesque enim. Maecenas eros risus, hendrerit eget lacinia nec, mollis nec velit. Mauris sem mi, molestie sed bibendum eu, blandit et ante. Pellentesque vel mauris et mauris ornare pharetra. Etiam scelerisque pulvinar diam posuere ultrices. Duis et enim at velit ultricies cursus a at felis. Phasellus sit amet est hendrerit lorem convallis consequat ac ut massa. Aliquam luctus porttitor lacus id hendrerit. Nulla facilisi. Aliquam dictum tempus augue, eu tempor dui varius et. In pretium ultricies dapibus.</p>
</body>
</html>

- 제목은 text_align : center; 로 설정했기 때문에 가운데 배치되어있다

- 날짜는 text_algin : right; 로 설정했기 때문에 오른쪽에 배치되어있다.

 

링크의 밑줄 제어 속성

- text-decoration 속성으로 제어

- text-decoration : none; 으로 하면 밑줄이 사라짐

- 어제 정리 했다.

 

div의 위치 설정 속성

- position 속성 으로 div를 위치를 설정한다.

- div가 여러개만들어졌을때 배치하기위해 반드시 position 속성 사용

- 속성값

- absolute : 절대적인 좌표 위치 설정

- relative : 상대적인 위치 설정

 

div의 위치 설정 속성 예제1

- div 를 absoulte 로 위치 설정

- 아직 위치는 설정하지 않음

- position_absoulute.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        .box { 
            width: 100px; height: 100px; 
            position: absolute;
        }
        .box:nth-child(1) { background-color: red; }
        .box:nth-child(2) { background-color: green; }
        .box:nth-child(3) { background-color: blue; }
    </style>
</head>
<body>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
</body>
</html>

- box위치 position을 absoulte 로 설정하면 브라우저 좌측 상단 기준으로 절대적인 위치 제어가 가능하다

- 3개의 div 박스는 좌표값이 설정되지 않았고 같은 좌표를 가지게 됨

- .box:nth-child(1) 은 .box 중에서 첫번째 자식 을 의미한다, 배경색 red 적용

- .box:nth-child(2) 은 .box 중에서 두번째 자식 을 의미한다, 배경색 green 적용

- .box:nth-child(3) 은 .box 중에서 세번째 자식 을 의미한다, 배경색 blue 적용

- 3개의 박스 모두 좌표값을 설정하지 않아 동일하므로 마지막의 박스(세번째 자식 div)가 덮어버려서 1개의 박스만 있는것처럼 보인다.

 

div의 위치 설정 속성 예제2

- absolute 에서 3개의 박스마다 좌표값을 다르게 설정해줘서 3개의 박스가 모두 출력되도록 함

- left와 top으로 위치 제어, 왼쪽에서 떨어진간격과 위에서 떨어진 간격을 제어

- position_absoluteLeftTop.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        .box { 
            width: 100px; height: 100px;
            position: absolute;
        }
        .box:nth-child(1) {
            background-color: red;
            left: 10px; top: 10px;
        }
        .box:nth-child(2) {
            background-color: green;
            left: 50px; top: 50px;
        }
        .box:nth-child(3) {
            background-color: blue;
            left: 90px; top: 90px;
        }
    </style>
</head>
<body>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
</body>
</html>

- .box 에는 모든 박스 공통적으로 적용할 내용이 들어감

- absoulte 하면 좌표는 좌측 상단을 기준으로 함

- 위치가 잘 설정되어 출력하고 있다.

 

겹치는 경우 위 아래 출력

- 따로 순서를 지정하지 않았을때는 위 처럼 박스가 불려진 순서대로 출력을 한다

- 즉, 가장 마지막에 출력된 파란색 div 박스가 가장 위에 출력됨

 

겹치는 경우, 위 아래 출력 제어 속성 (z 축 관련 설정) 

- z-index 속성으로 좌표값이 겹쳤을때, 위 아래 배치 설정 가능

- z-index 값이 클수록 위쪽에 배치됨

- 서로 다른 박스가 불려졌을때 위치가 겹칠때 어떤 div를 위, 아래로 배치할것인지 제어

 

 

겹치는 경우, 위 아래 출력 제어 속성 (z 축 관련 설정)  예제

- position_zindex.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        .box { 
            width: 100px; height: 100px; 
            position: absolute;
        }
        .box:nth-child(1) {
            background-color: red;
            left: 10px; top: 10px;

            z-index: 100;
        }
        .box:nth-child(2) {
            background-color: green;
            left: 50px; top: 50px;

            z-index: 10;
        }
        .box:nth-child(3) { 
            background-color: blue;
            left: 90px; top: 90px;

            z-index: 1;
        }
    </style> 
</head>
<body>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
</body>
</html>

- 첫번째 div는 z-index값 100, 두번째 div는 10, 세번째 div 는 1 을 주어서 첫번째 div 박스가 가장 위로 출력되도록 함

- z-index값이 큰 div 박스가 위로 배치된다.

 

- div position 이 absoulute인 것을 했다.

 

내용이 요소를 넘쳤을때 처리 속성

- overflow 속성으로 특정 영역의 범위를 벗어났을때 그걸 보여주게 만들건지 숨길건지 설정 가능

1. hidden 속성 값 : 영역을 벗어나는 내용을 감춤

- hidden이 일반적이다.

2. scroll 속성 값 : 영역을 벗어나는 부분을 스크롤로 만들어서 나타나도록 함

 

내용이 요소를 넘쳤을때 처리 속성 예제1

1. 부모 영역을 벗어난 부분을 잘라 감춤

- position_fomulaOverflowHidden.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        .box { 
            width: 100px; height: 100px; 
            position: absolute;
        }
        .box:nth-child(1) {
            background-color: red;
            left: 10px; top: 10px;

            z-index: 100;
        }
        .box:nth-child(2) {
            background-color: green;
            left: 50px; top: 50px;

            z-index: 10;
        }
        .box:nth-child(3) { 
            background-color: blue;
            left: 90px; top: 90px;

            z-index: 1; 
        }
        body > div {
            width: 400px; height: 100px;
            border: 3px solid black;
            
            position: relative;
            overflow: hidden;
        }
    </style>
</head>
<body>
    <h1>Lorem ipsum dolor amet</h1>
    <div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
    </div>
    <h1>Lorem ipsum dolor amet</h1>
</body>
</html>

- overflow : hidden; 속성을 통해 특정 영역의 범위를 벗어났을때 그걸 보여주지 않고 감춤

- overflow : hidden; 을 body>div 태그에 적용, 즉 body 바로 아래의 자식태그인 div인 검은 두꺼운 선 가진 박스에 적용됨

- 그 두꺼운 선 가진 박스는 3개 div 박스의 부모 태그이다.

- 즉, overflow는 자식이 아닌 부모 영역에 이 설정을 적용함

 

내용이 요소를 넘쳤을때 처리 속성 예제2

2. 부모 영역을 벗어나는 부분을 스크롤로 만들어서 나타나도록 함

- position_fomulaOverflowScroll.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        .box { 
            width: 100px; height: 100px; 
            position: absolute;
        }
        .box:nth-child(1) {
            background-color: red;
            left: 10px; top: 10px;

            z-index: 100;
        }
        .box:nth-child(2) {
            background-color: green;
            left: 50px; top: 50px;

            z-index: 10;
        }
        .box:nth-child(3) { 
            background-color: blue;
            left: 90px; top: 90px;

            z-index: 1; 
        }
        body > div {
            width: 400px; height: 100px;
            border: 3px solid black;
            
            position: relative;
            overflow: scroll;
        }
    </style>
</head>
<body>
    <h1>Lorem ipsum dolor amet</h1>
    <div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
    </div>
    <h1>Lorem ipsum dolor amet</h1>
</body>
</html>

- 아까의 코드에서 overflow : scroll; 만 다르다

- 스크롤바를 만들어서 영역을 넘친 내용들을 보여줌

 

float 속성

- div를 배치할떄 쓰는 속성

- 전체적인 레이아웃 만들때 쓰는 속성

- 가로 방향으로 배치할때 주로 사용됨

- 속성값 : left (왼쪽에 배치), right (오른쪽에 배치) 2가지 뿐이다.

 

float 속성으로 레이아웃 잡기

- 레이아웃을 잡을 때, 이렇게 가운데 부분에서 맨 왼쪽은 left, 가운데는 left로 해서 맨 왼쪽 다음에 오도록 배치하고, 가장 오른쪽은 right로 배치

- 전체적인 레이아웃을 배치할때 float 속성을 많이 사용한다.

 

float 속성 예제1

+ float값을 설정하지 않았을때 예제

- float_basic.html

<!DOCTYPE html>
<html>
<head>
    <title>Float Style Property</title>
    <style>

    </style>
</head>
<body>
    <img src="hanbit.jpg"/>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec facilisis enim vitae est elementum euismod. Duis lobortis euismod nunc a dapibus. Proin nulla enim, adipiscing ac pharetra quis, vehicula a mauris. Maecenas nec tellus metus. Fusce sollicitudin facilisis orci, vel fringilla nisi molestie lobortis. Suspendisse dapibus dapibus semper. Duis ac purus nulla. Quisque elementum nibh non ipsum feugiat placerat. Cras tristique urna non urna hendrerit lacinia. Pellentesque porta velit ut felis faucibus in mollis purus malesuada. Duis porta, nulla sed suscipit elementum, arcu mi consectetur enim, id auctor risus enim a metus. Phasellus lorem quam, suscipit a congue vel, viverra eu nisi. Mauris ac felis lorem.</p>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec facilisis enim vitae est elementum euismod. Duis lobortis euismod nunc a dapibus. Proin nulla enim, adipiscing ac pharetra quis, vehicula a mauris. Maecenas nec tellus metus. Fusce sollicitudin facilisis orci, vel fringilla nisi molestie lobortis. Suspendisse dapibus dapibus semper. Duis ac purus nulla. Quisque elementum nibh non ipsum feugiat placerat. Cras tristique urna non urna hendrerit lacinia. Pellentesque porta velit ut felis faucibus in mollis purus malesuada. Duis porta, nulla sed suscipit elementum, arcu mi consectetur enim, id auctor risus enim a metus. Phasellus lorem quam, suscipit a congue vel, viverra eu nisi. Mauris ac felis lorem.</p>
</body>
</html>

- float 속성을 쓰지 않고 이미지를 출력했다.

- 로고이미지가 가장 위에 배치되고 나머지 텍스트 내용들이 줄이 바뀌어서 아래쪽에 나타난다.

 

float 속성 예제2

float 값을 설정했을때 위치

- float : left; 설정해서 왼쪽에 배치시키기

- float_image.html

<!DOCTYPE html>
<html>
<head>
    <title>Float Style Property</title>
    <style>
        img {
            float: left;
        }
    </style>
</head>
<body>
    <img src="hanbit.jpg"/>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec facilisis enim vitae est elementum euismod. Duis lobortis euismod nunc a dapibus. Proin nulla enim, adipiscing ac pharetra quis, vehicula a mauris. Maecenas nec tellus metus. Fusce sollicitudin facilisis orci, vel fringilla nisi molestie lobortis. Suspendisse dapibus dapibus semper. Duis ac purus nulla. Quisque elementum nibh non ipsum feugiat placerat. Cras tristique urna non urna hendrerit lacinia. Pellentesque porta velit ut felis faucibus in mollis purus malesuada. Duis porta, nulla sed suscipit elementum, arcu mi consectetur enim, id auctor risus enim a metus. Phasellus lorem quam, suscipit a congue vel, viverra eu nisi. Mauris ac felis lorem.</p>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec facilisis enim vitae est elementum euismod. Duis lobortis euismod nunc a dapibus. Proin nulla enim, adipiscing ac pharetra quis, vehicula a mauris. Maecenas nec tellus metus. Fusce sollicitudin facilisis orci, vel fringilla nisi molestie lobortis. Suspendisse dapibus dapibus semper. Duis ac purus nulla. Quisque elementum nibh non ipsum feugiat placerat. Cras tristique urna non urna hendrerit lacinia. Pellentesque porta velit ut felis faucibus in mollis purus malesuada. Duis porta, nulla sed suscipit elementum, arcu mi consectetur enim, id auctor risus enim a metus. Phasellus lorem quam, suscipit a congue vel, viverra eu nisi. Mauris ac felis lorem.</p>
</body>
</html>

- float : left; 가 되어 이미지가 왼쪽에 배치되고, 나머지 본문 내용들은 이미지의 오른편에 배치되어 나타난다.

 

float 속성 예제3

float 값을 설정했을때 위치

- float : right; 로 수정해서 오른에 배치 (코드 수정)

- 수평방향으로 배치할때 주로 float : left , float : right 를 쓴다.

 

float 속성 예제4

- CSS를 적용하지 않은 경우, div 2개가 있을때

- float_boxBasic.html

<!DOCTYPE html>
<html>
<head>
    <title>Float Style Property</title>
    <style>

    </style>
</head>
<body>
    <div class="box">1</div>
    <div class="box">2</div>
</body>
</html>

- css 적용되지 않은 상태

 

float 속성 예제5

- 두 div 박스를 모두 float : left;로 왼쪽에 배치

- 수평 배치

- float_boxLeft.html

<!DOCTYPE html>
<html>
<head>
    <title>Float Style Property</title>
    <style>
        .box {
            width: 100px;
            height: 100px;
            background-color: red;
            margin: 10px;
            padding: 10px;
            /* 태그를 왼쪽으로 붙입니다. */
            float: left;
        }
    </style>
</head>
<body>
    <div class="box">1</div>
    <div class="box">2</div>
</body>
</html>

- div 박스 2개 모두 float : left;를 적용한다

- margin : 10px 이므로 두 div 사이 간격이 10px 이다.

- padding : 10px 이므로 테두리와 내용 1, 2 숫자사이의 간격이 10px

- 먼저 출력되는게 왼쪽에 배치되고 거기에 쌓이듯이 다음에 출력되는게 붙어서 나온다

- 둘 다 left 지만, 1번 div가 먼저 왼쪽에 배치가 되고, 2번 div가 다음에 배치되기 떄문에 오른쪽으로 나오는 것

 

+ 만약 left를 없앤다면?

- 수평방향으로 배치할떄는 float : left나 float : right를 써야한다

- 만약 float 를 없애면 수평방향으로 출력되지 않음

 

float 속성 예제6

- 두 div 박스를 모두 float : right;로 오른쪽에 배치

- 수평 배치

- float_boxRight.html

<!DOCTYPE html>
<html>
<head>
    <title>Float Style Property</title>
    <style>
        .box {
            width: 100px;
            height: 100px;
            background-color: red;
            margin: 10px;
            padding: 10px;
            /* 태그를 오른쪽으로 붙입니다. */
            float: right;
        }
    </style>
</head>
<body>
    <div class="box">1</div>
    <div class="box">2</div>
</body>
</html>

- 둘 다 float : right ; 이지만 1번박스가 먼저 나와있으므로 먼저 오른쪽으로 배치되고, 2번 박스는 쌓이듯이 배치되므로 상대적으로 왼쪽에 배치된다.

 

 

float 속성 예제7

- float 속성을 쓰고 있다.

- 2-layout.html

- footer 는 하단에 배치할 것이므로 float를 쓰면 안된다.

- clear : both; 로 양쪽을 해제해야만 위의 float값의 영향을 받지 않음

- 그럼으로서 한줄로 출력된다.

 

+ footer 에서 clear : both; 를 빼면?

- footer에서 clear : both ;를 하지않으면 float의 영향을 받아서 footer가 위로 딸려감

 

float 속성 예제8

- float 속성을 쓰고 있다.

- 3-layout.html

 

그림자 효과 속성

- 입체적인 모양으로 보이게 하는 효과

- 속성값의 순서 : ( 오른쪽 아랫쪽 흐림도 색상 ) 순서

- 오른쪽과 아랫쪽의 값이 클수록 오른쪽과 아랫쪽으로 그림자가 치우친다.

- 흐림도가 클수록 그림자가 흐려지고 흐림도가 작을수록 그림자가 선명해진다

1. 텍스트에 그림자 효과

- text-shadow 속성으로 텍스트에 그림자 효과를 줄 수 있다.

2. 박스에 그림자 효과

- box-shadow 속성으로 박스에 그림자 효과를 줄 수 있다.

 

그림자 효과 속성 예제1

1. 텍스트에 그림자 효과

- 텍스트에 대해 그림자를 주는 예제

- shadow_textShadow.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        h1 {
          /*text-shadow: 오른쪽 아랫쪽 흐림도 색상;*/
            text-shadow: 5px 5px 5px black;
        }
    </style>
</head>
<body>
    <h1>Lorem ipsum dolor amet</h1>
</body>
</html>

- h1태그의 텍스트에 대해 그림자 두께, 색상 등을 설정하고 있다.

- 오른쪽의 그림자 크기 5px, 아래쪽의 그림자 크기 5px, 흐림도 5px, 색상 black 설정

 

- 오른쪽 그림자 크기를 더 큰 값으로 설정해보자 -> text-shadow : 15px 5px 5px black;

- 오른쪽으로 더 치우쳐진다.

 

- 아랫쪽 그림자 크기를 더 큰 값으로 설정해보자 -> text-shadow : 5px 15px 5px black;

 

- 흐림도를 크게 해보자 -> text-shadow : 5px 5px 15px black;

 

- 값이 작을수록 그림자가 선명하고 클수록 그림자가 흐릿하게 나타난다.

 

그림자 효과 속성 예제2

2. 텍스트에 그림자 효과

- 박스에 대해 그림자를 주는 예제

- text 에 대한 그림자 효과와 비슷함

- 속성값 순서 : 마찬가지로 (오른쪽 아랫쪽 흐림도 색상) 순서이다.

- shadow_boxShadow.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        div {
            border: 3px solid black;
          /*box-shadow: 오른쪽 아랫쪽 흐림도 색상;*/
            box-shadow: 10px 10px 30px black;
            text-shadow: 5px 5px 5px black;
        }
    </style>
</head>
<body>
    <div class="box">
        <h1>Lorem ipsum dolor amet</h1>
    </div>
</body>
</html>

+ 선택자가 div 이므로 div 안의 내용들은 (h1 태그 포함) 모두 저 CSS의 적용을 받게 된다.

- 박스에 대해 그림자 효과를 내고 있다

- 오른쪽으로 10px, 아랫쪽으로 10px 그림자가 있다.

 


chapter_7 공부

레이아웃 만들기, 전체적인 배치 관련

 

수평 정렬

- float 속성으로 수평으로 정렬한다, 왼쪽에 배치시 left, 오른쪽에 배치시 right 속성값을 이용한다

+ overflow : hidden; 시 넘쳤을때 숨기고 overflow : scroll; 시 스크롤을 만들어줘서 보여줌

 

수평 정렬 예제

- example_1.html

<!DOCTYPE html>
<html>
<head>
    <title>Float With Overflow</title>
    <style>
        div.container {
            overflow: hidden;
        }

        div.item {
            float: left;

            margin: 0 3px;
            padding: 10px;
            border: 1px solid black; 
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="item">메뉴 - 1</div>
        <div class="item">메뉴 - 2</div>
        <div class="item">메뉴 - 3</div>
        <div class="item">메뉴 - 4</div>
    </div>
</body>
</html>

- 공통적인 속성은 div.container를 이용해 적용하고 개별은 div.item 으로 적용하고 있다.

- div.container 는 "div 태그에서" class=container 불러와야만 적용이 된다!

- div.item 은 "div 태그에서" class=item 불러와야만 적용이 된다!

- overflow 는 부모인 container 에 적용함, 이 container를 넘어가는 값이 있으면 보여주지 않도록 hidden 으로 설정

- 각 item들은 float : left; 에 의해 수평 배치, 메뉴 - 1 이 먼저 나오므로 가장 먼저 적용되어 가장 왼쪽에 배치된다.

- 나머지는 메뉴 - 2, 메뉴 - 3, 메뉴 - 4 순으로 왼쪽부터 오른쪽으로 배치되고 있다.

+ margin : 0 3px ; (위쪽과 아래쪽이 0px, 왼쪽과 오른쪽이 3px)

 

중앙 정렬

- margin : 0 auto ; 로 설정시 전체 내용이 브라우저 가운데 배치된다.

- 주로 가장 바깥쪽의 div에 margin : 0 auto; 설정해서 전체가 중앙 정렬시킨다.

- 전체 내용을 브라우저 가운데 배치할때 사용하는 속성

- 많이 쓰는 속성이다.

 

중앙 정렬 예제1

- example_2.html

<!DOCTYPE html>
<html>
<head>
    <title>Margin Width</title>
    <style>
        /* 초기화 */
        * { margin: 0; padding: 0; } 

        /* 주제 */
        body {
            margin: 0 auto; /* 중앙 정렬 */
            width: 700px;
        }
    </style>
</head>
<body>
    <h1>Lorem ipsum</h1>
    <h2>Neque porro quisquam est qui...</h2>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam consequat vehicula erat vel hendrerit. Etiam in est dolor, non pretium justo. Aliquam eu ipsum diam, sed dictum ante. Nunc pellentesque semper cursus. Nam aliquet consequat sapien id porttitor. Proin quis pharetra urna. Nam risus arcu, tincidunt quis imperdiet in, ullamcorper in sem. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur vestibulum enim gravida sapien vehicula id consectetur ipsum gravida. Nulla porta consequat velit vitae elementum.</p>
    <p>Nullam neque quam, blandit eget venenatis at, viverra vitae metus. Pellentesque quis ligula turpis. Nulla at justo est, id egestas mauris. Phasellus nec nunc egestas magna iaculis rhoncus. Praesent ut risus tellus. Ut pretium hendrerit vehicula. Donec id felis quis neque ornare facilisis. Praesent dictum orci quis metus vestibulum vitae vulputate sapien luctus. Aliquam pellentesque urna id nunc aliquam aliquam quis sed nunc. Sed rhoncus accumsan dolor, ut interdum quam ultricies in. Morbi venenatis nisi a nunc porta tempus. Vestibulum hendrerit posuere consequat. Nam eleifend malesuada est at dictum. Mauris sit amet nisi lobortis dolor consequat ullamcorper.</p>
</body>
</html>

- * (all tags) 모든 태그에 대해 margin : 0; padding : 0;을 준다 -> 모두 왼쪽 위에 배치됨

- body 에 대해 margin : 0 auto; 를 주면 body 태그 모든 내용이 가운데 배치가 됨.

- 주로 가장 바깥쪽의 div에 margin : 0 auto; 설정해서 전체가 중앙 정렬시킨다.

- 제목 및 본문이 모두 가운데 정렬되어있다.

 

+ margin : 0 auto; 를 없애면?

- 좌측 상단부터 출력됨

 

중앙 정렬 예제2

- 3-layout.html

- #container는 가장 바깥쪽의 div에 적용되었음

- margin : 0 auto; 로 인해 container 안의 모든 내용이 가운데 나타남

- 가운데 배치되어있다

 

One True 레이아웃

- 포털사이트에서 많이 쓰는 메인 페이지 레이아웃

- 행을 독립적으로 생각해서 공간을 나눔

One True 레이아웃 예시

 

One True 레이아웃 예제

- example_3.html

<!DOCTYPE html>
<html>
<head>
    <title>One True Layout</title>
    <style>
        body {
            width: 500px;
            margin: 10px auto; /* 중앙 정렬 */
        }

        #middle { overflow: hidden; }
        #left { float: left; width: 150px; background: red; }
        #right { float: left; width: 350px; background: blue; }

        #top { background: green; }
        #bottom { background: purple; }
    </style>
</head>
<body>
    <div id="top">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam elit elit, ornare non elementum ut, imperdiet nec felis. Proin leo felis, congue vitae facilisis id, ullamcorper vitae ipsum.</div>
    <div id="middle">
        <div id="left">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam elit elit, ornare non elementum ut.</div>
        <div id="right">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam elit elit, ornare non elementum ut, imperdiet nec felis. Proin leo felis, congue vitae facilisis id, ullamcorper vitae ipsum. Integer a risus sed libero imperdiet lacinia vel vel massa. Vestibulum tempus ullamcorper tellus vitae gravida. Donec cursus, enim at porta auctor, purus sapien luctus erat, vitae placerat ante nibh eget lectus. Integer a leo sit amet neque suscipit commodo sed et mauris. Nullam a turpis nunc. Ut metus risus, scelerisque ac dignissim non, faucibus ac metus.</div>
    </div>
    <div id="bottom">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam elit elit, ornare non elementum ut, imperdiet nec felis. Proin leo felis, congue vitae facilisis id, ullamcorper vitae ipsum.</div>
</body>
</html>

- 전체 폭 width는 500px 으로 했고 margin: 10px auto; 가 중앙정렬 해주고 있다

- 상단에 나타날 내용을 id=top, 하단에 나타날 내용을 id=bottom으로 했다, 배경색 외 따로 설정 안함

- 가운데 영역 middle은 왼쪽 left 와 오른쪽 right 두가지로 나눠져 있다

- middle의 overflow : hidden; 이므로 넘쳤을때 보이지 않도록 하겠다

- left 선택자에서 float : left; 이므로 먼저 왼쪽에 배치됨, width값이 150px

- right 선택자에서 float : left;이므로 쌓여서 배치됨, width값이 350px

-> #middle 의 left , right 박스에는 hidden에 의해 글자들이 넘치더라도 보여주지 않음, 글이 잘리고 있다.

- 상단에 글 , 좌측에 사이드, 우측에 본문, 하단에 글 이 출력됨

- top과 bottom 은 전체가 꽉 찬 형태로 출력

- 가운데 왼, 오른쪽은 hidden에 의해 글자들이 넘치더라도 보여주지 않음, 글이 잘리고 있다.

 

div 배치 속성

- position 속성으로 div를 배치한다

- 속성값 : absolute, relative, fixed

- 왼쪽에서 떨어진 건 left, 위쪽에서 떨어진 건 top

 

div 배치 속성 예제

- example_4.html

<!DOCTYPE html>
<html>
<head>
    <title>Absolute Position</title>
    <style>
        #container {
            width: 500px; height: 300px;
            border: 3px solid black;
            overflow: hidden;
            position: relative;
        }

        .circle {
            position: absolute;
            width: 100px; height: 100px; 
            border-radius: 50% 50%;
        }

        #red {
            background: red;
            left: 20px; top: 20px;
        }
        #green {
            background: green;
            right: 20px; top: 20px;
        }
        #blue {
            background: blue;
            right: 20px; bottom: 20px;
        }
        #yellow {
            background: yellow;
            left: 20px; bottom: 20px;
        }
    </style>
</head>
<body>
    <h1>Dummy Text</h1>
    <div id="container">
        <div id="red" class="circle"></div>
        <div id="green" class="circle"></div>
        <div id="blue" class="circle"></div>
        <div id="yellow" class="circle"></div>
    </div>
    <h1>Dummy Text</h1>
</body>
</html>

- 원의 위치를 제어하고 있다

- 공통적인 속성은 .circle 로, 개별적인 속성들은 #red, #green, #blue, #yellow로 적용시키고 있다.

- 가장 바깥쪽 div에 적용할 #container 는 position : relative; 로 설정한다

-> container 는 상대적인 위치로 위치 설정됨, 상대적인 위치의 기준은 바로 위의 Dummy Text 텍스트

- .circle에서 width=100px; height=100px로 가로길이와 세로길이가 동일하므로 정사각형이 되고, border-radius : 50% 50%으로 하면 원이 된다.

- .circle의 position은 바로 바깥쪽 div를 기준으로, 즉 container를 기준으로 왼쪽에서 얼마, 위에서 얼마 떨어질지 결정한다

 

+ position 속성 추가

position : relative;

- 그자체로는 특별한 의미가 없다.딱히 어느 위치로 이동하지는 않고 위치를 이동시켜주는 top, right, bottom, left 프로퍼티가 있어야 원래의 위치에서 이동할 수 있다.

position : absolute;

- 요소에 적용하면 특정 부모에 대해 절대적으로 움직이게 된다. 부모 중에 position이 relative, fixed, absolute 하나라도 있으면 그 부모에 대해 절대적으로 움직이게 된다. 일반적으로 absolute를 쓸 경우, 절대적으로 움직이고 싶은 부모에게 position: relative; 를 부여한다.

 

요소의 중앙 배치

- example_5.html

<!DOCTYPE html>
<html>
<head>
    <title>Absolute Position</title>
    <style>
        /* 초기화 */
        * { margin: 0; padding: 0; }

        /* 주제 */
        body { background: red; }
        #container {
            /* 색상 및 크기 적용 */
            width: 500px; height: 250px;
            background: orange;

            /* 위치 설정 */
            position: absolute;
            left: 50%; top: 50%;
            margin-left: -250px;
            margin-top: -125px;
        }
    </style>
</head>
<body>
    <div id="container">
        <h1>요소의 중앙 배치</h1>
    </div>
</body>
</html>

-  안의 div 박스의 width : 500px, hegith : 250px, 오랜지색

- position : absoulute; 이고 left : 50%, top : 50% 에 의해 왼쪽에서 50%, 위에서 50% 떨어져서 정가운데(정중앙) 배치가 된다.

- margin-left 는 왼쪽에서 부터 떨어진 간격을 의미하는데 음수값이다. 음수값은 방향을 의미하기때문에 음수값을 넣으면 왼쪽으로 이동함

- margin-top 은 위에서부터 떨어진 간격을 의미하는데 음수값이므로 위쪽으로 배치가 올라감

 

margin-left 와 margin-top 을 빼면?

- 기준점 기준으로 left : 50%; right : 50% 되므로 요소를 정 가운데로 이동하고 싶다면 margin-left 와 margin-top 음수값을 이용해야한다.

 

요소 고정 (고정바 배치)

- 특정 div 박스의 position 값을 fixed로 하면 고정이 된다

- 고정이 되면 스크롤링이 되어도 움직이지 않음

- example_6.html

<!DOCTYPE html>
<html>
<head>
    <title>Fixed Bar</title>
    <style>
        .container {
            margin-top: 50px;
            margin-left: 50px;
        }

        .top_bar {
            background: red;

            position: fixed;
            left: 0; top: 0; right: 0;
            height: 50px;
        }

        .left_bar {
            background: blue;

            position: fixed;
            left: 0; top: 50px; bottom: 0;
            width: 50px;
        }
    </style>
</head>
<body>
    <div class="top_bar"></div>
    <div class="left_bar"></div>
    <div class="container">
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam elit elit, ornare non elementum ut, imperdiet nec felis. Proin leo felis, congue vitae facilisis id, ullamcorper vitae ipsum. Integer a risus sed libero imperdiet lacinia vel vel massa. Vestibulum tempus ullamcorper tellus vitae gravida. Donec cursus, enim at porta auctor, purus sapien luctus erat, vitae placerat ante nibh eget lectus. Integer a leo sit amet neque suscipit commodo sed et mauris. Nullam a turpis nunc. Ut metus risus, scelerisque ac dignissim non, faucibus ac metus. Vivamus molestie ultrices luctus. Cras pellentesque malesuada magna interdum feugiat. Nam condimentum massa et lectus elementum ac congue nibh mollis. Proin adipiscing nisi et neque fermentum ornare.</p>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam elit elit, ornare non elementum ut, imperdiet nec felis. Proin leo felis, congue vitae facilisis id, ullamcorper vitae ipsum. Integer a risus sed libero imperdiet lacinia vel vel massa. Vestibulum tempus ullamcorper tellus vitae gravida. Donec cursus, enim at porta auctor, purus sapien luctus erat, vitae placerat ante nibh eget lectus. Integer a leo sit amet neque suscipit commodo sed et mauris. Nullam a turpis nunc. Ut metus risus, scelerisque ac dignissim non, faucibus ac metus. Vivamus molestie ultrices luctus. Cras pellentesque malesuada magna interdum feugiat. Nam condimentum massa et lectus elementum ac congue nibh mollis. Proin adipiscing nisi et neque fermentum ornare.</p>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam elit elit, ornare non elementum ut, imperdiet nec felis. Proin leo felis, congue vitae facilisis id, ullamcorper vitae ipsum. Integer a risus sed libero imperdiet lacinia vel vel massa. Vestibulum tempus ullamcorper tellus vitae gravida. Donec cursus, enim at porta auctor, purus sapien luctus erat, vitae placerat ante nibh eget lectus. Integer a leo sit amet neque suscipit commodo sed et mauris. Nullam a turpis nunc. Ut metus risus, scelerisque ac dignissim non, faucibus ac metus. Vivamus molestie ultrices luctus. Cras pellentesque malesuada magna interdum feugiat. Nam condimentum massa et lectus elementum ac congue nibh mollis. Proin adipiscing nisi et neque fermentum ornare.</p>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam elit elit, ornare non elementum ut, imperdiet nec felis. Proin leo felis, congue vitae facilisis id, ullamcorper vitae ipsum. Integer a risus sed libero imperdiet lacinia vel vel massa. Vestibulum tempus ullamcorper tellus vitae gravida. Donec cursus, enim at porta auctor, purus sapien luctus erat, vitae placerat ante nibh eget lectus. Integer a leo sit amet neque suscipit commodo sed et mauris. Nullam a turpis nunc. Ut metus risus, scelerisque ac dignissim non, faucibus ac metus. Vivamus molestie ultrices luctus. Cras pellentesque malesuada magna interdum feugiat. Nam condimentum massa et lectus elementum ac congue nibh mollis. Proin adipiscing nisi et neque fermentum ornare.</p>
    </div>
</body>
</html>

- 상단의 .top_bar 는 상단바를 만들어주며 position : fixed; 가 적용되므로 고정이 되어 스크롤링 해도 움직이지 않는다

- 상단의 .top.bor 의 height가 50px이므로 두께(세로높이)가 50px

- 좌측의 .left_bar는 좌측바를 만들어주며 position :fixed; 가 적용되어 고정이 되어 스크롤링 해도 움직이지 않는다.

- 좌측의 .left_bar 의 weight가 50px이므로 두께(너비)가 50px

- 좌측의 .left_bar 의 top : 50 px 을 통해서 위에서 50px떨어진 곳 부터 바가 시작한다.

- 또한, .container의 margin-top : 50 px, margin-left : 50px을 통해 바가 있는 곳이 아닌 곳부터 본문을 출력함

- 상단바(red), 좌측바(blue)

- 스크롤바를 움직여도 좌측바와 상단바는 움직이지 않

 

내용이 넘쳤을때 ... 으로 생략 표시해주는 속성

- text-overFlow : ellipsis; 하면 글자를 ... 으로 생략해줌

 

내용이 넘쳤을때 ... 으로 생략 표시해주는 속성 예제

- example_7.html

<!DOCTYPE html>
<html>
<head>
    <title>Ellipsis</title>
    <style>
        h1, p {
            width: 300px;
        }

        .ellipsis {
            white-space: nowrap;
            overflow: hidden;
            text-overflow: ellipsis; 
        }
    </style>
</head>
<body>
    <h1 class="ellipsis">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h1>
    <p class="ellipsis">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</body>
</html>

- white-space : nowrop; 내용이 많을때 줄을 바꾸지 않게 하는 속성

- overflow : hidden; 이므로 넘칠때 보여주지 않게 설정, 넘치는 내용을 아예 나타나지 않게함

- text-overflow : ellipsis; 하면 넘친 내용을 ... 으로 보여줌

- 글의 내용이 영역을 넘치고 있다.

- text-overflow : ellipsis;에 의해 넘친 부분이 ... 으로 표시되고 있다.

 

text-overflow : ellipsis; 가 없다면?

overflow : hidden; 이 없다면?

- 그냥 출력시킴

 

2단 레이아웃

- 2단으로 레이아웃을 잡음

- 2-layout.html

<!DOCTYPE html>

<html lang="ko">
<head>
    <meta charset="utf-8">
    <title>2단 레이아웃</title>
    	<style>
		div {
			border: 1px solid #ccc; /* 모든 영역에 테두리 표시 */
		}
		#container {
			width:960px; /* 컨테이너 너비 */
			padding:20px; /* 패딩 */			
			margin:0 auto;  /* 화면 중앙에 배치 */
		}
		#header {
			padding:20px;  /* 패딩 */
			margin-bottom:20px;  /* 아래 요소들과의 간격(마진) */
		}
		#contents {
			width: 620px;  /* 너비 */
			padding: 20px;  /* 패딩 */
			float: left;  /* 왼쪽으로 플로팅 */
			margin-bottom: 20px;  /* 아래 요소와의 간격 */
		}
		#sidebar {
			width: 220px;  /* 너비 */
			padding: 20px;  /* 패딩 */
			float: right;  /* 오른쪽으로 플로팅 */
			margin-bottom: 20px;  /* 아래 요소와의 간격 */
			background:#eee;
		}
		#footer {
			clear:both;  /* 양쪽 플로팅 해제 */
			padding:20px;  /* 패딩 */
		}
	</style>
</head>
<body>
    <div id="container">
        <div id="header">
			<h1>사이트 제목</h1>
		</div>
		<div id="sidebar">
			<h2>사이드 바</h2>
            <ul>
                <li>모든 국민은 근로의 의무를 진다. 국가는 근로의 의무의 내용과 조건을 민주주의원칙에 따라 법률로 정한다.</li>

            </ul>
		</div>
		<div id="contents">
			<h2>본문</h2>
            <p>재산권의 행사는 공공복리에 적합하도록 하여야 한다. 정부는 회계연도마다 예산안을 편성하여 회계연도 개시 90일전까지 국회에 제출하고, 국회는 회계연도 개시 30일전까지 이를 의결하여야 한다.</p>

            <p>대통령의 임기가 만료되는 때에는 임기만료 70일 내지 40일전에 후임자를 선거한다. 제2항과 제3항의 처분에 대하여는 법원에 제소할 수 없다. 언론·출판에 대한 허가나 검열과 집회·결사에 대한 허가는 인정되지 아니한다.</p>
		</div>
		<div id="footer">
			<h2>푸터</h2>
            <p>이 헌법시행 당시의 법령과 조약은 이 헌법에 위배되지 아니하는 한 그 효력을 지속한다.</p>
		</div>
    </div>
</body>
</html>

- 공통적으로 적용할 내용은 div 태그 전체에 대해 적용할 div 태그 선택자에 넣었다.

- container id를 보면 전체적인 배치를 가로 960px, padding : 20px, margin : 0 auto 이므로 전체를 가운데 정렬

- #header 부분은 헤더 아래쪽의 마진을 20px로 설정

- 사이드바가 float : right; 로, 본문은 float : left;로 지정되어있기 떄문에 사이드바가 먼저 나온다고 해도 사이드바가 오른쪽에 무조건 배치됨

- footer에서는 위에서 float 속성을 썼으므로 clear 속성으로 양쪽을 해제해야만 따로 아래에 만들어짐, clear해주지 않으면 딸려서 올라감

- 제목  본문과 20px만큼 떨어져있다

- 이렇게 div 태그로 레이아웃을 잡을수도 있고, 시맨틱 태그로 레이아웃을 잡을 수도 있다.

- HTML4까지는 전부 <div id=header> 이런식으로 레이아웃을 잡았었다, HTML5로 오면서 따로 <header> 라는 시맨틱 태그가 추가됨

- <header> <footer> <article> <section> 등이 시맨틱 태그, 하지만 태그만으로는 효과가 없다.

- div태그나 시맨틱 태그 중 어느걸 써도 상관 없다

 

3단 레이아웃

- 3단으로 레이아웃을 잡음

- 3-layout.html

<!doctype html>
<html lang="ko">
	<head>
		<title>CSS 레이아웃 - 2단 레이아웃</title>
		<meta charset="utf-8">
		<style>
			div {
				padding:20px;
				border:1px solid #ccc;
			}
			#container {
				width:960px;
				margin:0 auto;
			}
			#header {
				padding:20px;
				margin-bottom:20px;
			}
			#contents {
				width: 490px;
				float: left;
				margin-bottom: 20px;
			}
			#left-sidebar {
				width: 150px;
				float: left;
				margin-bottom: 20px;
				margin-right: 20px;
			}
			#right-sidebar {
				width: 150px;
				float: right;
				margin-bottom: 20px;
			}
			#footer {
				clear:both;			
			}
		</style>
	</head>
	<body>
		<div id="container">
			<div id="header">
				<h1>사이트 제목</h1>
			</div>
			<div id="left-sidebar">
				<h2>사이드바</h2>
				<ul>
					<li>항목1</li>
					<li>항목2</li>
					<li>항목3</li>
					<li>항목4</li>
				</ul>
			</div>
			<div id="contents">
				<h2>본문</h2>
				<p>예비비는 총액으로 국회의 의결을 얻어야 한다. 예비비의 지출은 차기국회의 승인을 얻어야 한다. 이 헌법시행 당시의 법령과 조약은 이 헌법에 위배되지 아니하는 한 그 효력을 지속한다.</p>

				<p>국가의 세입·세출의 결산, 국가 및 법률이 정한 단체의 회계검사와 행정기관 및 공무원의 직무에 관한 감찰을 하기 위하여 대통령 소속하에 감사원을 둔다.</p>

				<p>모든 국민의 재산권은 보장된다. 그 내용과 한계는 법률로 정한다. 대한민국의 국민이 되는 요건은 법률로 정한다. 법률이 헌법에 위반되는 여부가 재판의 전제가 된 경우에는 법원은 헌법재판소에 제청하여 그 심판에 의하여 재판한다.</p>
			</div>
			<div id="right-sidebar">
				<h2>사이드바</h2>
				<ul>
					<li>항목1</li>
					<li>항목2</li>
					<li>항목3</li>
					<li>항목4</li>
				</ul>
			</div>
			<div id="footer">
				<h2>푸터</h2>
				<p> 저작권 정보 </p>
				<p> 연락처 등 </p>
			</div>
		</div>
	</body>
</html>

- 왼쪽 사이드바 float : left; 본문 float : left;, 오른쪽 사이드바 float : right; 로 해줘야 이렇게 3단으로 배치된다.

- #continaer에서 width: 960; 하고 margin:0 auto;를 통해 전체 내용을 전부 가운데 배치한다, 브라우저를 늘리든 줄이든 가운데 배치된다.

- 본문 #content 에서 float : left;지만 left side bar가 먼저 나왔기떄문에 먼저 왼쪽에 배치되고 거기에 이어서 본문이 상대적으로 오른쪽으로 배치됨

 

- css 잘 적용되었는지, margin 과 padding을 확인 하기 위해 개발자 도구(F12)에서 확인해볼 수 있다

+ 파이썬 크롤링할때도 F12를 눌러서 어떤 선택자로 되어있는지 확인해야함

 


chapter_8 공부

반응형 웹 관련

 

반응형 웹

- 반응형 웹 페이지 : 접속하는 단말기에 맞게끔 다르게 보여주는것

- 한개의 페이지를 잘 만들어 놓고 사용자가 PC로 접속할때나 모바일로 접속할때에 맞춰서 보여주는 웹

+ 반응형 웹인지 아닌지는 확대나 축소를 시켜보면 안다

+ 네이버는 반응형 웹을 만들지 않고 모바일 접속시 m.naver.com  처럼 모바일용 웹 따로 만들었다.

 

+ 네이버는 반응형 웹이 아니다

네이버 페이지(PC)
네이버 모바일 페이지

 

 

+ 오라클 웹페이지는 반응형 웹

+ 부트스트랩은 기본적으로 반응형 웹 지원

- 확대나 축소시 화면이 변한다

 

반응형 웹 만들기

- 일반적인 페이지를 만들때 쓰지 않는 속성들을 설정해야만 반응형 웹 만들 수 있다.

- 이 두가지를 반드시 설정해야함

1. head 태그 안의 meta 태그를 이용해서 viewport를 설정

2. 미디어 쿼리 설정

 

1. head 태그 안의 meta 태그를 이용해서 viewport를 설정

- viewport 설정시 속성들 설정해야 반응형 웹 만들 수 있다.

- name : viewport 를 해야하고 단말기에 맞게끔 이 코드가 들어가야함

- 기본적으로 자주 쓰는 속성들 정해져 있다.

 

2. 미디어 쿼리 설정

- 해상도 등 설정할떄 미디어 태그로 설정함

- 해상도 설정시 미디어태그를 써야만 그걸 이용해서 반응형 웹에서 해상도 설정 가능

- 모니터와 프린터 구분 등도 가능하다.

- 화면 출력시 red로, 프린트 단말장치로 출력시 green으로 출력하라는 의미

 

 

 

반응형 웹 만들기 예제

미디어 쿼리 예제1

- 반응형 웹 만들때 반드시 설정해야하는 속성 중 미디어 쿼리 예제

- media_feature.html

<!DOCTYPE html>
<html>
<head>
    <title>Responsive Web Basic</title>
    <style>
        @media (max-width: 499px) {
            body { background: red; }
        }

        @media (min-width: 500px) and (max-width: 799px) {
            body { background: green; }
        }

        @media (min-width: 800px) {
            body { background: blue; }
        }
    </style>
</head>
<body>
    <h1>Lorem ipsum dolor sit amet</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras faucibus hendrerit nunc at consectetur. In hac habitasse platea dictumst. Ut a luctus neque, et tempor erat. Aliquam quis arcu id lectus fringilla volutpat id tempor lorem. Duis vitae odio vehicula dui vulputate mollis et sit amet mauris. Nulla facilisi. Praesent non sapien ac sapien malesuada ornare eget at libero. Aenean et faucibus arcu, id maximus mi. Curabitur tincidunt mi vitae orci porttitor, quis laoreet justo iaculis.</p>
</body>
</html>

- @media 는 미디어 태그라고 한다

- max-width : 499px일때 배경색은 red로 설정

- 또한 500 px ~ 799 px 일때 배경색은 green으로 설정

- min-width : 800px일때 배경색은 blue

- 그냥 실행시 (100%화면에서) 해상도가 800px이 넘어가므로 배경색이 blue

- 250%까지 확대되어 해상도가 799px보다 작고 500px보다 클떄는 배경색이 green

- 해상도가 499px 이하일때 배경색이 red

- 모바일로 접속시 해상도가 작아서 이렇게 빨간색으로 뜸

- 단말장치 크게에 따라서 다른 속성을 적용할때 @media (미디어 태그)를 사용한다

 

+ 모바일 장치처럼 실행해보자

- localhost 자리에 자기 컴퓨터 ip주소로 접속해보기

- 모바일로 접속시 배경이 빨간색으로 뜸 

 

@media 의 operation 속성

- @media 에서 스마트폰은 세로로 길게 볼수도 있고 옆으로 눕혀 볼수도 있고 가로로 볼수도 있다

- 그때마다 다른 화면 보여주기 위해서 orientation 속성을 사용함

- 세로방향일때 orientation : portrait 이고, 가로 방향일때 orientation : landscape

 

반응형 웹 만들기 예제

미디어 쿼리 예제2 / operation 속성 예제

- orientation.html

<!DOCTYPE html>
<html>
<head>
    <title>Media Feature</title>
    <meta name="viewport" content="user-scalable=no,initial-scale=1,maximum-scale=1" />
    <style>
    	/* 세로 방향 */
        @media screen and (orientation: portrait) {
            body {
                background-color: red;
            }
        }
        /* 가로 방향 */
        @media screen and (orientation: landscape) {
            body {
                background-color: green;
            }
        }
    </style>
</head>
<body>
    <h1>Lorem ipsum dolor sit amet</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras faucibus hendrerit nunc at consectetur. In hac habitasse platea dictumst. Ut a luctus neque, et tempor erat. Aliquam quis arcu id lectus fringilla volutpat id tempor lorem. Duis vitae odio vehicula dui vulputate mollis et sit amet mauris. Nulla facilisi. Praesent non sapien ac sapien malesuada ornare eget at libero. Aenean et faucibus arcu, id maximus mi. Curabitur tincidunt mi vitae orci porttitor, quis laoreet justo iaculis.</p>
</body>
</html>

- viewport 속성을 넣고 화면에 맞게끔 출력하겠다고 표시함

- orientation 은 방향을 의미하고

- orientation : portrat 는 세워져있을때를 의미, 배경색 red

- orientation : landscape는 눕혀져 있을때를 의미, 배경색 green

 

- PC로 접속시 가로 방향 기준으로 나온다

- 스마트폰 단말장치로 접속

스마트폰 : 세로방향
스마트폰 : 가로방향

 

반응형 웹 패턴

1. 데스크톱에서는 메뉴가 왼쪽에 있고, 모바일 장치에서는 메뉴가 위쪽에 있는 패턴

ex)

- 왼쪽은 PC로 접속했을때, 오른쪽은 모바일 장치로 접속했을때dlek

- 왼쪽의 창에서는 메뉴가 좌측에 나타나고 오른쪽의 창에서는 메뉴가 상단에 나타남.

 

 반응형 웹 패턴 예제

- pattern1.html

<!DOCTYPE html>
<html>
<head>
    <title>패턴1</title>
    <meta name="viewport" content="user-scalable=no,initial-scale=1,maximum-scale=1" />
    <style>
        * { 
            margin:0; 
            padding: 0;
        }

        body {
            width: 960px;
            margin: 0 auto;
            overflow: hidden;
        }

        #menu {
            width: 260px;
            float: left;
        }

        #section {
            width: 700px;
            float: right; /* left로 입력해도 상관 없습니다. */
        }

        @media screen and (max-width: 767px) {
            /* 스마트폰 사이즈에서는 전부 해제합니다. */
            body { width: auto }
            #menu { width: auto; float: none; }
            #section { width: auto; float: none; }
        }
    </style>
</head>
<body>
    <div id="menu">
        <ul>
            <li>메뉴A</li>
            <li>메뉴B</li>
            <li>메뉴C</li>
        </ul>
    </div>
    <div id="section">
        <h1>Lorem ipsum</h1>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec mollis urna sed turpis luctus laoreet. Fusce auctor maximus finibus. Nam ac dictum velit. Donec sit amet bibendum erat. Sed varius arcu est. Nullam maximus, libero id sollicitudin malesuada, nunc nunc varius neque, eu rhoncus dui nunc ac felis. Integer sit amet turpis metus. Nam id efficitur velit. Mauris suscipit, odio et dictum fermentum, nulla orci fermentum quam, a condimentum magna justo dictum leo. Aenean et odio mattis, maximus elit sed, fringilla est. Sed eget purus sit amet arcu elementum aliquet in eu mi. Donec dui tortor, viverra in fermentum ut, aliquam ac ipsum.</p>
    </div>
</body>
</html>

- PC 접속시 #menu가 float : left 이고, #section이 float : right ; 이므로 본문이 수평으로 오른쪽에 배치됨

- 최대 해상도가 max-width : 767px 인 경우에는, 즉 767px보다 작은 경우엔 속성들을 전부  auto, none으로 해제함으로서 PC화면의 배치 (메뉴는 왼쪽에, 본문은 오른쪽에) 를 해제함

- 모바일 화면일때는 width값이 auto이므로 내용이 부족하면 아래쪽으로 내려오게 되는 것임.

- PC로 봤을때 : 메뉴가 좌측에 있음

- 스마트폰으로 봤을때 : 메뉴가 상단으로 올라감

 

+ 프론트엔드는 신경쓸게 많다

- 브라우저 종류에 따라서도 보여주는 내용이 달라짐

- 스마트폰 기종에 따라서도 보여주는 내용이 달라짐


부트스트랩

부트스트랩 (Bootstrap)

- CSS 라이브러리를 제공하는 CSS 프레임워크

- CSS를 쉽게 쓸 수 있도록 외부 CSS 파일을 만들어서 제공함

- Bootstrap은 2010년 중반에 트위터 개발자 중 @mdo와 @fat을 사용하는 개발자가 만든 오픈소스 프레임워크
- 프레임워크란 "짜여있는 작업" 이란 뜻으로, 부트스트랩은 HTML, CSS, JavaScript 및 다양한 UI 컴퍼넌트로 구성

- 즉, 효율적인 웹 디자인을 하기 위해 미리 필요한 부분을 작업해 놓은 것

- 현재 Bootstrap 5점대까지 나와있다.

부트스트랩 사용 방법 2가지

1. 직접 다운하는 방식

2. CDN 방식

 

1. 직접 다운하는 방식

- 부트 스트랩 공식 사이트에서 해당 라이브러리 직접 다운로드 

- 부트스트랩 공식 사이트 : http://getbootstrap.com
-  Download Bootstrap 클릭해서 다운로드 받는다.

- 압축 해제하면 이런 css 파일들이 있는데 그걸 link 태그로 가져와서 사용한다.

- .min은 압축된 파일, 사진 속 여러 .css 파일 중 하나를 불러와서 쓰는 것

- 하나를 열어보면 몇천라인의 css코드가 있다



- 다운로드 받은 Bootstrap 파일들을 link 태그로 불러와서 사용함

        <link href="../css/bootstrap.min.css" rel="stylesheet">       
        <script src="../js/bootstrap.min.js"></script>

 

2. CDN 방식

- 라이브러리가 서버에 올라가있고 그 서버 주소를 알면 쓸 수 있다.

            <!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" integrity="sha512-dTfge/zgoMYpP7QbHy4gWMEGsbsdZeCXz7irItjcC3sPUFtf0kuFbDz/ixG7ArTxmDjLXDmezHubeNikyKGVyQ==" crossorigin="anonymous">

    <!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css" integrity="sha384-aUGj/X2zp5rLCbBxumKTCw2Z50WgIr1vs/PFN4praOTvYXWlVyh2UtNUU0KAUhAX" crossorigin="anonymous">

    <!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js" integrity="sha512-K1qjQ+NcF2TYO/eI3M6v8EiNYZfA95pQumfvcVrTHtwQVDG+aHRqLi/ETn2uB+1JqwYqVG3LIvdm9lj6imS/pQ==" crossorigin="anonymous"></script>

- 이러한 코드는 bootstrap 공식 페이지나 w3schools같은 페이지에서 가져올 수 있다.
- 참고 사이트:  http://www.w3schools.com
 

부트스트랩 레퍼런스

- 어느걸 어떻게 써야할지 모르므로 w3schools 등의 사이트에서 확인 가능함

https://www.w3schools.com

- 버전마다 적용할 클래스가 다름을 주의

- BS 3점대로 들어가보자

- 메인 화면에 관한 템플릿 제공해주는 Bootstrap Themes

- 사용하고 싶다면 Try it Yourself > 를 눌러서 나오는 소스코드를 통쨰로 가져오면 됨

- link 태그로 js를 불러오고 있다, 이런 방식이 CDN 방식

- BS는 기본적으로 반응형 웹으로 되어있음

 

- BS 4점대를 사용해보자(실습)

 

실습 준비

- WebContent 폴더 하위에 bootstrap 폴더 생성

- 그리고 클라우드 의 work폴더를 그대로 (미리 만들어진 파일들) 가져오자 

- 4점대 BS 파일들을 가져왔음

- 지금은 직접 다운받는 방식으로 부트스트랩을 쓸 것

- css 폴더 안에 css파일들이 js폴더 안에 js파일들이 들어있다

 

부트스트랩 사용 예제1

직접 다운 방식 예제

- WebContent/bootstrap/first.html 열어보기

- first.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

<!-- 방법1. bootstrap 다운로드 받은 파일 불러오기 -->
<link rel="stylesheet" href="css/bootstrap.css">
<script src="js/bootstrap.js"></script>

</head>
<body>

<img src="img/Koala.jpg" width=300 height=250 class="rounded"> <br><br>
<img src="img/Penguins.jpg" width=300 height=250 class="rounded-circle"> <br><br>
<img src="img/Jellyfish.jpg" width=300 height=250 class="img-thumbnail"> <br><br>

</body>
</html>

- 직접 다운받은 bootstrap 을 사용하는 방법이다.

- css 는 link 태그로 상대경로 지정해서 css파일을 불러옴

- js는 script 태그로 상대경로 지정해서 js파일을 불러옴

- img 태그로 이미지 3장을 불러오고 있는데 이 img에 여러 효과 처리 해보자

- 이때, class만 적용하면 효과를 줄 수 있다.

 

+ BS4 images : 이미지에 대한 여러 효과 관련

- 이건 CDN 방식의 코드이다

- 이미 직접 다운 받았으므로 class="rounded-circle"만 해주면 효과가 적용된다

 

 

BS를 직접 다운받았을때 장점

- 선택자의 내용을 속성값을 수정과 변경해서 적용 가능

- bootstrap.css 파일을 보자

 

부트스트랩 사용 예제2

CDN 방식 예제1

-  first.html 에서 첫번째 방식으로 직접 다운받는 방법을 사용헀으니 이번엔 CDN 방식을 사용해보자

- css나 js가 저장된 주솟값을 알아야함 -> w3school 에서 확인 가능

+ CDN : Content Delivery Network 약자

 

- 저 코드를 통째로 가져오면 된다. 이미지명만 바꿔주면 됨

- cdn.html

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  
  <!-- 방법2. CDN방식 -->
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Rounded Corners</h2>
  <p>The .rounded class adds rounded corners to an image:</p>            
  <img src="img/Koala.jpg" class="rounded" alt="Cinque Terre" width="304" height="236"> 

  <h2>Circle</h2>
  <p>The .rounded-circle class shapes the image to a circle:</p>            
  <img src="img/Penguins.jpg" class="rounded-circle" alt="Cinque Terre" width="304" height="236"> 

  <h2>Thumbnail</h2>
  <p>The .img-thumbnail class creates a thumbnail of the image:</p>            
  <img src="img/Jellyfish.jpg" class="img-thumbnail" alt="Cinque Terre" width="304" height="236"> 
</div>

</body>
</html>

- 부트스트랩 4.6.1 버전을 불러오고 있다
- 이 코드는 w3schools에서 복사한 코드 3 가지를 합쳐둔것

- 직접 다운방식으로 할때와 동일한 출력

 

 

부트스트랩 사용 예제3

CDN 방식 예제2

버튼 예제1

- 다양한 버튼 적용을 위해 클래스값만 다르게 설정하면 된다.

- Try it Yourself 누르기

- 그대로 복사하고 work 폴더 하위에 html 파일인 botton.html 생성하고 거기에 다 복붙

- botton.html

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Button Styles</h2>
  <button type="button" class="btn">Basic</button>
  <button type="button" class="btn btn-primary">Primary</button>
  <button type="button" class="btn btn-secondary">Secondary</button>
  <button type="button" class="btn btn-success">Success</button>
  <button type="button" class="btn btn-info">Info</button>
  <button type="button" class="btn btn-warning">Warning</button>
  <button type="button" class="btn btn-danger">Danger</button>
  <button type="button" class="btn btn-dark">Dark</button>
  <button type="button" class="btn btn-light">Light</button>
  <button type="button" class="btn btn-link">Link</button>      
</div>

</body>
</html>

- 클래스값이 어떤 값이냐에 따라 버튼 모양이 달라짐

- 어떤 버튼 모양 쓸건지만 선택하면 된다.

 

부트스트랩 사용 예제4

CDN 방식 예제3

버튼 예제2

- botton01.html 

- botton.html 과 비슷한 내용

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<div class="container">
  <h2>Button Styles</h2>
  <button type="button" class="btn">Basic</button>
  <button type="button" class="btn btn-primary">Primary</button>
  <button type="button" class="btn btn-secondary">Secondary</button>
  <button type="button" class="btn btn-success">Success</button>
  <button type="button" class="btn btn-info">Info</button>
  <button type="button" class="btn btn-warning">Warning</button>
  <button type="button" class="btn btn-danger">Danger</button>
  <button type="button" class="btn btn-dark">Dark</button>
  <button type="button" class="btn btn-light">Light</button>
  <button type="button" class="btn btn-link">Link</button> 
  <br><br><br>
  
  <button type="button" class="btn btn-secondary">가입</button> 
  <input type="button" value="확인" class="btn btn-secondary">
  
  <a href="#" class="btn btn-secondary">글작성</a>
  <div class="btn btn-secondary">로그인</div> 
  
       
</div>

</body>
</html>

- 가입 버튼에 마음에드는 버튼 모양을 적용

- 심지어 anchor 태그로 만든 '글작성' 도 이 클래스값 적용해서 버튼처럼 만들어짐

HTML 과 CSS의 역할

- HTML : div 태그, 시멘틱 태그를 활용해서 배치, 레이아웃을 잡는다

- CSS : 효과 등을 완성

 

CSS의 필요성

2단 레이아웃 잡기/3단 레이아웃 잡기

2단 레이아웃 잡기
3단 레이아웃 잡기

- html만으로 되지 않고 css적용되어야만 이렇게 배치 가능

- 레이아웃도 html 만으로 되지 않는 경우들이 있다

 

작업 디렉토리

- WebContent/CSS/web

- WebContent : WebContent가 홈디렉토리, 이 안에 html,css,js,jsp 등 파일 넣어야함

 

CSS 사용 방법

1. <head></head> 태그 안에 <style></style> 태그를 추가

- 내부에 CSS코드를 쓴다는 표시

- 임베디드 방식, 내장형 방식

+ <style type="text/css"> 로 해도되고 그냥 <style> 로 해도됨

 

- 선택자 자리에 적용할 범위를 쓴다, 여기선 태그 h1을 썼다

- 모든 h1태그들은 이 CSS의 적용을 받는다.

- { } 안에 속성 : 값; 을 쓴다

- 두가지 이상의 속성을 쓸때는 ; 를 찍고 구분하고 연결한다

 

내장형 방식 예제

CSS 예제1

- css01.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>css사용 예제</title>

<!-- 1. 내장형 방식(embedded) -->
<style>
h2 {
	font-family: 굴림;    /*  글꼴설정 */
	font-size: 18pt;	 /* 글자크기 */
	color: red;          /* 글자 색깔 */
}
h3 {
	font-family: 명조;
	font-size: 12pt;
	color: green;
}
</style>
</head>
<body>
	<h1>
		css에 대한 예제
		<hr>
	</h1>
	<h2>18pt크기의 빨간색 굴림체입니다.</h2>
	<h3>12pt크기의 초록색 명조체입니다.</h3>
</body>
</html>

css01.html 출력

- <head> 태그 안의 내용이 정해져있다
- style 태그로 CSS의 시작을 표시해야 브라우저가 이게 CSS 코드임을 인식함

- 위 예제에서 h1태그는 css적용되지 않았으므로 기본적인 형태로 나타남

 

구조

- 2개의 속성 연결할때는 세미콜론으로 구분

- h2 : 선택자 자리, 지금은 태그 h2를 의미
- 그리고 {} 안에 속성 : 값; 들이 있다

- body 태그안의 모든 h2태그에 대해서 이 속성들이 적용됨

- 선택자 자리에 이상한 기호가 오거나 여러개 오는등 선택자를 잘 이해해야함

속성
- font-family : 글꼴
- font-size : 글자 크기 설정
- color : 글자 색

+ html 의 font태그와 비슷한 역할 하고 있다, css를 쓰면 한꺼번에 효과 낼 수 있다


+ /* */ 이 주석, 주석 해제는 잘 안됨
+ Ctrl + Shift + / : 주석 처리

 

CSS 예제2

- css02.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

<!-- 선택자가 컴마(,)로 분리되어 있으면 모두(h2,p) 동일한 CSS의 적용을 받는다.-->
<style type="text/css">
h2, p {
	font-family: "arial black";
	font-size: 18pt;
	color: gold;
}
</style>
</head>
<body bgcolor="#990099">
	<center>
		<h2>
			css에 대한 예제
			<hr>
		</h2>
		<h2>The &nbsp;&nbsp; Fun &nbsp;&nbsp; Corner</h2>
		<br>
		<p>The &nbsp;&nbsp; Street &nbsp;&nbsp; Fair</p>
	</center>
</body>
</html>

css02.html 출력

- 선택자두개가 , 로 연결되어있다 (순서 무관)
- h2태그와 p태그가 , 로 연결

->  h2태그, p태그 모두 동일한 css 적용

 

- 중괄호 열고 적용할 속성 쓰기

- 이 h2태그에 대해 css가 적용되어서 컬러 gold, 18pt ,글꼴 arial black으로 나타남

- 모든 내용은 <center> 안에 들어가있으므로 가운데 배치됨

- &nbsp;  : 추가한 것과 비례해서 공백이 벌어짐, 소문자여야만 함

 

배경색

<body bgcolor="#990099">
</body>

- body 태그 안에서 html 속성으로 배경색 적용

CSS 예제3

- css03.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type=text/css>
h3 {
	color: #ff1aff
}
h5 {
	color: skyblue
}
h5 em {		/* h5(부모) em(자식) */
	color: white
}
</style>
</head>
<body bgcolor="blue">
	<h3>
		개봉 앞둔 애니메이션 <em>"포켓몬 3“</em>
	</h3>
	<hr>
	<h5>
		애니메이션 영화<em>“포켓몬 3”</em>의 홍보 인쇄물에 등장한 애쉬, 피카추 그리고 미스티의 모습입니다
	</h5>
</body>
</html>

css03.html 출력

- h5와 em 사이가 , 가 아니라 띄어쓰기가 되어있다 -> 의미가 달라짐

 

h5 em {		/* h5(부모) em(자식) */
	color: white
}

 

- h5가 부모태그, em태그가 자식 태그
- 바깥쪽에 감싸주는 태그가 부모태그고 안에 있는게 자식 태그 이다
- 지금처럼 띄어쓰기가 있는경우에는 h5가 바깥쪽에 있는 em 태그만 컬러값을 white로 적용시켜라는 의미임
- h3안의 em 태그의 내용은 white가 적용되지 않는다

 



CSS 예제4

- css04.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

<!--  
점(.)으로 된 선택자를 불러올때는 class 속성으로 불러와야 된다.
ex) <h1 class=java>
    <h1 class=script>
-->
<style type="text/css">
.java {
	color: pink
}
.script {
	color: skyblue
}
</style>
</head>
<body bgcolor="black" text="white">
	<h3>css의 클래스 정의를 이용한 예제입니다</h3>
	<h4 class=java>태그에 상관없이</h4>
	<h4 class=script>class 속성으로 태그이름을 설정할 수 있습니다</h4>
	<h2 class=java>태그에 상관없이</h2>
	<h2 class=script>원하는 부분에 스타일을 적용합니다</h2>
</body>
</html>

css04.html 출력

- 선택자가 .java처럼 .으로 되어있다

- .(점) 으로 선택자 지정해서 css적용할때는 클래스 속성으로(class=) 불러야함
- 특정 태그들만 선택하여 적용했던 이전의 코드들과 다르게 한가지 태그가 아니라 .java가 적용된 태그는 모두 적용 가능하다
- 적용하고자 하는 body 태그 안의 모든 태그에 모두 적용 가능

+ 부트스트랩에선 대부분 . 으로 선택자들이 만들어져 있으므로 적용할때 class속성으로 적용해야한다. 

- h3 태그는 적용이 안되어있다, 설정하지 않음
- h4 태그는 .java라는 선택자를 class=java로 불러오면 글자색이 pink로 나타남
- .script로 된것을 적용하기 위해선 class=script 로 불러온다

 

CSS 예제5

- css05.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

<!-- 
샵(#)으로 된 선택자를 불러올때는 id속성으로 불러와야 된다.
ex)  <h1 id=pinkstyle>
     <h1 id=skybluesty>
 -->
<style type="text/css">
#pinkstyle {
	color: pink
}
#skybluesty {
	color: skyblue
}
</style>
</head>
<body bgcolor="blue" text="white">
	<h4 id=pinkstyle>태그에 상관없이</h4>
	<h4 id=skybluesty>class속성으로 태그이름을 설정할 수 있습니다</h4>
	<h2 id=pinkstyle>태그에 상관없이</h2>
	<h2 id=skybluesty>원하는 부분에 스타일을 적용합니다</h2>
</body>
</html>

css05.html 출력

- CSS 범용적으로 적용하는 방법 2가지 (.으로 설정 , #으로 설정) 가 있다

- 그 중 # id 속성으로 적용하고 있다

- 선택자가 # (id 속성) 으로 만들어지는 경우가 가장 많다

 

CSS 범용적으로 적용하는 법 (선택자)

- . 으로 선택자 지정 : 클래스 속성 (class = ) 으로 해당 선택자를 불러서 CSS를 적용해야한다
- #으로 선택자 지정 : 아이디 속성 (id = ) 으로 해당 선택자를 불러서 CSS를 적용해야 한다

 

CSS와 Javascript에서의 id속성

- JS에서 설정하는 id 속성 와 CSS의 id 속성은 다르다

 

1. CSS에선 id는 css적용하기 위한 목적으로 사용한다.

	<h4 id=pinkstyle>태그에 상관없이</h4>
	<h4 id=skybluesty>class속성으로 태그이름을 설정할 수 있습니다</h4>

- 여기서의  id는 CSS를 적용시키기 위한 id값이다

- # 으로 된 선택자의 CSS가 선택됨

 

2. Javascript 에선 id 태그는 동일태그가 여러개 있을때 태그들을 구분하기 위한 역할을 한다

		<th>주소</th>
		<td><input type=text size=70 name="address" id="address">
		</td>

- input 태그가 여러개 있으므로 이 태그들을 구분하기 위한 태그가 id 이다

- input태그를 구해와서 사용자가 id값 입력했는지 유효성검사를 할때 input을 구분하기 위한 역할로 id값을 다르게 설정한다

 

+ 부트스트랩

- CSS 프레임워크

-  대부분은.(점) 으로 선택자가 지정되어있다, 클래스 속성으로 적용해야한다

 

CSS 사용 방법

1. <head></head> 태그 안에 <style></style> 태그를 추가, <body></body> 에 적용됨 = 내장형 방식, 여태까지 했다

 

2. CSS를 외부 파일로 만들고 link 태그로 불러온다

- 확장자를 .css 파일로 만든다

+ 부트스트랩도 .css 파일로 되어있다, 서버에 올라가 있는것을 cdn방식으로 다운받아 사용함

- 딱 CSS 코드만 들어간다

- 단독으로는 아무 효과가 없고 불러와서 사용함

- link 태그로 불러온다

- 한번 만들어진 css 파일을 여러 html 파일에 적용 가능

 

CSS 외부파일 불러오기 예제

- style.css

p{ color : pink ;
   font-size : 20pt ;
   font-weight : bold ;
  }

- call.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>외부 css파일 불러오기</title>

<!-- 2. 외부 css파일 불러오기 -->
<link rel=stylesheet type=text/css href=style.css>
</head>
<body bgcolor="purple" text="white">
	<h3>외부 파일에 정의한 스타일을 적용</h3>
	<hr>
	<p>글자색은 핑크색, 글자 크기는 20pt, 글자의 속성은 bold로 지정한 스타일이 적용됩니다</p>
</body>
</html>

 

- html 파일의 <head> 태그안에서 <link> 태그로 불러온다

- href = 불러올 파일 을 쓴다

- 상대경로나 절대경로로 불러올 파일의 경로를 잡아줘야한다.

- link로 외부파일 .css를 불러오면 이 파일의 <body> 태그 안에서 불러온 CSS가 적용된다

 

call.html 출력

- body 태그 안에 white 속성이 있으므로 기본 색상은 white 로 나온다

- p 태그에는 css가 적용되어서 글자색이 pink 이다

 

+ <head> 태그 안에 주로 들어가는 내용

- <meta> 태그

- <title> 태그

- <style> 태그

 - <link 태그

 

ex) 네이버에서 외부파일 불러오는거 소스 코드 일부

<link rel="stylesheet" href="https://pm.pstatic.net/dist/css/nmain.20220720.css"> <link rel="stylesheet" href="https://ssl.pstatic.net/sstatic/search/pc/css/sp_autocomplete_220526.css">

- css 파일들이 임시폴더에 이미 다운로드 받아져있다

- 이 파일들은 서버에 올라가있다, cdn 방식이라고 한다

- 한번 만들어진 css 파일을 여러 html 파일에 적용 가능 (동일 컨셉)

 

CSS 사용 방법

1. <head></head> 태그 안에 <style></style> 태그를 추가, <body></body> 에 적용됨 = 내장형 방식, 여태까지 했다

2. CSS를 외부 파일로 만들고 link 태그로 불러온다

 

3. 특정 태그 1개에 대해서 style= 로 CSS 를 적용하는 방식

- 인라인 방식

- 지금까지는 동일 태그들은 모두 한꺼번에 적용되었따

- 특정 원하는 태그 1개에만 CSS를 적용하는 방식

 

인라인 방식 예제

- div1.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<TITLE>범위 안에서 스타일 지정</TITLE>
</HEAD>

<!-- 3. 인라인 방식
1) 특정 태그 1개에 대해서 	CSS를 적용하는 방식이다.
2) 인라인 방식의 형식은 특정 태그에 style="속성:속성값" 형식으로 CSS를 적용한다.
   ex) <div style="color : red">
 -->
<BODY BGCOLOR="white">
	<CENTER>
		<H1>
			<SPAN STYLE="font-style: italic">범위 안에서</SPAN> 스타일 지정
			<DIV STYLE="color: red">범위 안에서 스타일 지정</DIV>
		</H1>
	</CENTER>
</BODY>
</HTML>

- 특정 태그 안에 style = 을 쓰고 " " 안에 속성 : 값 을 나열한다

- <span> 이란 1개의 특정 태그에 대해서만 css를 적용시키고 있다. style="font-style : italic"

- <div> 이란 1개의 특정 태그에 대해서만 css를 적용시키고 있다. style="color : red"

+ h1 태그로 감싸져있으므로 안의 내용이 크고 굵게 출력됨

+ center 태그 안에 작성되었으므로 가운데 정렬됨

+ 배경색은 white 이다

 

div1.html 출력

 

CSS 사용 방법 정리

1. <head></head> 태그 안에 <style></style> 태그를 추가, <body></body> 에 적용됨 = 내장형 방식, 여태까지 했다

2. CSS를 외부 파일로 만들고 link 태그로 불러온다

3. 특정 태그 1개에 대해서 style= 로 CSS 를 적용하는 방식

 

CSS 사용 방법 응용 예제 1

- div2.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<TITLE>범위 안에서 스타일 지정</TITLE>
<STYLE TYPE="text/css">
DIV.color {
	color: tomato
}
.style {
	font-style: italic
}
</STYLE>
</HEAD>
<BODY BGCOLOR="white">
	<CENTER>
		<h2 class="color">css 적용하기</h2>
		<H1>
			<DIV class="color">
				전체 범위 안에서 색 지정<BR> <SPAN class="style">범위 안에서 이탤릭으로 지정</SPAN>
			</DIV>
		</H1>
	</CENTER>
</BODY>
</HTML>

- . 으로 된 선택자는 class 속성으로 불러오면 해당 css가 적용됨

 

DIV.color와 .style의 선택자의 차이

공통점 : class 속성으로 불러와야한다

차이점 : 의미가 다르다

 

1. DIV.color 선택자 처럼 앞에 태그명이 오는 경우

- 아무 태그나 적용되지 않는다

- h2태그에서 class="color"를 부르면 적용 안됨

- DIV 태그에서 class="color'를 부르는 경우에만 적용된다

- 선택의 폭이 좁아짐

 

2. .style 로 앞에 태그명이 안오는 경우

- 아무 태그나 class 속성을 적용하면 이 스타일이 적용되면서 italic 적용

 

div2.html 출력

- h2 태그에서 class="color" 로 .color 선택자를 불러오더라도 적용이 되지 않고 토마토색이 아닌 검은색으로 출력됨

- DIV 태그에서 class="color" 로  .color 선택자를 불러와야만 CSS가 적용이 된다, 토마토 색으로 출력된다

 

CSS 사용 방법 응용 예제 2 / text-decoration 속성 예제1

decoration.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<TITLE>링크되는 부분의 밑줄 없애기</TITLE>
<STYLE TYPE="text/css">
	A:link {text-decoration: none}
	A:hover {text-decoration: underline}
	A:visited {	text-decoration: none}
</STYLE>
</HEAD>
<BODY BGCOLOR="white">
	<CENTER>
		<BR> <A HREF="http://www.yahoo.com">메인 페이지로 이동합니다.</A>
	</CENTER>
</BODY>
</HTML>

decoration.html 출력

- 하이퍼링크 anchor 태그로 링크가 걸리면 밑줄이 자동으로 나타난다

- 밑줄 여부를 제어할때 사용하는게 text-decoration 속성이다

- anchor 태그의 4가지 상태에 따라 나눠서 세부적인 CSS를 다르게 적용할 수 있다

ex) A:Link : anchor 태그의 상태 중 Link 상태일때 적용

- : 을 찍고 상태를 적어서 서로 다른 CSS를 적용시킴

 

위 예제 설명

1. 코드에서 link 상태일때 : none

2. 코드에서 hover 상태일때 : underline

3. 코드에서 visited 상태일때 : none

text-decoration 속성

- none : 선을 그리지 않음

- underline : 텍스트 밑에 선을 그려줌

- line-through : 텍스트 가운데 취소선을 그려줌

- overline : 텍스트 위에 선을 그려줌

+ 주로 anchor 태그에 적용을 많이 시킨다

 

anchor 태그의 4가지 상태

1. link 상태

- 기본으로 링크가 걸려있을때 

- A : link { 속성 : 속성값 } 으로 적용

네이버 참고 (link 상태)

2. active 상태

- 링크가 걸린 라인을 마우스 왼버튼으로 "누르고" 있는 상태

- A : active { 속성 : 속성값 } 으로 적용

 

3. hover상태

- 누르진 않고 마우스 포인터가 올라간 상태 (손모양)

- A : hover{ 속성 : 속성값 } 으로 적용

네이버 참고 (hover 상태)

4. visited 상태

- 한번 방문하고 돌아왔을때

- A : visited { 속성 : 속성값 } 으로 적용

네이버 참고 (visited 상태)

 

text-decoration 속성 예제2

 - textdecoration.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<TITLE> 텍스트에 선 그려주기 </TITLE> 
</HEAD>
<BODY BGCOLOR="white">
   <H2> 텍스트에 선 그려주기 </H2>
   <P STYLE="text-decoration: none"> 선을 그려주지 않습니다 </P>
   <P STYLE="text-decoration: underline"> 텍스트 밑에 선을 그려줍니다 </P>
   <P STYLE="text-decoration: line-through"> 텍스트 가운데 취소선을 그려줍니다 </P>
   <P STYLE="text-decoration: overline"> 텍스트 위에 선을 그려줍니다 </P>
   <P STYLE="text-decoration: underline overline"> 텍스트에 밑과 위 모두 선을 그려줍니다 </P>
</BODY>
</HTML>

- 인라인 방식을 사용하고 있다

textdecoration.html 출력

 

정리

- text-decoration 속성 : 하이퍼링크 밑줄 여부 제어

 

교재 학습

+ HTML/source/chapter_5, chapter_6, chapter_7 이 CSS 관련 내용이다

 

선택자

- HTML/source/chapter_5 설명할 것

 

- * : 모든 태그에 대해 선택하라

- . : class 속성으로 불러오기

- # : id 속성을 ㅗ불러오기

- 태그 : 그 태그 모두에게 적용하기

- 선택자 선택자 : 왼쪽이 부모, 오른쪽이 자식, 후손 태그가 된다

- 부등호기호가 있는 선택자가 있다, 선택자 사이 띄어쓰기 한것과 다름

- 상태 선택자 알아두자

- + 나 ~ 선택자 알아두가

- link, visited 했었다

 

이런 내용들을 예제를 통해서 공부할 것 

 

선택자 예제1

- selector_basic.html

<!DOCTYPE html>
<html>
<head>
  <title>CSS3 Selector Basic</title>
  <meta charset=utf-8>
  <style>
    h1 {
      color: red;
      background-color: orange;
    }
  </style>
</head>
<body>
  <h1>CSS3 선택자 기본</h1>
</body>
</html>

- 내장형 방식, <body>태그에 적용

- <body> 태그안의 모든 <h1> 태그는 css의 적용을 받는다

- 전체 배경색이 아닌 h1태그에만 적용됨

- 전체 배경색을 적용하려면 body 태그안에 bgcolor 작성

selector_basic.html 출력

 

선택자 예제2

- default_wildcard.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Selector Basic Page</title>
    <style>
        * { color: red; }
    </style>
</head>
<body>
    <h1>제목 글자 태그</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nisi risus, sollicitudin eget vehicula sed, eleifend suscipit neque. Proin rhoncus, ante vitae mattis consequat, libero nunc posuere justo, ut laoreet dolor nunc at dolor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas dictum, lectus vestibulum laoreet tincidunt, nisi augue blandit risus, ut vestibulum erat dolor sit amet risus. Praesent semper consectetur mi eget auctor. Nulla facilisi. Duis bibendum massa in dui interdum sed tincidunt massa eleifend.</p>
</body>
</html>

- 선택자 자리에 * 가 온다

- 모든 태그, 즉 all tags 에 적용

default_wildcard.html 출력

- <body> 태그 안의 모든 태그들에 CSS 가 적용되어 red 로 나타나고 있다

 

선택자 예제3

- default_tag.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Selector Basic Page</title>
    <style>
        h1 { color: red; }
        p  { color: blue; }
    </style>
</head>
<body>
    <h1>제목 글자</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nisi risus, sollicitudin eget vehicula sed, eleifend suscipit neque. Proin rhoncus, ante vitae mattis consequat, libero nunc posuere justo, ut laoreet dolor nunc at dolor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas dictum, lectus vestibulum laoreet tincidunt, nisi augue blandit risus, ut vestibulum erat dolor sit amet risus. Praesent semper consectetur mi eget auctor. Nulla facilisi. Duis bibendum massa in dui interdum sed tincidunt massa eleifend.</p>
    <p>Etiam lacus felis, ornare non lobortis ac, vehicula non diam. Integer pellentesque neque eget eros pulvinar pharetra. Maecenas gravida mi dui, at sollicitudin justo. Vestibulum pretium lacus lobortis arcu egestas dapibus. Sed nunc dui, adipiscing vitae mattis in, accumsan in neque. Sed pellentesque leo quis lorem posuere consequat. Duis sapien risus, rutrum ut ullamcorper et, accumsan a lorem. Ut metus est, varius eget molestie vitae, rutrum vitae ante. Quisque eu quam leo, et hendrerit lorem. Nullam nec risus sapien. Phasellus ut mauris eget justo mollis dictum. Nullam consectetur nibh at sem luctus mollis.</p>
</body>
</html>

default_tag.html 출력

- 모든 h1 태그에 대해 color : red 적용되었다

- 모든 p 태그에 대해 color : blue 적용되었다

 

선택자 예제3

- default_id.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Selector Basic Page</title>
    <style>
        #header {
            width: 800px; margin: 0 auto;
            background: red;
        }
        #wrap {
            width: 800px; margin: 0 auto;
            overflow: hidden;
        }
        #aside {
            width: 200px; float: left;
            background: blue;
        }
        #content {
            width: 600px; float: left;
            background: green;
        }
    </style>
</head>
<body>
    <div id="header">
        <h1>#header 태그</h1>
    </div>
    <div id="wrap">
        <div id="aside">
            <h1>#aside 태그</h1>
        </div>
        <div id="content">
            <h1>#content 태그</h1>
        </div>
    </div>
</body>
</html>

- #으로 선택자가 지정되어있고, 불러올 때는 id 속성으로 불러와서 적용한다

- #header, #wrap, #aside 등 # 의 css 사용 -> id 속성으로 불러온다

- 시맨틱 태그인 header 태그 를 이용해도 되고 , div 태그를 사용해도 된다

- div는 박스를 만들어줌

- div는 자체적으로는 아무 기능이 없다

- #aside와 #content가 둘 다 float : left 지만 aside가 먼저 나왔으므로 왼쪽 정렬되고 다음에 content가 붙어서 정렬된다

 

속성

- width : 가로길이 값 속성

- margin : 0 auto -> 가운데 배치시켜줌

- overflow : 내용이 많아서 크기를 넘치게되면 hidden으로 보이지 않게 만들고있다

- float : 특정 div를 왼쪽에 배치할땐 left, 오른쪽에 배치할땐 right

- background : 배경색

 

default_id.html 출력

 

+ 2-layout.html 잠깐보기

- 주로 #으로 되어있다, #을 많이 사용함

<!DOCTYPE html>

<html lang="ko">
<head>
    <meta charset="utf-8">
    <title>2단 레이아웃</title>
    	<style>
		div {
			border: 1px solid #ccc; /* 모든 영역에 테두리 표시 */
		}
		#container {
			width:960px; /* 컨테이너 너비 */
			padding:20px; /* 패딩 */			
			margin:0 auto;  /* 화면 중앙에 배치 */
		}
		#header {
			padding:20px;  /* 패딩 */
			margin-bottom:20px;  /* 아래 요소들과의 간격(마진) */
		}
		#contents {
			width: 620px;  /* 너비 */
			padding: 20px;  /* 패딩 */
			float: left;  /* 왼쪽으로 플로팅 */
			margin-bottom: 20px;  /* 아래 요소와의 간격 */
		}
		#sidebar {
			width: 220px;  /* 너비 */
			padding: 20px;  /* 패딩 */
			float: right;  /* 오른쪽으로 플로팅 */
			margin-bottom: 20px;  /* 아래 요소와의 간격 */
			background:#eee;
		}
		#footer {
			clear:both;  /* 양쪽 플로팅 해제 */
			padding:20px;  /* 패딩 */
		}
	</style>
</head>
<body>
    <div id="container">
        <div id="header">
			<h1>사이트 제목</h1>
		</div>
		<div id="sidebar">
			<h2>사이드 바</h2>
            <ul>
                <li>모든 국민은 근로의 의무를 진다. 국가는 근로의 의무의 내용과 조건을 민주주의원칙에 따라 법률로 정한다.</li>

            </ul>
		</div>
		<div id="contents">
			<h2>본문</h2>
            <p>재산권의 행사는 공공복리에 적합하도록 하여야 한다. 정부는 회계연도마다 예산안을 편성하여 회계연도 개시 90일전까지 국회에 제출하고, 국회는 회계연도 개시 30일전까지 이를 의결하여야 한다.</p>

            <p>대통령의 임기가 만료되는 때에는 임기만료 70일 내지 40일전에 후임자를 선거한다. 제2항과 제3항의 처분에 대하여는 법원에 제소할 수 없다. 언론·출판에 대한 허가나 검열과 집회·결사에 대한 허가는 인정되지 아니한다.</p>
		</div>
		<div id="footer">
			<h2>푸터</h2>
            <p>이 헌법시행 당시의 법령과 조약은 이 헌법에 위배되지 아니하는 한 그 효력을 지속한다.</p>
		</div>
    </div>
</body>
</html>

 

선택자 예제4

- default_class.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Selector Basic</title>
    <style>
        .select { color: red; }
    </style>
</head>
<body>
    <ul>
        <li class="select">사과</li>
        <li>바나나</li>
        <li class="select">오렌지</li>
        <li>감</li>
    </ul>
</body>
</html>

- . 으로 된 선택자를 사용하고 있고, class 속성으로 불러오고 있다

- bootstrap에서 주로 . 으로 된 선택자를 사용하고 있다, class 속성으로 불러와야한다

default_class.html 출력

 

선택자 예제5

- . 을 2개를 적용하려 한다면?

- default_multiClass.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Selector Basic</title>
    <style>
        .item { color: red; }
        .header { background-color: blue; }
    </style>
</head>
<body>
    <h1 class="item header">동해물과 백두산이</h1>
</body>
</html>

- 두개의 선택자를 동시에 적용하고 있다

- .item 과 .header를 모두 적용하려 한다면 태그에서 class="item header" 로 써주면 두 가지가 다 적용됨

- 즉 color : red 와 background-color : blue 가 모두 적용됨 

default_multiClass.html 출력

 

선택자 예제5

- <input type=> 같은 태그에 css 적용시키려면 구분이 필요하다, id값이나 class값이 필요하다

- attribute_basic.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Selector Basic Page</title>
    <style>
        input[type="text"] { background: red; }
        input[type="password"] { background: blue; }
    </style>
</head>
<body>
    <form>
        <input type="text" />
        <input type="password" />
    </form>
</body>
</html>

- input[type="text"] : input type= 이 text인 "모든" 태그들을 불러와라는 의미 -> background : red

- input[type="password"] : input type= 이 password인 "모든" 태그들을 불러와라는 의미 -> background : blue

- type 이 있는 태그에서 특정 양식을 불러올때 사용되는 선택자다

attribute_basic.html 출력

 

후손 태그

- 부모태그, 자손태그(자식태그), 후손태그 가 있다

- 자식태그는 바로 아래의 태그들만 의미함

- 자식도 후손 태그에 포함됨

- 상속관계와는 관계 없다

 

선택자와 자식/후손태그

- 선택자A 선택자B : 왼쪽의 선택자 A태그가 부모태그가 되고, 오른쪽의 선택자 B태그가 후손태그 의미

- (자식태그 or 후손태그) 다 된다

- 만약 부등호기호(화살표)가 있을땐 자식태그만을 의미

 

자식태그와 후손태그 구분

선택자 예제6

후손 선택자/자손 선택자 예제1

- desc_decendants.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Selector Basic</title>
    <style>
        #header h1  { color: red; }
        #section h1 { color: orange; }
    </style>
</head>
<body>
    <div id="header">
        <h1 class="title">Lorem ipsum</h1>
        <div id="nav">
            <h1>Navigation</h1>
        </div>
    </div>
    <div id="section">
        <h1 class="title">Lorem ipsum</h1>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nisi risus, sollicitudin eget vehicula sed, eleifend suscipit neque. Proin rhoncus, ante vitae mattis consequat, libero nunc posuere justo, ut laoreet dolor nunc at dolor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas dictum, lectus vestibulum laoreet tincidunt, nisi augue blandit risus, ut vestibulum erat dolor sit amet risus. Praesent semper consectetur mi eget auctor. Nulla facilisi. Duis bibendum massa in dui interdum sed tincidunt massa eleifend.</p>
    </div>
</body>
</html>

desc_desendants.html 출력

선택자

- #header h1 : 띄어쓰기가 되어있다, 왼쪽인 #header로 불러오는 태그가 부모태그이고 오른쪽인 h1 태그가 후손태그이다

 - 바로 아래쪽인 자식태그인 h1태그  Lorem ipsum 에만 적용되는 것이 아니라 Navigation 인 손자태그(후손태그) 에도 적용된다

- 즉, #header를 통해 불러진 태그가 부모태그고 그 태그 안의 모든 h1에 css color : red가 적용된다

- 바로 아래쪽의 자식 Lorem ipsum 에게만 적용하고 싶다면 선택자로 #header>h1을 사용해야한다

 

- #section h1의 경우에도 마찬가지이다

 

선택자 예제7

후손 선택자/자손 선택자 예제2

- desc_children.html

<!DOCTYPE html>
<html>
<head>
	<title>CSS3 Selector Basic</title>
	<style>
		#header > h1 { color: red; }
		#section > h1 { color: orange; }
	</style>
</head>
<body>
	<div id="header">
		<h1 class="title">Lorem ipsum</h1>
		<div id="nav">
			<h1>Navigation</h1>
		</div>
	</div>
	<div id="section">
		<h1 class="title">Lorem ipsum</h1>
		<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
	</div>
</body>
</html>

- 선택자A > 선택자B 에서 왼쪽이 부모태그, 오른쪽이 자식태그 가 된다.

- #header > h1 이면 #header를 부르는 태그가 부모태그, 그 태그 안의 h1태그가 자식 태그가 된다.

- > 를 쓰면 후손이 아닌 바로 아래쪽의 자식 태그들에게만 적용되고 자식을 제외한 후손에게는 적용되지 않는다.

- #header 안의 자식태그인 h1태그의 Lorem ipsum 에만 color : red가 적용되고, 자식이 아닌 후손태그인 Navigation에는 color : red가 적용되지 않는다.

- #section > h1 의 경우에도 마찬가지이다.

desc_children.html 출력

 

후손선택자 자손선택자 정리

부모 후손 : 공백 사용, 후손(자식태그 + 자식이 아닌 후손태그)

부모>자식 : > 사용, 자식 태그만 적용

 

후손 선택자/자손 선택자 예제3

- desc_tableWithChildren.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Selector Basic</title>
    <style>
        table > tr > th {
            color: red;
        }
    </style>
</head>
<body>
    <table border="1">
        <tr>
            <th>이름</th>
            <th>지역</th>
        </tr>
        <tr>
            <td>윤인성</td>
            <td>서울특별시 강서구 내발산동</td>
        </tr>
    </table>
</body>
</html>

- 자손 선택자 > 를 3단으로 사용하고 있다.

- 출력시 빨간색 글자가 적용되지 않는다!

- 개발자 도구에 가서 이유를 확인하자

 

개발자 도구 들어가는법

- 단축키 F12

- 또는 도구 더보기 - 개발자 도구

코드 구조

- 작성시에는 작성하지 않았지만 자동으로 tbody 태그가 오기때문에 table > tbody > tr > th 로 해야 적용됨

 

수정한 코드

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Selector Basic</title>
    <style>
        table > tbody > tr > th {
            color: red;
        }
    </style>
</head>
<body>
    <table border="1">
        <tr>
            <th>이름</th>
            <th>지역</th>
        </tr>
        <tr>
            <td>윤인성</td>
            <td>서울특별시 강서구 내발산동</td>
        </tr>
    </table>
</body>
</html>

- 잘 출력되고 있다

- 이런 것들에 유의하자, 개발자 도구에서 확인 가능

 

반응 선택자

- 주로 anchor 택에 적용시키지만 다른 태그에도 적용 가능

- h1:hover 하면 h1태그 해당 하는 곳에 마우스를 올려둔 상태일때 의미

 

반응 선택자 예제

- etc_action.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Selector Basic</title>
    <style>
        h1:hover { color: red; }
        h1:active { color: blue; }
    </style>
</head>
<body>
    <h1>반응 선택자</h1>
</body>
</html>

원래 상태

hover 상태 

- 마우스를 올리고 있는 상태

- ( 마우스 오버 이벤트 ) <-> ( 마우스 아웃 이벤트 )

active 상태

 

- 마우스 왼쪽으로 누르고 있는 상태

 

상태 선택자

- 상태를 의미하는 선택자들

- :checked : 체크박스등에서 체크가 되어있는 상태

- :focus : focus가 들어간 상태

- :enabled : 사용 가능한 상태

- :disabled :사용 불가능한 상태

이 상황이 되면 이 상황에 맞는 효과가 나타남

 

상태 선택자 예제

- etc_state.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Selector Basic</title>
    <style>
        /* input 태그가 사용 가능할 경우에
           background-color 속성에 white 키워드를 적용합니다. */
        input:enabled { background-color: white; }

        /* input 태그가 사용 불가능할 경우에
           background-color 속성에 gray 키워드를 적용합니다. */
        input:disabled { background-color: gray; }

        /* input 태그에 초점이 맞추어진 경우에
           background-color 속성에 orange 키워드를 적용합니다. */
        input:focus { background-color: orange; }
    </style>
</head>
<body>
    <h2>사용 가능</h2>
    <input />
    <h2>사용 불가능</h2>
    <input disabled="disabled"/>
</body>
</html>

+ type=text는 기본값이라 생략 가능하다

+ 텍스트 박스 비활성화 시키는 방법 2가지 : readonly / disabled , 현재는 disabled 속성 -> 수정 변경 불가

- 사용 가능한 경우는 background-color : white 를 적용하고

- 이렇게 사용 불가능할때 background-color : gray 를 적용한다

- enabled 상태 (기본적인 상태, 위)

- disabled 상태 (아래)

focus 상태

- focus 상태일 때 (위)

 

구조 선택자

- 몇번째 자식인지 선택

 

CSS 단위

- 크기를 표현하는 여러 단위들이 있다

- 상대적인 단위도 있고 절대적인 단위도 있다

 

스타일 시트에서 사용되는 단위

1. 절대적인 단위

- in 인치 (1 inch = 2.54 cm)

- cm 센티미터

- mm 밀리미터

- pt 포인터 (1 point = 1/72 inch)

- pc 파카스 (1 picas = 12 포인터)

 

2. 상대적인 단위

- em : 폰트의 높이를 측정하기 위한 단위로 영문 대문자 M을 기준으로 함. 이 M의 길이가 1em

- ex : 폰트 높이의 반을 측정하는 것으로 영문 소문자 x가 기준임

- px : 1픽셀을 1로 하는 단위 (width height에서 단위 생략 시 기본 단위)

- % : 기준이 되는 크기에 대한 상대적인 비율

+ %단위는 기준이 되는 값에서 몇 % 크기인지 설정함, ex) 100% 150% 200%

 

색상 단위

ex) HEX 코드 #ff0000 : red

ex) RGB 색상 rgb(255, 0, 0) : red

- 주로 HEX 코드 형태를 많이 쓴다.

- RGBA 에서 A는 알파를 의미하고 알파값은 투명도를 의미한다.

- 0 은 완전 투명, 1은 완전 불투명이다.

 

글자 색상 red 적용하는 방법 예제

    <style> /* 전부 같다 */
/*         h1:hover { color: red; } */
/*         h1:hover { color: #ff0000; } */
        h1:hover { color: rgb(255,0,0); }
    </style>

+ 색상 코드는 rgb 색상표를 검색하면 쉽게 찾을 수 있다

 

CSS의 속성

- HTML/source/chapter_6 설명할 것

- div 태그로 박스를 만든다, div 태그 자체는 아무 기능이 없음

- 그 div 태그에 css 속성을 추가하면 다양한 형태, 모양을 만들 수 있다

 

박스(div)의 속성

- border : 테두리 설정 속성

- margin : 테두리와 바깥쪽의 내용사이 간격

- padding : 테두리와 내용사이 간격

 

div 태그 속성 예제1

- box_withHeight.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS Property Basic</title>
    <style>
        div {
            width: 100px; height: 100px;
            background-color: red;
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>

- 아래 div 태그만으로는 아무 역할을 하지 못하지만 css가 적용되면 다양한 모양이 됨

- 박스(공간) 을 정사각형 모양으로 출력 ( 가로 100px, 세로 100px )

- 배경색은 red

- 이 영역이 div 영역이다

 

div 태그 속성 예제2

- margin / padding 속성 관련

- box_marginPadding.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS Property Basic</title>
    <style>
        div {
            width: 100px; height: 100px;
            background-color: red;
 
            border: 20px solid black;
            margin: 10px; padding: 30px;
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>

- 한꺼번에 적용할땐 나열한다 ex) border : 20px solid black; -> 테두리를 20px, 실선, 검정색으로 설정하라

- margin은 테두리와 다른 영역사이 간격

- padding은 테두리와 내용 사이 간격

 

- margin과 padding을 바꿔보자

- margin : 10px -> margin : 100px

- div 내부에 내용 작성하기

<!DOCTYPE html>
<html>
<head>
    <title>CSS Property Basic</title>
    <style>
        div {
            width: 100px; height: 100px;
            background-color: red;
 
            border: 20px solid black;
            margin: 100px; padding: 30px;
        }
    </style>
</head>
<body>
    <div>박스만들기</div>
</body>
</html>

- padding은 좌측 상단을 기준이다.

 

margin과 padding의 세분화

- 왼쪽에 떨어진 간격, 위에서 떨어진 간격 등

- 이렇게 세분화하여 4가지씩으로 나눠서 속성을 적용할 수 있다

 

네 방향 속성 지정하기

- 또한 margin 과 padding을 한번씩 쓰는데 4가지 값을 쓸 수 있다

- 순서는 시계방향

네 방향 속성 지정하기 예제

- box_marginPaddingEachFour.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS Property Basic</title>
    <style>
        div {
            width: 100px; height: 100px;
            background-color: red;

            /* margin: 위 오른쪽 아래 왼쪽 */
            /* padding: 위 오른쪽 아래 왼쪽 */
            margin: 0 30px 0 30px;
            padding: 0 30px 0 30px;
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>

 

두 방향 속성 지정하기

- 또한 margin 과 padding을 한번씩 쓰는데 2가지 값을 쓸 수 있다

- 순서는 위아래 왼오

두 방향 속성 지정하기 예제

- box_marginPaddingEachTwo.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS Property Basic</title>
    <style>
        div {
            width: 100px; height: 100px;
            background-color: red;

            /* margin: 위아래 왼쪽오른쪽 */
            /* padding: 위아래 왼쪽오른쪽 */
            margin: 0 30px; padding: 0 30px;
        }
    </style>
</head>
<body>
    <div>박스만들기</div>
</body>
</html>

 

border 속성

1. 여러 속성을 따로 지정할 수도 있고

2. 한꺼번에 값들을 나열해서 속성을 적용할 수 있다

 

border 속성 예제1

- border_basic.html

1. border_width, border-style, border-color 처럼 따로 속성을 지정하는 방법

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        .box {
            border-width: thick;
            border-style: dashed;
            border-color: black;
        }
    </style>
</head>
<body>
    <div class="box">
        <h1>Lorem ipsum dolor amet</h1>
    </div>
</body>
</html>

- border-width : thick = 두꺼운 선

- border-style : dashed = 점선

- border-color : black = 검정선

- 이렇게 따로 속성을 다 써서 적용시키고 있다

border 속성 예제2

2. border를 한번만 쓰고 한꺼번에 적용하는 방법

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        .box {
/*             border-width: thick;
            border-style: dashed;
            border-color: black; */
            border : thick dashed black;
        }
    </style>
</head>
<body>
    <div class="box">
        <h1>Lorem ipsum dolor amet</h1>
    </div>
</body>
</html>

- 같은 결과를 출력

+ 또한 border-top, border-bottom, border-left, border-right 처럼 세분화해서 적용할 수도 있다

 

+ 2-layout.html에서 전체가 div로 만들어져있고 div안에 div가 여러개 들어가있다

+ 컬러코드 #ccc = #cccccc 같은게 2개 반복될때는 1개로 쓰기도 한다 cc->c

 

둥근 테두리 만들기

- border-radius : 모서리 완만하게 만드는 속성, 이 값이 클수록 원에 가까운 형태가 됨

 

둥근 테두리 만들기 예제1

- border_radius.html

<!DOCTYPE html>
<html>
<head>
    <title>CSS3 Property Basic</title>
    <style>
        .box {
            border-width: thick;
            border-style: dashed;
            border-color: black;

            border-radius: 20px;
        }
    </style>
</head>
<body>
    <div class="box">
        <h1>Lorem ipsum dolor amet</h1>
    </div>
</body>
</html>

 

- border-radius 값을 40으로 수정

- border-radius 값이 클수록 원에 가까워짐, 더욱 완만해짐

- border-radius만 쓰면 4개의 모서리에 대해 똑같이 적용된다.

 

4개의 모서리별로 따로 둥글기 설정 예제

- 4개의 모서리 별로 따로 적용하는 것도 가능하다

- border_radiusEach.html

- 그림 참고

div 태그의 display 속성

- 박스를 여러개 만들었을때 가로방향으로 배치할건지 세로방향으로 배치할 건지 등을 설정

- display : none : 화면에 박스가 나타나지 않음

- display : block : 위에서부터 아래쪽으로 배치

- display : inline : 왼쪽에서 오른쪽으로 배치

- display : inline-block : 인라인과 비슷하게 가로 방향으로 배치

 

div 태그의 display 속성 예제1

- display_none.html

<!DOCTYPE html>
<html>
<head>
    <title>Display</title>
    <style>
        #box {
            display: none;
        }
    </style>
</head>
<body>
    <span>더미 객체</span>
    <div id="box">대상 객체</div>
    <span>더미 객체</span>
</body>
</html>

- #으로 된 선택자는 id= 속성으로 적용하고 있다

- display : none이라서 div의 테두리를 만들지 않음, 박스 자체가 없기때문에 출력이 되지 않고 있다

- 두 "더미 객체" 사이에 들어가야할 div태그 안의 내용을 화면에 보이지 않는다

 

div 태그의 display 속성 예제2

- display_block.html

<!DOCTYPE html>
<html>
<head>
    <title>Display</title>
    <style>
        #box {
            display: block;
        }
    </style>
</head>
<body>
    <span>더미 객체</span>
    <div id="box">대상 객체</div>
    <span>더미 객체</span>
</body>
</html>

- display : block; 된 박스(div)는 위에서부터 아래쪽 방향으로 출력된다

- 가장 많이 쓰는 형태

 

div 태그의 display 속성 예제3

- display_inline.html

<!DOCTYPE html>
<html>
<head>
    <title>Display</title>
    <style>
        #box {
            display: inline;
        }
    </style>
</head>
<body>
    <span>더미 객체</span>
    <div id="box">대상 객체</div>
    <span>더미 객체</span>
</body>
</html>

- display : inline; 된 박스(div)는 왼쪽부터 오른쪽 방향으로 배치가 됨

 

div 태그의 display 속성 예제4

- display_inline-block.html

<!DOCTYPE html>
<html>
<head>
    <title>Display</title>
    <style>
        #box {
            display: inline-block;
        }
    </style>
</head>
<body>
    <span>더미 객체</span>
    <div id="box">대상 객체</div>
    <span>더미 객체</span>
</body>
</html>

- inline-block도 inline 과 비슷하게 같은 방향으로 출력되고 있다

- inline-block도 왼쪽에서 오른쪽 방향으로 출력

 

inline과 inline-block의 차이

+ inline-block은 inline의 단점을 보완한다

- width/height 적용 가능
- margin/padding-top/bottom 적용 가능
- line-height 적용 가능

+ Recent posts