저번 프로젝트 파일에 이어서


설명(주석)과 함께 예제를 올립니다.






employee는 생성자가 약간 수정되었다.


package model.vo;

import java.sql.Date;

// 보통 vo 클래스 파일의 이름을 DB의 이름과 같게한다.

// vo(value object) == entity == record == row
// do(domain object) == dto(data transfer object)
// DB 테이블의 한 행의 정보가 기록되는 저장용 객체

// 1. 반드시 캡슐화가 적용되어야 한다 : 모든 필드는 private가 된다.
// 2. 기본 생성자와 매개변수 있는 생성자를 작성해야 한다. (매개변수가 있는 생성자가 있다면 기본 생성자를 jvm에서 생성해주지 않기 때문)
// 3. 모든 필드에 대해 getter와 setter 작성해야 한다.
// 4. 직렬화 처리를 해야 한다.
// optional. toString() 오버라이딩 <- 필드값을 확인하기 위해

public class Employee implements java.io.Serializable{
	private int empNo;
	private String empName;
	private String job;
	private int mgr;
	private Date hireDate;
	private int sal;
	private int comm;
	private int deptNo;
	// 이러한 객체를 vo 객체라고 할 수 있다.
	
	public Employee() {
		
	}
	
	public Employee(int empNo, String empName, String job, int mgr, Date hireDate, int sal, int comm, int deptNo) {
		super();
		this.empNo = empNo;
		this.empName = empName;
		this.job = job;
		this.mgr = mgr;
		this.hireDate = hireDate;
		this.sal = sal;
		this.comm = comm;
		this.deptNo = deptNo;
	}
	
	public Employee(int empNo, String empName, String job, int mgr, int sal, int comm, int deptNo) {
		super();
		this.empNo = empNo;
		this.empName = empName;
		this.job = job;
		this.mgr = mgr;
		this.sal = sal;
		this.comm = comm;
		this.deptNo = deptNo;
	}
	
	public Employee(int empNo, String job, int sal, int comm) {
		super();
		this.empNo = empNo;
		this.job = job;
		this.sal = sal;
		this.comm = comm;
	}

	public int getEmpNo() {
		return empNo;
	}

	public void setEmpNo(int empNo) {
		this.empNo = empNo;
	}

	public String getEmpName() {
		return empName;
	}

	public void setEmpName(String empName) {
		this.empName = empName;
	}

	public String getJob() {
		return job;
	}

	public void setJob(String job) {
		this.job = job;
	}

	public int getMgr() {
		return mgr;
	}

	public void setMgr(int mgr) {
		this.mgr = mgr;
	}

	public Date getHireDate() {
		return hireDate;
	}

	public void setHireDate(Date hireDate) {
		this.hireDate = hireDate;
	}

	public int getSal() {
		return sal;
	}

	public void setSal(int sal) {
		this.sal = sal;
	}

	public int getComm() {
		return comm;
	}

	public void setComm(int comm) {
		this.comm = comm;
	}

	public int getDeptNo() {
		return deptNo;
	}

	public void setDeptNo(int deptNo) {
		this.deptNo = deptNo;
	}
	
	
	
	
}


testMain은 주석을 지워가며 한개 씩 테스트 해보세요.


package controller;

import model.dao.JDBCModel;
import model.vo.Employee;

public class TestMain {

	public static void main(String[] args) {
		JDBCModel model = new JDBCModel();
		
		// 전체 조회
		// model.testJDBC();
		
		
		
		// 사번 전달하여 조회
		// model.testJDBC2(7839);
		
		
		
		// 객체 생성 후 삽입
		// Employee emp = new Employee(7777, "JARON", "ANALYST", 9999, 12000, 90, 10);
		// model.testInsert(emp);
		
		
		
		// 객체 생성 후 업데이트
		// Employee e = new Employee(7777, "CHAIRMAN", 50000000, 100000000);
		// model.testUpdate(e);
		// 업데이트 후 전체 조회
		// model.testJDBC();
		
		
		
		// 사번 전달 후 삭제
		// model.testDelete(7777);
		// 삭제 후 전체 조회
		// model.testJDBC();
	}

}





JDBC 모델은 메인에서 호출한 다양한 기능들을 작성하였다.



package model.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import model.vo.Employee;

public class JDBCModel {
	// 사원 전체 조회용 메소드
	public void testJDBC() {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rset = null;
		// ctrl + shift + O 를 누르면 import 해야하는 항목이 나옴.
		
		// 1. 해당 데이터 베이스에 대한 라이브러리 등록 작업
		// Class.forName("클래스명"); // ClassNotFoundException 처리를 해야 함
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			// 2.데이터베이스와 연결함  // SQLException 처리를 해야한다.
			conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "scott", "tiger");
			
			System.out.println(conn);
			
			// 3. 쿼리문 작성 후 DB에서 쿼리문 실행시키고 결과를 가지고 옴
			String query = "SELECT * FROM EMP";
			
			stmt = conn.createStatement();
			
			rset = stmt.executeQuery(query);
			
			while (rset.next()) {
				System.out.println(rset.getInt("EMPNO") + ", " + 
									rset.getString("ENAME") + ", " +
									rset.getString("JOB") + ", " +
									rset.getInt("MGR") + ", " +
									rset.getDate("HIREDATE") + ", " + 
									rset.getInt("SAL") + ", " +
									rset.getInt("COMM") + ", " +
									rset.getInt("DEPTNO")
						);
				
			}

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				// 4. DB와 관련된 객체는 반드시 close 해야 함
				rset.close();
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}

	public void testJDBC2(int empNo) {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rset = null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "scott", "tiger");
			
			String query = "SELECT * FROM EMP WHERE EMPNO = " + empNo;
			
			stmt = conn.createStatement();
			
			rset = stmt.executeQuery(query);
			
			while (rset.next()) {
				System.out.println(rset.getInt("EMPNO") + ", " + 
						rset.getString("ENAME") + ", " +
						rset.getString("JOB") + ", " +
						rset.getInt("MGR") + ", " +
						rset.getDate("HIREDATE") + ", " + 
						rset.getInt("SAL") + ", " +
						rset.getInt("COMM") + ", " +
						rset.getInt("DEPTNO")
					);
				
			}
			

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				rset.close();
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}

	public void testInsert(Employee emp) {
		Connection conn = null;
		Statement stmt = null;
		int result = 0;
		
		// 문자열의 경우 ''을 추가해야 함을 주의하자
		String query = "INSERT INTO EMP(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)"
				+ "VALUES(" +
				emp.getEmpNo() + ", '" + 
				emp.getEmpName() + "', '" + 
				emp.getJob() + "', " + 
				emp.getMgr() + ", " + 
				"SYSDATE, " +
				emp.getSal() + ", " + 
				emp.getComm() + ", " +
				emp.getDeptNo() +
				")";
		System.out.println(query);
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "scott", "tiger");
			
			stmt = conn.createStatement();
			
			result = stmt.executeUpdate(query);
			
			if(result > 0) {
				// DB와 마찬가지로 commit rollback을 상황에 맞게 해야한다.
				System.out.println(result + "개의 행이 추가되었습니다.");
				conn.commit();
			}else {
				System.out.println(result + "개의 행 추가 실패!");
				conn.rollback();
			}
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}

	public void testUpdate(Employee e) {
		Connection conn = null;
		Statement stmt = null;
		int result = 0;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "scott", "tiger");
			
			stmt = conn.createStatement();
			
			String query = "UPDATE emp SET " +
					"JOB = '" + e.getJob() + 
					"' WHERE empNo = " +
					e.getEmpNo();
			System.out.println(query);
			
			result = stmt.executeUpdate(query);
			
			System.out.println(result + "개의 행이 수정되었습니다.");
			
			
			
			query = "UPDATE emp SET " +
					"SAL = " + e.getSal() + 
					" WHERE empNo = " +
					e.getEmpNo();
			System.out.println(query);
			
			result = stmt.executeUpdate(query);
			
			System.out.println(result + "개의 행이 수정되었습니다.");
			
			
			
			query = "UPDATE emp SET " +
					"COMM = " + e.getComm() + 
					" WHERE empNo = " +
					e.getEmpNo();
			System.out.println(query);
			
			result = stmt.executeUpdate(query);
			
			System.out.println(result + "개의 행이 수정되었습니다.");
			
			conn.commit();
			
		} catch (ClassNotFoundException e1) {
			e1.printStackTrace();
		} catch (SQLException e1) {
			e1.printStackTrace();
		} finally {
			try {
				stmt.close();
				conn.close();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		}
	}

	public void testDelete(int empNo) {
		Connection conn = null;
		Statement stmt = null;
		int result = 0;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "scott", "tiger");
			
			stmt = conn.createStatement();
			
			String query = "DELETE FROM emp WHERE empNo = " + empNo; 
			System.out.println(query);
			
			result = stmt.executeUpdate(query);
			
			if (result > 0) {
				System.out.println(result + "개의 행이 수정되었습니다.");
			}else {
				System.out.println("실패했습니다.");
			}
			
			conn.commit();
			
		} catch (ClassNotFoundException e1) {
			e1.printStackTrace();
		} catch (SQLException e1) {
			e1.printStackTrace();
		} finally {
			try {
				stmt.close();
				conn.close();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		}
	}
}




파일 구조는 다음과 같이 구성하였다.


controller는 기능들이 실행될 class


vo는 여러가지로 표현할 수 있는데 DB에선 엔터티라고 하고 데이터 테이블이 들어올 클래스이다.


dao는 db 데이터를 끌어올 기능을 넣을 class 이다.


자세한 설명은 예제의 주석에서 확인하자.


먼저 Employee 테이블이 들어갈 클래스 작성



package model.vo;

import java.sql.Date;

// 보통 vo 클래스 파일의 이름을 DB의 이름과 같게한다.

// vo(value object) == entity == record == row
// do(domain object) == dto(data transfer object)
// DB 테이블의 한 행의 정보가 기록되는 저장용 객체

// 1. 반드시 캡슐화가 적용되어야 한다 : 모든 필드는 private가 된다.
// 2. 기본 생성자와 매개변수 있는 생성자를 작성해야 한다. (매개변수가 있는 생성자가 있다면 기본 생성자를 jvm에서 생성해주지 않기 때문)
// 3. 모든 필드에 대해 getter와 setter 작성해야 한다.
// 4. 직렬화 처리를 해야 한다.
// optional. toString() 오버라이딩 <- 필드값을 확인하기 위해

public class Employee implements java.io.Serializable{
	private int empNo;
	private String empName;
	private String job;
	private int mgr;
	private Date hireDate;
	private int sal;
	private int comm;
	private int deptNo;
	// 이러한 객체를 vo 객체라고 할 수 있다.
	
	public Employee() {
		
	}
	
	public Employee(int empNo, String empName, String job, int mgr, Date hireDate, int sal, int comm, int deptNo) {
		super();
		this.empNo = empNo;
		this.empName = empName;
		this.job = job;
		this.mgr = mgr;
		this.hireDate = hireDate;
		this.sal = sal;
		this.comm = comm;
		this.deptNo = deptNo;
	}
	
	public Employee(int empNo, String empName, String job, int mgr, int sal, int comm, int deptNo) {
		super();
		this.empNo = empNo;
		this.empName = empName;
		this.job = job;
		this.mgr = mgr;
		this.sal = sal;
		this.comm = comm;
		this.deptNo = deptNo;
	}

	public int getEmpNo() {
		return empNo;
	}

	public void setEmpNo(int empNo) {
		this.empNo = empNo;
	}

	public String getEmpName() {
		return empName;
	}

	public void setEmpName(String empName) {
		this.empName = empName;
	}

	public String getJob() {
		return job;
	}

	public void setJob(String job) {
		this.job = job;
	}

	public int getMgr() {
		return mgr;
	}

	public void setMgr(int mgr) {
		this.mgr = mgr;
	}

	public Date getHireDate() {
		return hireDate;
	}

	public void setHireDate(Date hireDate) {
		this.hireDate = hireDate;
	}

	public int getSal() {
		return sal;
	}

	public void setSal(int sal) {
		this.sal = sal;
	}

	public int getComm() {
		return comm;
	}

	public void setComm(int comm) {
		this.comm = comm;
	}

	public int getDeptNo() {
		return deptNo;
	}

	public void setDeptNo(int deptNo) {
		this.deptNo = deptNo;
	}
	
	
	
	
}




다음으로는 메인(TestMain)에 JDBCModel 추가



package controller;

import model.dao.JDBCModel;
import model.vo.Employee;

public class TestMain {

	public static void main(String[] args) {
		JDBCModel model = new JDBCModel();
		
		전체 조회
		model.testJDBC();
		
	}

}



다음으로는 JDBCModel에서 db를 불러오고 사용하는 작업



package model.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import model.vo.Employee;

public class JDBCModel {
	// 사원 전체 조회용 메소드
	public void testJDBC() {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rset = null;
		// ctrl + shift + O 를 누르면 import 해야하는 항목이 나옴.
		
		// 1. 해당 데이터 베이스에 대한 라이브러리 등록 작업
		// Class.forName("클래스명"); // ClassNotFoundException 처리를 해야 함
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			// 2.데이터베이스와 연결함  // SQLException 처리를 해야한다.
			conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "scott", "tiger");
			
			System.out.println(conn);
			
			// 3. 쿼리문 작성 후 DB에서 쿼리문 실행시키고 결과를 가지고 옴
			String query = "SELECT * FROM EMP";
			
			stmt = conn.createStatement();
			
			rset = stmt.executeQuery(query);
			
			while (rset.next()) {
				System.out.println(rset.getInt("EMPNO") + ", " + 
									rset.getString("ENAME") + ", " +
									rset.getString("JOB") + ", " +
									rset.getInt("MGR") + ", " +
									rset.getDate("HIREDATE") + ", " + 
									rset.getInt("SAL") + ", " +
									rset.getInt("COMM") + ", " +
									rset.getInt("DEPTNO")
						);
				
			}

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				// 4. DB와 관련된 객체는 반드시 close 해야 함
				rset.close();
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}

}



위와 같이 작성하고


Main 클래스를 실행하면 다음과 같이 콘솔에 연결 정보가 출력된다.








오라클 db 설치와 sql developer 설치는 저번 게시물을 참조.


Start Database로 db를 실행


sql developer에 system 계정으로 다음 sql문을 실행한다.




scott 계정, 비밀번호 tiger 이라고 생성하고 권한을 설정하는 문장이다.


scott 계정은 일반적으로 사용하는 교육용 계정.






다음으로는 좌측의 새 접속 설정을 한다.




좌측의 초록색 십자가


접속 이름은 마음대로


사용자 이름, 비밀번호는 아까 만든 scott, tiger


비밀번호 저장 체크


저장을 누르고 테스트


테스트가 정상적으로 된다면 잘 생성이 된 것이다.






다음으로는 이클립스를 실행하고 마음에 드는 위치에 Workspace를 새로 만든다.


첫 화면, 환영합니다. 를 꺼주고 다음 빨간 네모박스의 버튼에 따라 Java 환경으로 킨다.




그리고 좌측의 Package 리스트 빼고 전부 닫은 후



콘솔과 네비게이터를 열어주자.



다음으로는 Preference 설정으로 예전에 JS 설정 했을 때를 참조하여 똑같이 설정하면 된다.






다음으로는 navigator에 java Project를 생성


사진처럼 따라한다.






다음으로 프로젝트 src 폴더에 controller, model(dao, vo)를 생성한다.




이제 sql을 사용하기 위한 Library 파일을 불러온다.


계속 사용했던 oracle에 설치 폴더에 있는 파일을 불러온다.


경로는 설치 경로 + oraclexe/app/oracle/product/11.2.0/server/jdbc/lib 에 ojdbc6이라는 파일이 존재한다.





버젼이 바뀌면서 경로가 달라질 수 있다.


위치를 확인했다면 이클립스에서 좌측 프로젝트에 우클릭 맨 아래의


Properties를 누른다.






다음으로 Build Path에 Library 항목에


Add External JARs, 외부의 JAR 파일(아까 확인한 오라클 경로의 파일)을 추가한다.





추가하면 좌측의 Package Explorer에서 확인할 수 있다.






다음 게시물은 이클립스에서 DB의 데이터를 불러오는 방법을 설명한다.















※ 추가로 sql developer에 다음 sql문을 추가하여 실행하자(F5를 누르면 일괄 실행된다.)


처음 drop 부분은 오류가 발생할 수 있다. 테이블이 없다면...



drop table emp;
drop table dept;
drop table bonus;
drop table salgrade;


CREATE TABLE EMP
(EMPNO number not null,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR number,
HIREDATE date,
SAL number,
COMM number,
DEPTNO number);

INSERT INTO EMP VALUES
(7369,'SMITH','CLERK',7902,'1980-12-17',800,null,20);
INSERT INTO EMP VALUES
(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO EMP VALUES
(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,200,30);
INSERT INTO EMP VALUES
(7566,'JONES','MANAGER',7839,'1981-04-02',2975,30,20);
INSERT INTO EMP VALUES
(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,300,30);
INSERT INTO EMP VALUES
(7698,'BLAKE','MANAGER',7839,'1981-04-01',2850,null,30);
INSERT INTO EMP VALUES
(7782,'CLARK','MANAGER',7839,'1981-06-01',2450,null,10);
INSERT INTO EMP VALUES
(7788,'SCOTT','ANALYST',7566,'1982-10-09',3000,null,20);
INSERT INTO EMP VALUES
(7839,'KING','PRESIDENT',null,'1981-11-17',5000,3500,10);
INSERT INTO EMP VALUES
(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO EMP VALUES
(7876,'ADAMS','CLERK',7788,'1983-01-12',1100,null,20);
INSERT INTO EMP VALUES
(7900,'JAMES','CLERK',7698,'1981-10-03',950,null,30);
INSERT INTO EMP VALUES
(7902,'FORD','ANALYST',7566,'1981-10-3',3000,null,20);
INSERT INTO EMP VALUES
(7934,'MILLER','CLERK',7782,'1982-01-23',1300,null,10);

CREATE TABLE DEPT
(DEPTNO number,
DNAME VARCHAR2(14),
LOC VARCHAR2(13) );

INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES (30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON');

CREATE TABLE BONUS
(
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
SAL number,
COMM number
);


CREATE TABLE SALGRADE
( GRADE number,
LOSAL number,
HISAL number);

INSERT INTO SALGRADE VALUES (1,700,1200);
INSERT INTO SALGRADE VALUES (2,1201,1400);
INSERT INTO SALGRADE VALUES (3,1401,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);

commit;



객체가 안의 요소를 감추고  부드럽게 보여주고 하는 효과와


서서히 사라지거나 보여주는 효과 두 가지 slide, fade


slideDown()


slideUp()


slideToggle()


fadeIn()


fadeOut()


fadeToggle()



<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style type="text/css">
	div {
		width: 300px;
		height: 30px;
		background: yellowgreen;
		color: orangered;
		border-radius: 10px;
		text-align: center;
		border: 1px solid green;
		cursor: pointer;
	}
	p {
		border: 1px solid lightgray;
		width: 300px;
		height: 20px;
		display: none;
	}
</style>
</head>
<body>
	<h1>slide 메소드</h1>
	<h3>slideDown()과 slideUp()</h3>
	
	<div>첫 번째 메뉴</div>
	<p class="contents">내용</p>
	<div>두 번째 메뉴</div>
	<p class="contents">내용</p>
	<div>세 번째 메뉴</div>
	<p class="contents">내용</p>
	<div>네 번째 메뉴</div>
	<p class="contents">내용</p>
	<div>다섯 번째 메뉴</div>
	<p class="contents">내용</p>
	
	<script type="text/javascript">
		$(function() {
			$(".contents").slideUp();
			
			$("div").click(function() {
				// $(this).next("p").slideDown();
				$(this).next("p").slideToggle(3000, function() {
					alert("토글 완료!");
				});
			});
		});
	</script>
</body>
</html>



<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
	<h1>fade() 메소드</h1>
	<h3>fadeIn()와 fadeOut()</h3>
	<button id="fadein">fadeIn()</button>
	<button id="fadeout">fadeOut()</button>
	<br>
	<img id="flower" src="../image/flower1.PNG">
	
	<script type="text/javascript">
		$(function() {
			$("#fadein").click(function() {
				$("img").fadeIn(1000);
			});
			$("#fadeout").click(function() {
				$("img").fadeOut(1000);
			});
		});
	</script>
	
	<hr>
	
	<button id="toggle">fadeOut()</button>
	<br>
	<img id="forest" src="../image/forest1.PNG">
	<script type="text/javascript">
		$(function() {
			$("#toggle").click(function() {
				$("#forest").fadeToggle(2000, function() {
					alert("토글 완료");
				});
			});
		});
	</script>
</body>
</html>


css에서 다룰 수 있는 애니메이션 효과들을 jq에서 다뤄보자.


animate() : 지정한 스타일로 서서히 변함


show() : 보이기


hide() : 숨기기


toggle() : 보이거나 숨기기


animate

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script
  src="http://code.jquery.com/color/jquery.color-2.1.2.js"
  integrity="sha256-1Cn7TdfHiMcEbTuku97ZRSGt2b3SvZftEIn68UMgHC8="
  crossorigin="anonymous"></script>
<style type="text/css">
	.test1{
		width: 200px;
		height: 200px;
		background: orangered;
	}
</style>
</head>
<body>
	<h1>Effect메소드</h1>
	<p>페이지에 애니메이션 효과를 만들기 위한 메소드 집합</p>
	<h3>animate() 메소드</h3>
	<div id="test1" class="test1"></div>
	<button id="btn">animation 적용</button>
	
	<script type="text/javascript">
		$(function() {
			$("#btn").click(function() {
				// 적용될 애니메이션, 실행 시간, 끝나고 실행될 함수
				// 하지만 기본적으로 backgroundColor는 컨트롤 못하게 해놓았다.
				$("#test1").animate({width:"500px", backgroundColor:"blue"}, 3000, function() {
					alert("애니메이션 적용 완료")
				});
				// 배경 색을 바꾸려면 jquery 홈페이지에서 플러그인을 받아서 적용해야 한다.
			});
		});
	</script>

</body>
</html>


배경색의 경우는 jquery 파일을 하나 더 추가해야 한다.


jquery 홈페이지에서 plug in 메뉴를 누르고





리스트 중 animation의 페이지 두번째 (바뀔 수 있다) jquery color를 선택해서


Download 버튼을 누르면 다음과 같은 페이지가 뜬다.




버전에 맞는 링크를 누르면 script가 나오는데 복사해서 코드 상단에 붙여넣으면 된다.






<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style type="text/css">
	div{
		width: 50px;
		height: 50px;
		background: orangered;
		position: relative;
		
	}
</style>
<script type="text/javascript">
	// Position은 대개 relative나 absolute 두 개를 자주 사용하는데
	// relative는 자기 부모 객체를 기준으로 삼는 것이고
	// absolute는 현재 페이지 자체를 기준으로 위치를 설정하게 된다.
</script>
</head>
<body>
	<h1>상대적 애니메이션</h1>
	<div></div>
	<div></div>
	<div></div>
	<div></div>
	<div></div>
	<div></div>
	<div></div>
	<script type="text/javascript">
		$(function() {
			$("div").click(function() {
				var width = $(this).css("width");
				var height = $(this).css("height");
				
				$(this).animate({
					width:parseInt(width) + 50,
					height:parseInt(height) + 50
				}, "slow");
			});
			
			$("div").each(function(index) {
				$(this).delay(index * 50).animate({left:500}, "slow");
			});
		});
		
	</script>
</body>
</html>



show, hide, toggle

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
	<h1>시각적 효과</h1>
	<h3>show()와 hide()</h3>
	<p>문서 객체를 크게 하며 보여주거나 작게하며 사라지게 한다.</p>
	<button id="show">보여주기</button>
	<button id="hide">숨기기</button>
	<img id="river" src="../image/river1.PNG">
	<hr>
	
	<script type="text/javascript">
		$(function() {
			$("#show").click(function() {
				$("#river").show();
			});
			$("#hide").click(function() {
				$("#river").hide();
			});
		});
	</script>
	
	<br>
	
	<button id="toggle">토글하기</button>
	<br>
	<img id="forest" src="../image/forest1.PNG">
	
	<script type="text/javascript">
		$(function() {
			/* var ctn = 0;
			$("#toggle").click(function() {
				ctn++;
				if (ctn % 2 != 0) {
					$("#forest").hide();
				}else {
					$("#forest").show();
				}
			}); */
			// 따로 메소드가 또 있다.
			
			$("#toggle").click(function(){
				$("#forest").toggle(3000, function(){
					alert("토글완료");
				});
			});
		});
	</script>

	
	
</body>
</html>


JQuery문을 이용해서 이벤트를 활성화 하는 법을 알아보자.


bind() : 현재 문서에 존재하는 객체에 event 속성을 부여


unbind() : bind로 생성된 이벤트 제거


on() : 1.7 버전 이후로 쓰이고 bind와 기능은 같다. bind보단 on을 사용하길 권장한다.


off() : on으로 생성된 이벤트 제거





bind('이벤트명', function)으로 사용하고


on은 on('이벤트명':function, '이벤트명':function, '이벤트명':function, '이벤트명':function, .....) 과 같이 사용한다.



<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style>
	#test2, #test3 {
		width:300px;
		height:300px;
		background:orangered;
	}
</style>
</head>
<body>
	<h1>이벤트</h1>
	<h3>이벤트 관련 속성</h3>
	<button onclick="test1(event)">실행 확인</button>
	
	<script type="text/javascript">
		function test1(event) {
			console.log(event);
		}
	</script>
	
	<hr>
	
	<h3>이벤트 연결 종류</h3>
	<h4>bind() : 현재 존재하는 문서 객체만 이벤트 연결<br>
	unbind() : bind()로 연결된 이벤트 제거</h4>
	<h1 id="test1">마우스를 올려보세요</h1>
	<script>
		$(function(){
			$("#test1").bind('mouseenter', function(){
				$(this).css({"background":"black", "color":"white"});
			}).bind('mouseleave', function(){
				$(this).css({"background":"white", "color":"black"});
			});
			
			$("#test1").bind('click', function(){
				$(this).unbind('mouseenter').unbind('mouseleave').css({"background":"white", "color":"black"});
			});
		});
	</script>
	
	<h4>on() : bind()대신에 on으로 대체됨<br>
	off() : on()으로 연결된 이벤트 제거</h4>
	<div id="test2">기본상태</div>
	<script>
		$(function(){
			$("#test2").on({'mouseenter':function(){
				$(this).css("background", "yellowgreen").text("마우스 올라감");
			}, 'mouseleave':function(){
				$(this).css("background", "yellow").text("마우스 내려감");
			}, 'click':function(){
				$(this).off('mouseenter').off('mouseleave').css("background", "orangered").text("기본값");
			}});
		});
	</script>
	
	<br>
	
	<div id="test3">기본상태</div>
	<script type="text/javascript">
		$(function() {
			$("#test3").on("click", {name : "김가루"}, function(event) {
				alert(event.data.name + "님 환영합니다!");
			});		
		});
	</script>
	
	<br>
	
	<div id="wrap">
		<h2>Header</h2>
	</div>
	<script>
		$(function(){
			$(document).on('click', 'h2', function(){
				var length = $("h2").length;
				var targetHTML = $(this).html();
				
				console.log(length);
				console.log(targetHTML);
				
				$("#wrap").append("<h2>" + targetHTML + " - " + length + "</h2>");
			});
		});
	</script>
	
	<hr>
	
	<h3>one() 메소드</h3>
	<p>이벤트를 한 번만 연결할 때 사용한다.</p>
	<h1 id="test4">클릭하세요</h1>
	<script type="text/javascript">
		$(function() {
			$("#test4").one("click", function() {
				alert("이벤트 발생!!");
			});
		});
	</script>
</body>
</html>









jq에서 이벤트를 지정하는 다른 방법은


$(불러올 객체).이벤트명(function)과 같이 쓴다.


이와 같이 다양한 이벤트 지정 방법이 존재하므로 마음에 드는 방법을 사용하면 된다.


mouseover, mouseenter, hover, keydown, keypress, keyup, click, change, focus 등 다양한 이벤트 키워드들이 있고


이 중 hover이나 focus 같이 사용법이 특이한 경우도 있으므로 예에서 잘 확인해보자



<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style type="text/css">
	.inner{
		width: 100%;
		height: 100%;
		background: red;
	}
	.outer{
		width: 200px;
		height: 200px;
		background: orange;
		padding: 50px;
	}
	.reverse{
		background: black;
		color: white;
	}
</style>

</head>
<body>
	<h1>이벤트 연결 메소드</h1>
	<h3>mouseover와  mouseenter</h3>
	<div class="outer">
		<div class="inner"></div>
	</div>
	
	<script type="text/javascript">
		// mouseover는 요소에 마우스 포인터가 진입하면 발생
		// (직접 이벤트를 걸지 않은 자식요소에 포인터가 와도 발생함)
		// mouseenter는 오로지 자신에게 마우스 포인터가 와야만 발생함
		$(function() {
			$(".outer").mouseover(function() {
				console.log("OVER!");
			});
			$(".outer").mouseenter(function() {
				console.log("ENTER")
			});
		});
	</script>
	
	<h3>hover() 메소드</h3>
	<p>mouseenter와 mouseleave를 동시에 사용하는 효과이다.</p>
	<h1 id="test1">hover테스트</h1>
	<script type="text/javascript">
		$(function() {
			$("#test1").hover(
					function() { // 첫번째는 mouseenter
						$(this).addClass("reverse");
					},
					function() { // 두번째는 mouseleave
						$(this).removeClass("reverse");
					}
			);
		});
	</script>
	
	<h3>키보드이벤트</h3>
	<p>keydown : 키보드가 눌려질 때<br>
	keypress : 글자가 입력될 때<br>
	keyup : 키보드가 떼어질 때</p>
	<h4>동적으로 글자 수 세기</h4>
	<div>
		<h1 id="counter">150</h1>
		<textarea rows="5" cols="70"></textarea>
	</div>
	<script type="text/javascript">
		$(function() {
			$("textarea").keydown(function() {
				var inputLength = $(this).val().length;
				var remain = 150 - inputLength;
				
				$("#counter").html(remain);
				
				if (remain >= 0) {
					$("#counter").css("color", "black");
				}else {
					$("#counter").css("color", "red");
				}
			});
		});
	</script>
</body>
</html>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style>
	.trg {
		width:100px;
		height:100px;
		background:orangered;
		text-align:center;
		vertical-align:middle;
		cursor:pointer;
	}
	.increment {
		background:black;
		width:100px;
		height:25px;
		color:white;
		text-align:center;
		margin-top:20px;
		cursor:pointer;
	}
</style>
</head>
<body>
	<h1>입력 양식 이벤트</h1>
	<div id="wrap">
		<h1 align="center">회원 가입</h1>
		<form>
			<table align="center">
				<tr>
					<td><label>이름</label></td>
					<td><input type="text" name="name" id="name"></td>
					<td><label id="nameresult"></label></td>
				</tr>
				<tr>
					<td><label>아이디</label></td>
					<td><input type="text" name="userid" id="userid"></td>
					<td><input type="button" value="중복확인"></td>
				</tr>
				<tr>
					<td><label>비밀번호</label></td>
					<td><input type="password" name="pwd1" id="pwd1"></td>
					<td></td>
				</tr>
				<tr>
					<td><label>비밀번호 확인</label></td>
					<td><input type="password" name="pwd2" id="pwd2"></td>
					<td><label id="pwdresult"></label></td>
				</tr>
				<tr>
					<td><label>이메일</label></td>
					<td><input type="email" name="email" id="email"></td>
					<td></td>
				</tr>
				<tr>
					<td></td>
					<td><input type="submit"> &nbsp; <input type="reset"></td>
					<td></td>
				</tr>
			</table>
		</form>
	</div>
	
	<script type="text/javascript">
		$("#name").change(function(){
			var regExp = /[가-힣]/;
			
			if(!regExp.test($(this).val())){
				$("#nameresult").html("한글로 입력하세요").css("color", "red");
				$(this).focus().css("background","red");
			}else{
				$("#nameresult").html("정상입력").css("color","green");
			}
		
		});
			
		$("#pwd2").change(function(){
			if($("#pwd1").val() != $(this).val()){
				$("#pwdresult").html("비밀번호가 일치하지 않습니다").css("color","red");
				$("#pwd2").val('');
				$(this).select();
			}else{
				$("#pwdresult").html("비밀번호 일치").css("color","green");
			}
		});
		
		$("#name").focus(function(){
			console.log('focus이벤트 가동');
		}).focusin(function(){
			console.log('focusin이벤트 가동');
		}).focusout(function(){
			console.log('focusout이벤트 가동');
		}).blur(function(){
			console.log('blur이벤트 가동');
		}).change(function(){
			console.log('change이벤트 가동');
		}).select(function(){
			console.log('select이벤트 가동');
		})
		
		$("form").submit(function(event){
			alert("submit이벤트 동작");
			event.preventDefault();
		});

	</script>
	
	
	<div id="result"></div>
	<script>
		$(function(){
			$("input[type=submit]").click(function(){
				$("#result").html("이름 : " + $("#name").val());
			});
			
		});
	</script>
	
	<hr>
	
	<h3>trigger()메소드</h3>
	<div class="trg" id="trg">
		click Num : <span>0</span>;
	</div>
	<div class="increment" id="increment">click me!</div>

	<script type="text/javascript">
		var ctn = 0;
		
		$(function() {
			$("#trg").on("click", function() {
				ctn++;
				$("span").text(ctn);
			});
		});
		
		$("#increment").click(function() {
			$("#trg").trigger("click");
		});
	</script>
	
	
</body>
</html>


jq에서 자주 사용하는 메소드를 알아보자.




each() 반복문은 for in과 비슷하다. 반복문을 태그에 쓰는 것으로 여러 태그를 불러 왔을 때 


간편하게 일괄 처리 할 수 있다. 그리고 그의 순서와 값은 key 와 value인 index와 item을 사용한다.


index는 가져온 태그의 순서, item은 해당 값을 의미한다.


 


addClass(" ") : addClass는 말 그대로 속성값 class를 추가해준다.


removeClass(" ") : addClass는 말 그대로 속성값 class를 제거해준다.


toggleClass(" ") : toggleClass는 클릭 했을 때 클래스가 적용 or 해제되는 속성을 추가


is() : 해당 객체(요소)가 괄호에 입력한 객체인지 판별해주는 메소드 (true & false)


$.extend() : 객체에 속성을 추가하거나 객체와 객체를 합치는 메소드


$.noConflict() : js 라이브러리나 다른 버젼의 jquery의 $ 키워드 충돌을 방지하기 위해 사용하고


이 키워드를 사용하면 $ 달러 키워드를 다른것으로 바꿔 사용 할 수 있다.



어떻게 쓰이는지 확인해보자



<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style>
	.high_light_0 {background:yellow;}
	.high_light_1 {background:orange;}
	.high_light_2 {background:blue;}
	.high_light_3 {background:green;}
	.high_light_4 {background:red;}
</style>
</head>
<body>
	<h1>메소드</h1>
	
	<h3>each() 메소드</h3>
	<p>배열을 관리하는 for in문과 비슷한 기능을 하는 메소드이다.</p>
	<p>$.each(object, function(index, item){})의 형식으로 사용한다.<br>
	index : 배열의 인덱스 또는 객체의 키를 의미한다.<br>
	item : 해당 인덱스나 키가 가진 값을 의미한다.</p>
	
	<script type="text/javascript">
		/*
		$(function() {
			var arr = [
				{name:"A", link:"http://www.naver.com"},
				{name:"B", link:"http://www.google.com"},
				{name:"C", link:"http://www.w3c.com"},
				{name:"D", link:"http://www.daum.net"}
			];
			
			$.each(arr, function(index, item) {
				var output = "";
				output += "<a href=" + item.link + ">";
				output += "<h2>" + item.name + "</h2>";
				output += "</a>";
				
				document.body.innerHTML += output;
			});
			
			
		})
		*/
	</script>
	
	<hr>
	
	<div id="wrap">
		<h1>item-0</h1>
		<h1>item-1</h1>
		<h1>item-2</h1>
		<h1>item-3</h1>
		<h1 id="item4">item-4</h1>
	</div>
	<script>
		$(function() {
			$("#wrap").children().each(function(index, item) {
				// 문서 객체에 class 속성을 추가하는 메소드
				$(this).addClass("high_light_" + index);
				
				if(index == 2){
					$(this).removeClass("high_light_" + index);
				}
			});
			
			$("#item4").click(function() {
				$(this).toggleClass("high_light_4");
			});
			
		})
	</script>
	
	<hr>
	
	<h3>문서 객체의 특징 판별 : is()</h3>
	<p>매개변수로 선택자를 입력하고, 선택한 객체가 선택자와 일치하는지 판단하여 boolean 리턴</p>
	<h3 class="test">test1</h3>
	<h3>test2</h3>
	<h3 class="test">test3</h3>
	<h3 class="test">test4</h3>
	<h3>test5</h3>
	<h3 class="test">test6</h3>
	
	<script>
		$(function(){
			$("h3").each(function(){
				if($(this).is(".test")){
					$(this).css({"background":"orangered", "color":"white"})
				}
			});
			
		});
	</script>
	
	<hr>
	
	<h3>$.extend() 메소드</h3>
	<p>객체에  속성을 추가하거나 여러개의 객체를 하나로 합칠 때 사용한다.</p>
	<script type="text/javascript">
		$(function() {
			var obj1 = {
					name:"김김김",
					age:20
			}
			var obj2 = {
					name:"님님님",
					hobby:["낚시", "영화"]
			}
			
			$.extend(obj1, {job:"강사"});
			
			console.log(obj1);
			console.log(obj2);
			
			
			// 두 객체를 하나로 합칠 때 사용 할 수 있다.
			// 중복되는 객체의 속성은 나중의 것으로 덮어 쓴다.
			var objs1 = $.extend(obj1, obj2);
			
			console.log(objs1);
		})
	</script>
	
	<hr>
	
	<h3>$.noConflict()</h3>
	<p>다른 라이브러리나 다른 버전의 jquery와 '$'의 충돌 방지를 위해 사용한다.</p>
	
	<h1 id="test">noConflict() 테스트</h1>
	
	<script type="text/javascript">
		/*
		var jq = $.noConflict(); // 이 키워드를 통해 $ 키워드 대신 jq를 사용 할 수 있게 된다. 
		
		jq(function() {
			jq("#test").css("color", "red");
		})
		*/
		// 위의 주석문을 해제하면 페이지의 모든 $가 jq로 바뀌므로 $로 호출한 함수들은 사용할 수 없다.
	</script>
	
	<!-- 다른 버전의 jquery와 충돌나는 경우 예시 -->
	<!-- <script src="jquery-1.11.1.js">
		var jb = jQuery.noConflict();
	</script>
	<script src="jquery-2.1.1.js">
		var hs = jQuery.noConflict();
	</script> -->
	
	
</body>
</html>



attr() : 해당 객체의 속성을 바꾸거나 확인 할 수 있는 메소드


css() : 해당 객체의 스타일을 바꾸거나 확인 할 수 있는 메소드



<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style type="text/css">
	.first{color: red;}
	.second{color: pink;}
	.third{color: orange;}
</style>
</head>
<body>
	<h3>attr() 메소드</h3>
	<p>문서 객체의 특정 속성 값을 알아내거나 속성을 추가할 때 사용한다.</p>
	<img src="../image/flower1.PNG" width="400px" height="300px">
	
	<script>
		$(function(){
			// 속성 명에 해당하는 속성 값을 리턴
			var img = $("img").attr("src");
			console.log("사진경로 : " + img);
			
			// 속성명에 해당하는 속성 값을 변경
			$("img").attr("src", "../image/flower2.PNG");

			// 함수를 통해 인덱스와 value를 활용할 수 있음
			$("img").attr("src", function(index, value){
				console.log(index, value);
			});
			
			// 객체를 통해 여러 속성을 설정
			$("img").attr({"width":"100px", "height":"50px"});
			
			// 객체의 속성을 제거
			$("img").removeAttr("width").removeAttr("height");
			
		});
	</script>
	
	<hr>
	
	<h3>css() 메소드</h3>
	<p>문서 객체의 스타일을 검사하거나 변경할 때 사용한다.</p>
	<h1 class="first">test-0</h1>
	<h1 class="second">test-1</h1>
	<h1 class="third">test-2</h1>
	
	<script type="text/javascript">
		$(function() {
			// 속성 명에 해당하는 속성 값을 리턴
			console.log($(".first").css("color"));
			
			// 속성명에 해당하는 속성 값을 변경
			$(".first").css("color", "black");
			
			// 함수를 통해 인덱스와 value를 활용할  수 있음
			$(".first").css("color", function(index, value) {
				console.log(index, value);
			});
			
			//객체를 통해 여러 속성을 지정
			$(".first").css({"font-size":"3em", "background":"orange"});
		
		})
	</script>
</body>
</html>




순회(탐색) 메소드 - Ancestors


선택한 요소의 상위 요소를 찾는 메소드이다.


parent() : 해당 요소의 바로 상위 요소


parents() : 해당 요소의 상위 요소들 전부


parentsUntil() : 해당 요소의 상위 요소부터 괄호 안에 입력된 요소까지




<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<title>Insert title here</title>
<style>
	.wrap * {
		border:1px solid lightgray;
		display:block;
		padding:5px;
		margin:15px;
		color:gray;
	}
</style>
</head>
<body>
	<h1>순회(탐색) 메소드</h1>
	<h3>Ancestors 메소드</h3>
	<p>선택된 요소의 상위 요소들을 선택할 수 있는 메소드</p>
	
	<div class="wrap">
		<div style="width:500px;">div (grand-grandParent)
			<ul>ul (grandParent)
				<li>li (directParent)
					<span>span</span>
				</li>
			</ul>
		</div>
		<div style="width:500px;">div (grandParent)
			<p>p (directParent)
				<span>span</span>
			</p>
		</div>
	</div>
	
	<script>
		$(function(){
			//선택된 요소의 바로 상위 요소만 리턴
			$("span").parent().css({"color":"red", "border":"2px solid red"});
			
			//선택된 요소의 모든 상위 요소 리턴(매개변수가 있으면 매개변수와 일치하는 부모만 리턴)
			$("span").parents("ul").css({"color":"blue", "border":"2px solid blue"});
			
			$("span").parentsUntil("div").css({"color":"yellowgreen", "border":"2px solid yellow"});
		});
	</script>
</body>
</html>





순회(탐색) 메소드 - Descendants


선택한 요소의 하위 요소를 찾는 메소드이다.


children() : 바로 다음의 하위 객체


find() : 하위에서 괄호안의 객체를 찾는다




<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<title>Insert title here</title>
<style>
	.wrap * {
		border:1px solid lightgray;
		display:block;
		padding:5px;
		margin:15px;
		color:gray;
	}
</style>
</head>
<body>
	<h1>순회(탐색) 메소드</h1>
	<h3>descendants 메소드</h3>
	<p>선택된 요소의 하위 요소를 선택할 수 있는 메소드</p>
	
	<div class="wrap">
		<div style="width:500px;">div (grand-grandParent)
			<ul>ul (grandParent)
				<li>li (directParent)
					<span>span</span>
				</li>
			</ul>
		</div>
		<div style="width:500px;">div (grandParent)
			<p>p (directParent)
				<span>span</span>
			</p>
		</div>
	</div>
	<script>
		$(function(){
			// 선택된 요소의 모든 자손(바로 다음 레벨) 객체를 리턴하고
			//매개변수가 있는 경우 일치하는 자손 객체를 리턴한다.
			//$(".wrap").children().css({"color":"red", "border":"2px solid red"});
			
			// 자식의 자식, 손자
			//$(".wrap").children().children().css({"color":"red", "border":"2px solid red"});
			
			// 손자 중 ul 태그만
			$(".wrap").children().children("ul").css({"color":"red", "border":"2px solid red"});
		
			$(".wrap").find("span").css({"color":"yellowgreen", "border":"2px solid yellowgreen"});
		});
	</script>
</body>
</html>







순회(탐색) 메소드 - sideway


siblings() : 선택 요소와 같은 레벨에 있는 요소를 리턴, 인자가 있다면 일치하는 요소만 리턴


next() : 선택 요소의 다음 요소를 리턴


nextAll() : 선택 요소의 다음 요소들을 전부 리턴


nextUntil() : 선택 요소 다음부터 괄호에 인자로 받은 태그명 까지 리턴


prev() : 선택 요소의 전 요소를 리턴


prevAll() : 선택 요소의 전 요소들을 전부 리턴


prevUntil() : 선택 요소 전부터 괄호에 인자로 받은 태그명 까지 리턴




<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style type="text/css">
	.wrap, .wrap * {
		display:block;
		border:1px solid lightgray;
		color:lightgray;
		padding:5px;
		margin:15px;
	}
</style>
</head>
<body>
	<h1>순회(탐색) 메소드</h1>
	<h3>sideway 메소드</h3>
	<div class="wrap">div (parent)
		<p>p</p>
		<span>span</span>
		<h2>h2</h2>
		<h3>h3</h3>
		<p>p</p>
	</div>
	<script type="text/javascript">
		$(function() {
			// 선택된 요소와 같은 레벨에 있는 요소 리턴
			// 인자가 있는 경우 인자와 일치하는 요소 리턴
			$("h2").siblings().css({"color":"red", "border":"2px solid red"});
			$("h2").siblings("p").css({"color":"orange", "border":"2px solid orange"});
			
			// 선택된 요소의 값은 레벨의 형제들 중 선택된 요소의 다음 한 개의 요소를 리턴한다.
			$("h2").next().css({"color":"blue", "border":"2px solid blue"});
			
			// 선택된 요소의 같은 레벨 형제 중 선택된 요소 다음 모든 요소를 리턴한다.
			$("h2").nextAll().css({"font-size" : "2em"});
			
			// 선택된 요소부터 같은 레벨의 인자 범위까지의 모든 요소를 리턴
			$("h2").nextUntil("p").css("border", "dashed");
			
			// 선택된 요소부터 같은 레벨의 형제 중 요소 이전의 한 개 요소를 리턴한다.
			$("h2").prev().css("background", "yellow");
			
			// 선택된 요소부터 같은 레벨의 형제 요소 중 이전의 모든 요소를 리턴한다.
			$("h2").prevAll().css({"background":"cyan", "color":"red"});
			
			// 선택된 요소의 같은 레벨의 형제 요소들 중
			// 인자로 전달된 요소 이전의 요소를 리턴
			$("h2").prevUntil("p").css("border", "dotted");
		})
	</script>
</body>
</html>






테이블에서 전에 썻던 even odd first last 와 같은 방법으로는 한계가 있다.


고로 아래의 방법을 확인해보자.


eq() : 괄호 안의 번호에 해당하는 순서 태그를 지칭


nth-child() : 괄호 안의 식에 해당하는 순서 태그들을 지칭


gt() : 괄호 안의 번호에 초과하는 태그들을 지칭


lt() : 괄호 안의 번호에 미만인 태그들을 지칭


contains() : 특정 문자열을 포함


has() : 특정 태그를 가지고 있는


not() : 해당 선택자와 일치하지 않는 객체



<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
	<h1>함수 형태의 필터 선택자</h1>
	<h3>:nth-child() 필터선택자</h3>
	
	<table border="1">
		<tr>
			<th>이름</th>
			<th>혈액형</th>
			<th>지역</th>
		</tr>
		<tr>
			<td>김김김</td>
			<td>C형</td>
			<td><a>달</a></td>
		</tr>
		<tr>
			<td>님님님</td>
			<td>D형</td>
			<td>태양</td>
		</tr>
		<tr>
			<td>딤딤딤</td>
			<td>E형</td>
			<td>은하계</td>
		</tr>
		<tr>
			<td>림림림</td>
			<td>C형</td>
			<td>지구</td>
		</tr>
		<tr>
			<td>밈밈밈</td>
			<td>D형</td>
			<td>소행성</td>
		</tr>
		<tr>
			<td>빔빔빔</td>
			<td>C형</td>
			<td>집</td>
		</tr>
		<tr>
			<td colspan="2">총원</td>
			<td>6</td>
		</tr>
	</table>
	
	<script type="text/javascript">
		$(function() {
			// n번째에 위치하는 객체 선택
			$("tr:eq(0)").css({"background":"black", "color":"white"});
			
			// 수열번 째 위치하는 태그 선택(순서로 적용)
			$("tr:nth-child(2n)").css("background","yellowgreen");
			$("tr:nth-child(3n)").css("background", "orange");
			
			// n번째를 초과하는 객체 선택(인덱스 적용)
			$("tr:gt(6)").css("background", "lightgray");
			
			// n번째 미만에 위치하는 객체 선택
			$("tr:lt(7)").css("font-size", "1.5em");
			// em은 부모 객체의 font size를 의미
			
			// 특정 문자열을 포함하는 객체  선택
			$("tr:contains('A형')").css("color", "red");
			
			// 특정 태그를 가지고 있는 객체 선택
			$("td:has(a)").css("color", "white");
			
			// 선택자와 일치하지 않는 객체 선택
			$("td:not(:contains('김김김'))").css("color", "lightgray");
			
			
		});
	</script>
</body>
</html>



앞의 선택자가 태그 이름과 선택자의 조합이었다면


필터링은 메소드 형태로 조건을 괄호로 받는다.


.filter(:odd) 와 같이..



<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
	<h1>필터링 메소드</h1>
	<h3>filtering 메소드의 사용법</h3>
	<p>필터 선택자를 메소드 형태로 제공한다.</p>
	
	<h4 class="test">test-1</h4>
	<h4 class="test">test-2</h4>
	<h4 class="test">test-3</h4>
	<h4 class="test">test-4</h4>
	<h4>test-5</h4>
	<h4 class="test">test-6</h4>
	
	<script type="text/javascript">
		$(function() {
			$("h4:even").css("background", "black").css("color", "white");
			
			// filter() 메소드 사용
			$("h4").filter(":even").css("background", "orangered").css("color", "white");
			
			// 함수를 매개변수로 하는 filter() 메소드 사용
			$("h4").filter(function(index) {
				return index % 2 == 1;
			}).css("background", "yellowgreen").css("color", "black");
			
			// 선택된 요소 중 제일 처음에 있는 요소 리턴
			$("h4").first().css("font-size", "1.5em");
			
			// 선택된 요소 중 제일 마지막에 있는 요소 리턴
			$("h4").last().text("마지막 요소");
			
			// 인덱스 번호와 일치하는 요소만 리턴
			$("h4").eq(3).text("eq()로 선택됨");
			
			// 인자값과 일치하지 않는 요소만 리턴
			$("h4").not(".test").css({"background":"yellow", "color":"black"});
		});
	</script>
</body>
</html>



input 태그의 타입 별  선택 방법


$("input:타입").~~~과 같이 쓴다.


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<title>Insert title here</title>
</head>
<body>
	<h1>입력 양식 필터 선택자</h1>
	<p>input 태그의 type속성에 따라 문서 객체 선택 가능</p>
	<label>텍스트 상자 : </label><input type="text"><br>
	<label>버튼 : </label><input type="button"><br>
	<label>체크박스 : </label><input type="checkbox"><br>
	<label>파일 : </label><input type="file"><br>
	<label>이미지 : </label><input type="image" src="../image/flower1.PNG"><br>
	<label>패스워드 : </label><input type="password"><br>
	<label>라디오버튼 : </label><input type="radio"><br>
	<label>리셋버튼 : </label><input type="reset"><br>
	<label>submit 버튼 : </label><input type="submit"><br>
	<script type="text/javascript">
		$(function name() {
			$("input:text").css("background", "red");
			
			$("input:button").attr("value", "왕버튼").css({"width":"200px", "height":"100px"});
			
			$("input:checkbox").attr("checked", true).css({"width":"50px", "height":"50px"});
			
			$("input:file").css("background", "yellowgreen");
			
			$("input:image").mouseenter(function() {
				$(this).attr("src", "../image/river1.PNG");
				// $(this)는 자신을 의미
			})
			
			$("input:image").mouseout(function() {
				$(this).attr("src", "../image/flower1.PNG");
			})
			
			
			$("input:radio").attr("checked", true);
			
			$("input:reset").css({"background":"blue", "color":"white"});
			
			$("input:submit").css({"background":"purple", "color":"white"});
		});
	</script>

	
</body>
</html>




input 태그에 쓰인 value의 값을 반환받는 방법은


JQuery로 원하는 태그를 불러오고 .val() 키워드를 사용


체크박스의 체크 여부 확인의 경우는 .prop("checked"); 이다.



<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<title>Insert title here</title>
</head>
<body>
	<h1>입력 양식 필터 선택자</h1>
	<h3>checkbox의 상태에 대한 선택자</h3>
	
	<input type="checkbox" name="hobby" value="game" id="game">
	<label for="game">게임</label>
	<input type="checkbox" name="hobby" value="movie" id="movie">
	<label for="movie">영화</label>
	<input type="checkbox" name="hobby" value="music" id="music">
	<label for="music">음악</label>
	
	<script type="text/javascript">
		// form 태그에서 submit으로 전송하면 ?hobby=game&hobby=movie 형태로 넘어간다.
		// 이 값은 배열 형태로 저장되게 된다.
		$("input:checkbox").change(checkedChange);
		
		function checkedChange() {
			// console.log($(this).prop("checked"));
			
			if($(this).prop("checked")){
				$(this).css({"width":"50px", "height":"50px"});
			}else{
				$(this).css({"width":"15px", "height":"15px"});
			}
		}
	</script>
	
	<hr>
	
	<h3>select > option 태그의 상태에 대한 선택자</h3>
	<select name="national" id="national">
		<option value="한국" selected>한국</option>
		<option value="미국">미국</option>
		<option value="일본">일본</option>
		<option value="중국">중국</option>
	</select>
	
	<label>선택한 나라 : </label><input type="text" id="result">
	
	<script type="text/javascript">
		$(selectChange);
		
		$("#national").change(selectChange);
	
		function selectChange() {
			var value = $("option:selected").val();
			
			$("#result").val(value);
		}
	</script>
	
	<hr>
	
	<h3>input 상태에 대한 선택자</h3>
	<label>활성화 텍스트상자 : </label><input type="text"><br>
	<label>비 활성화 텍스트 상자 : </label><input type="text" disabled><br>
	<label>활성화 버튼 : </label><input type="button" value="활성화"><br>
	<label>비 활성화 버튼 : </label><input type="button" value="비활성화" disabled><br>
	
	<script type="text/javascript">
		$(function() {
			$("input:enabled").css("background", "yellowgreen");
			$("input:disabled").css("background", "red");
		})	
	</script>
	
	<hr>
	
	<h3>필터 선택자</h3>
	
	<table border="1">
		<tr>
			<th>이름</th>
			<th>혈액형</th>
			<th>지역</th>
		</tr>
		<tr>
			<td>김김김</td>
			<td>C형</td>
			<td>달</td>
		</tr>
		<tr>
			<td>님님님</td>
			<td>D형</td>
			<td>태양</td>
		</tr>
		<tr>
			<td>딤딤딤</td>
			<td>E형</td>
			<td>은하계</td>
		</tr>
		<tr>
			<td>림림림</td>
			<td>C형</td>
			<td>지구</td>
		</tr>
		<tr>
			<td>밈밈밈</td>
			<td>D형</td>
			<td>소행성</td>
		</tr>
		<tr>
			<td>빔빔빔</td>
			<td>C형</td>
			<td>집</td>
		</tr>
		<tr>
			<td colspan="2">총원</td>
			<td>6</td>
		</tr>
	</table>
	
	<script type="text/javascript">
		$(function() {
			// odd : 홀수, 0번째 인덱스 부터 계산
			$("tr:odd").css("background", "orange");
			// even : 짝수, 0번째 인덱스 포함
			$("tr:even").css("background", "lightgray");
			// first : 첫번째
			$("tr:first").css("background", "black").css("color", "white");
			// last : 마지막
			$("tr:last").css("background", "orangered").css("color", "white");
		});
	</script>
</body>
</html>






+ Recent posts