수업내용/Javascript & jQuery

[2022.12.02.금] jQuery DOM 돌아다니기

주니어주니 2022. 12. 2. 18:11

 

 

1. HTML DOM 돌아다니기


: 현재 선택된 엘리먼트를 기준으로 다른 엘리먼트와의 관계를 활용해서 특정 엘리먼트를 검색하는 것이다.

 

 

  • 부모, 조상 검색 메소드
    • $(selector).parent()                        selector로 검색된 엘리먼트의 부모 엘리먼트를 선택
    • $(selector).parents()                      selector로 검색된 엘리먼트의 모든 조상 엘리먼트를 선택
    • $(selector1).parents(selector2)     selector1으로 검색된 엘리먼트 조상중에서 selector2에 해당하는 모든 조상 엘리먼트들 선택
    • $(selector1).closest(selector2)      selector1으로 검색된 엘리먼의 조상중에서 selector2에 해당되는 가장 가까운 조상 엘리먼트 선택

 

 

 

-sample15-dom

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet" >
<title>웹 애플리케이션</title>
</head>
<style>
   .btn-xs {
      --bs-btn-padding-y: .25rem; 
      --bs-btn-padding-x: .5rem; 
      --bs-btn-font-size: .75rem;
   }
</style>
<body>
<div class="container">
   <h1>jQuery DOM</h1>
   
   <form class="border bg-light p-3">
   		<div class="mb-3">
   			<label class="form-label">이름</label>
   			<input type="text" class="form-control" name="name" />
   		</div>
   		<div class="mb-3" id="box-career">
   			<label class="form-label">
   				경력사항
   				<button type="button" class="btn btn-outline-primary btn-sm" id="btn-add-career-field">추가</button>
			</label>
   			<input type="text" class="form-control mb-2" name="career" />
   		</div>
   		<div class="text-end">
   			<button type="submit" class="btn btn-primary">등록</button>
   		</div>
   </form>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
	$("#btn-add-career-field").click(function(){
		
		var careerFieldLength = $("#box-career :input[name=career]").length;
		if(careerFieldLength >= 5){
			alert("경력사항 입력필드는 최대 4개까지만 추가할 수 있습니다.");
			return;
		}
		
		var htmlContent = `
	         <div class="row ">
	            <div class="col-10">
	               <input type="text" class="form-control mb-2" name="career">
	            </div>
	            <div class="col-2 text-end pt-1">
	               <button type="button" class="btn btn-danger btn-xs">삭제</button>
	            </div>
	         </div>
	      `;
	      $("#box-career").append(htmlContent);
	}); 
	
	// id="box-career" 안의 class="btn-danger" 버튼을 클릭했을 때 (+미래에 추가될 버튼도)
	$("#box-career").on('click', '.btn-danger', function(){	//
		alert("삭제하기");
		
		// this는 클릭이벤트가 발생할 엘리먼트
		// $(this) 함수의 실행결과는 this를 포함하는 jQuery 객체
		
		// .closest('선택자')는 조상 엘리먼트 중에서 지정한 선택자를 포함하는 가장 가까운 조상 엘리먼트를 포함하는 jQuery 객체 
		$(this).closest('.row').remove();
	})
})
</script>
</body>
</html>

 

 

 

 

  • 자식, 자손 검색 메소드
    • $(selector).children()               selector의 검색된 엘리먼트의 모든 자식 엘리먼트를 선택
    • $(selector1).find(selector2)     selector1으로 검색된 엘리먼트의 후손 엘리먼트 중에서 selector2에 해당하는 모든 후손 엘리먼트 선택
  • 형제 검색 메소드
    • $(selector).prev()                    selector로 검색된 엘리먼트의 바로 윗 형 엘리먼트 선택
    • $(selector).prevAll()                selector로 검색된 엘리먼트의 모든 형 엘리먼트들 선택
    • $(selector).next()                    selector로 검색된 엘리먼트의 바로 아래 동생 엘리먼트 선택
    • $(selector).nextAll()                selector로 검색된 엘리먼트의 모든 동생 엘리먼트들 선택
    • $(selector).siblings()               selector로 검색된 엘리먼트의 모든 형제 엘리먼트들 선택
  • 필터 메소드
    • $(selector1).filter(selector2)   selector1으로 검색된 엘리먼트 중에서 selector2에 해당하는 모든 엘리먼트 선택
    • $(selector).filter(콜백)            selector로 검색된 엘리먼트 중에서 콜백함수가 true를 반환하는 모든 엘리먼트 선택
      * 콜백함수
      function(index) { ... }
      * 콜백함수는 selector로 검색된 엘리먼트의 갯수만큼 실행된다.
      * 콜백함수는 실행될 때마다 this로 검색된 엘리먼트를 하나씩 순서대로 전달받는다.
      * 콜백함수가 true를 반환한 것만 최종적으로 선택된다.
    • $(selector).first()                     selector로 검색된 엘리먼트 중에서 첫번째 엘리먼트 선택
    • $(selector).last()                     selector로 검색된 엘리먼트 중에서 마지막번째 엘리먼트 선택
    • $(selector).eq(index)               selector로 검색된 엘리먼트 중에서 index번째 엘리먼트 선택
    • $(selector1).has(selector2)     selector1으로 검색된 엘리먼트 중에서 selector2를 후손으로 가지고 있는 엘리먼트 선택
    • $(selector1).not(selecotr2)     selector1으로 검색된 엘리먼트 중에서 selector2에 해당하지 않는 엘리먼트 선택
  • 기타 필터 메소드
    • $(selector1).필터메소드1(selector2).조작함수() selector1으로 검색된 엘리먼트 중에서 selector2에 해당하는 엘리먼트 검색 후 조작함수 실행
                  .end() 필터메소드1() 실행 전 상태로 되돌아간다.
                                  .필터메소드2(selector3).조작함수() selector1으로 검색된 엘리먼트 중에서 selector3에 해당하는 엘리먼트 검색 후 조작함수 실행
      * end()는 맨 마지막에 실행된 필터메소드 실행 이전 상태로 jQuery결합집합의 상태가 되돌아간다.

    • $(selector1).is(selector2) selector1으로 선택된 엘리먼트가 selector2에 해당하는 true를 반환한다.
    • $(selector).index() selector로 선택된 엘리먼트가 부모로부터 몇번째 엘리먼트인지를 반환한다.(0번부터 시작하는 숫자)

 

 

 

 

* filter와 find의 차이 

 

 

 

- sample18.dom

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
<title>샘플 애플리케이션</title>
</head>
<body>
<div class="container">
	<h1>jQuery DOM</h1>
	
	<div class="mb-3 border p-3">
		<h3>연습</h3>
		<p>첫번째</p>
		<p id="selected-p">두번째</p>
		<p>세번째</p>
		<p>네번째</p>
	</div>
	
	<div class="mb-3 p-3">
		<div class="row border mb-3 p-3">
			<div class="col border">1-1</div>
			<div class="col border">1-2</div>
			<div class="col border">1-3</div>
		</div>
		<div class="row border mb-3 p-3">
			<div class="col border">2-1</div>
			<div class="col border">2-2</div>
			<div class="col border">2-3</div>
		</div>
		<div class="row border mb-3 p-3">
			<div class="col border">3-1</div>
			<div class="col border">3-2</div>
			<div class="col border">3-3</div>
		</div>
	</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
	
	$("#selected-p").prev().addClass("fw-bold text-danger");
	$("#selected-p").prevAll().addClass("border border-danger");
	$("#selected-p").next().addClass("fw-bold text-primary");
	$("#selected-p").nextAll().addClass("border border-primary");
	$("#selected-p").siblings().addClass("bg-light");
	
	// ".row"로 선택된 엘리먼트 중에서 ":first"에 해당하는 엘리먼트 선택 
	$(".row").filter(":first").addClass('bg-warning');
	
	// ".row"로 선택된 엘리먼트의 자손 엘리먼트 중에서 ":first"에 해당하는 엘리먼트 선택
	$(".row").find(":first").addClass('bg-danger');
})
</script>
</body>
</html>