match 함수를 사용하려고 하였는데 match는 정규식을 인식하기 때문인지 +를 문자열로 받아주질 않았다..
그래서 정규표현식을 사용해버리기로 했다~
//로그인 실패시 alert ()
var message = null;
//uri에서 get방식으로 넘긴 값 추출
var uri = decodeURI(location.href);
var get = uri.substr(uri.indexOf('?')+1);
if(uri != get){
message = get.substr(get.indexOf('=')+1);
};
//.을 제외한 특수문자 정규식
var regExp = /[\{\}\[\]\/?,;:|\)*~`!^\-+<>@\#$%&\\\=\(\'\"]/gi;
if(regExp.test(message)){
//.을 제외한 특수문자를 공백으로 치환
message = message.replace(regExp,' ');
};
//추출한 값이 null이 아닐 경우 alert창 출력
if(message != null){
alert(message);
};
test를 통해 .을 제외한 특수문자 정규식과 message의 문자열과 비교해 특수문자 여부를 파악하고
message에 특수문자가 있다면 정규식에 기술한 특수문자들을 공백으로 바꾸는 식을 만들었다!
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <!-- viewport :: 반응형 웹이 되도록 하는 중요 키워드-->
<!-- 위 3개의 메타 태그는 *반드시* head 태그의 처음에 와야합니다; 어떤 다른 콘텐츠들은 반드시 이 태그들 *다음에* 와야 합니다 -->
<title>부트스트랩 101 템플릿</title>
<!-- 부트스트랩 -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- IE8 에서 HTML5 요소와 미디어 쿼리를 위한 HTML5 shim 와 Respond.js -->
<!-- WARNING: Respond.js 는 당신이 file:// 을 통해 페이지를 볼 때는 동작하지 않습니다. -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<h1>Hello, world!</h1>
<!-- jQuery (부트스트랩의 자바스크립트 플러그인을 위해 필요합니다) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<!-- 모든 컴파일된 플러그인을 포함합니다 (아래), 원하지 않는다면 필요한 각각의 파일을 포함하세요 -->
<script src="js/bootstrap.min.js"></script>
</body>
</html>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>부트스트랩 프레임워크</title>
<!-- 부트스트랩 -->
<link href="./resource/bootstrap-3.3.2-dist/css/bootstrap.min.css" rel="stylesheet">
<link href="./resource/bootstrap-3.3.2-dist/css/bootstrap-theme.min.css" rel="stylesheet">
<script src="./resource/js/jquery-3.4.1.min.js"></script>
<!-- IE8 에서 HTML5 요소와 미디어 쿼리를 위한 HTML5 shim 와 Respond.js -->
<!-- WARNING: Respond.js 는 당신이 file:// 을 통해 페이지를 볼 때는 동작하지 않습니다. -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<h1>아이콘</h1>
<div>
콤포넌트에 소개된 아이콘의 클래스를 유지하면 아이콘이 출력된다.
</div>
<button type="button" class="btn btn-info" >
<span class="glyphicon glyphicon-asterisk" ></span>
</button>
<a href="http://naver.com/" class="btn btn-success" >
<span class="glyphicon glyphicon-tower" ></span>
</a>
<i class="glyphicon glyphicon-leaf"></i>
<h1>드롭다운</h1>
<div class="dropdown">
<button class="btn btn-warning dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown">
Dropdown
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li role="presentation"><a href="#">유니스야 </a></li>
<li role="presentation" class="divider"></li>
<li role="presentation"><a href="#">카레 먹고싶어</a></li>
<li role="presentation" class="divider"></li>
<li role="presentation"><a href="#">다은이</a></li>
<li role="presentation"><a href="#">바부..</a></li>
</ul>
</div>
<h1>버튼그룹</h1>
<div class="btn-group">
<button type="button" class="btn btn-danger">Left</button>
<button type="button" class="btn btn-success">Middle</button>
<button type="button" class="btn btn-info">Right</button>
</div>
<div class="btn-group btn-group-lg">
<button type="button" class="btn btn-danger">Left</button>
<button type="button" class="btn btn-success">Middle</button>
<button type="button" class="btn btn-info">Right</button>
</div>
<h1>크기를 알리는 클래스 접두사</h1>
<div>
대략적으로 크기를 지정할 수 있는 클래스 옵션이 있으며, 대표 클래스 다음 대표클래스-* 형태로 클래스를 지정하여 크기를 조절할 수 있다.
<br>
예) btn btn-lg
<br>
크기 종류
<br>
대표클래스-xs < 대표클래스-sm < 대표클래스-md < 대표클래스-lg
</div>
<button type="button" class="btn btn-info btn-xs" >
<span class="glyphicon glyphicon-asterisk" ></span>
</button>
<button type="button" class="btn btn-info btn-sm" >
<span class="glyphicon glyphicon-asterisk" ></span>
</button>
<button type="button" class="btn btn-info btn-md" >
<span class="glyphicon glyphicon-asterisk" ></span>
</button>
<button type="button" class="btn btn-info btn-lg" >
<span class="glyphicon glyphicon-asterisk" ></span>
</button>
<h1>양쪽 정렬 버튼</h1>
<div>부모의 태그 가로 사이즈 100% 지정하여 정렬</div>
<div class="btn-group btn-group-justified" role="group" aria-label="...">
<div class="btn-group" role="group">
<button type="button" class="btn btn-default">Left</button>
</div>
<div class="btn-group" role="group">
<button type="button" class="btn btn-default">Middle</button>
</div>
<div class="btn-group" role="group">
<button type="button" class="btn btn-default">Right</button>
</div>
</div>
<h1>색상을 표기하는 클래스 접두사</h1>
<div>
색상을 표기할 때 '대표클래스-*' 형태로 사용 가능하며 대략적으로 테마별 옵션은 아래의 6가지 옵션으로 지정하여 쓰도록 하고 있다.
<br>
대표클래스-default<br>
대표클래스-danger<br>
대표클래스-warning<br>
대표클래스-success<br>
대표클래스-info<br>
대표클래스-primary<br>
</div>
<button type="button" class="btn btn-default">default</button>
<button type="button" class="btn btn-danger">danger</button>
<button type="button" class="btn btn-warning">warning</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-primary">primary</button>
<h1>폼 태그 기본 클래스</h1>
<div>기본적으로 폼태그에 들어가는 클래스가 있다.<br>
form-control : 부모의 가로 사이즈를 기준으로 100% 정렬
</div>
<input type="text" class="form-control">
<select class="form-control">
<option> :: 선택 :: </option>
</select>
<textarea class="form-control"></textarea>
<h1>입력 그룹</h1>
<div class="input-group">
<span class="input-group-addon" id="basic-addon1">@</span>
<input type="text" class="form-control" placeholder="Username">
</div>
<div class="input-group">
<span class="input-group-addon" id="basic-addon1">
<input type="checkbox"> 체크하기
</span>
<input type="text" class="form-control" placeholder="Username">
</div>
<div class="input-group">
<input type="text" class="form-control" placeholder="Username">
<span class="input-group-btn">
<button type="button" class="btn btn-warning">버튼</button>
</span>
</div>
<h1>active 클래스</h1>
<div>
active는 현재 위치 혹은 강조를 표기하는(활성화) 클래스이다.
</div>
<h1>탭</h1>
<ul class="nav nav-tabs">
<li class="active"><a href="#">Home</a></li>
<li class="active"><a href="#">Profile</a></li>
<li><a href="#">Messages</a></li>
</ul>
<h1>네비게이션 바</h1>
<div>
- nav 태그에 navbar 대표 클래스가 있어야 하며, navbar-* 접두사로 색상 변경이 가능하다.
<br>
- navbar-header 클래스는 브랜드(로고)와 반응형에 관련된 메뉴 아이콘의 요소가 들어있다.
<br>
- collapse navbar-collapse 클래스는 실제 보이는 메뉴를 나열할 수 있다.
</div>
<nav class="navbar navbar-inverse">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Brand</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-navbar">
<ul class="nav navbar-nav navbar-left">
<li><a href="#">Link</a></li>
<li><a href="#">Zelda</a></li>
<li><a href="#">WolfLink</a></li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
<h1>data-target 속성</h1>
<div>
버튼 태그에 data-target 속성이 존재할 경우 이벤트를 발동시킬 대상을 말하는 것이며, data-target에 명시된 대상은 존재해야 한다.
<br>
ex) data-target="선택자" : 선택자와 일치하는 타겟이 있어야 함.
</div>
<h1>라벨</h1>
<div>
인라인 속성 태그를 기준으로 사용 가능하며, 주로 span 태그에 적용한다.
<br>
라벨에도 색상기준 접두사로 옵션을 붙여 사용할 수 있다.
<br>
대표 클래스 : label
<br>
색상옵션 : label-*
<br>
* : default, danger, warning, success, info, primary
</div>
<span class="label label-default">default</span>
<span class="label label-danger">danger</span>
<span class="label label-warning">warning</span>
<span class="label label-success">success</span>
<span class="label label-info">info</span>
<span class="label label-primary">primary</span>
<h1>뱃지</h1>
<span class="badge badge-default">default</span>
<h1>alert</h1>
<div>
알림을 텍스트로 표현할 때<br>
대표 클래스 alert <br>
옵션 클래스 alert-*<br>
* : danger, warning, success, info<br><br>
</div>
<span class="alert alert-danger">danger</span>
<span class="alert alert-warning">warning</span>
<span class="alert alert-success">success</span>
<span class="alert alert-info">info</span>
<h1>패널</h1>
<div>
대표 클래스 panel <br>
옵션 클래스 panel-* <br>
* : default, danger, warning, success, info, primary
panel 클래스의 하위 태그<br>
panel-heading, panel-body, panel-footer 클래스를 가진 태그로 이루어져 있다.<br>
</div>
<div class = "panel panel-default">
<div class="panel-heading">heading</div>
<div class="panel-body">body</div>
<div class="panel-footer">footer</div>
</div>
<div class = "panel panel-danger">
<div class="panel-heading">heading</div>
<div class="panel-body">body</div>
</div>
<div class = "panel panel-warning">
<div class="panel-heading">heading</div>
<div class="panel-body">body</div>
</div>
<div class = "panel panel-success">
<div class="panel-heading">heading</div>
<div class="panel-body">body</div>
</div>
<div class = "panel panel-info">
<div class="panel-heading">heading</div>
<div class="panel-body">body</div>
</div>
<div class = "panel panel-primary">
<div class="panel-heading">heading</div>
<div class="panel-body">body</div>
</div>
<h1>모달</h1>
<div>
레이어 팝업 - 레이아웃을 설정하고 css 조정으로 팝업 효과가 보이도록 만드는 콤포넌트
</div>
<!-- Button trigger modal -->
<button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#myModal">
Launch demo modal
</button>
<!-- Modal -->
<div class="modal fade" id="myModal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="myModalLabel">Modal title</h4>
</div>
<div class="modal-body">
...
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-info">Save changes</button>
</div>
</div>
</div>
</div>
<h1>pull-left, pull-right</h1>
<div>
인라인 요소 처럼 텍스트 등을 정렬할 때 사용
</div>
<h1>
pull-left테스트
<small class="pull-left">pull-left</small>
</h1>
<h1>
pull-right테스트
<small class="pull-right">pull-right</small>
</h1>
<h1></h1>
<script src="./resource/bootstrap-3.3.2-dist/js/bootstrap.min.js"></script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
var request = $.ajax({
url: "script.php", //통신 할 url
method: "POST", // 통신할 메서드 타입
data: { id : '' }, //전송할 데이터
dataType: "html" //전송받은 데이터를 변화시킬 컨텐츠 타입
/*
tataType
html(text/html), sjon (application/jason),xml (text/xml), text (text/palin)
*/
});
//정상적으로 통신이 완료되었을 경우 실행되는 메서드
//인수값인 함수를 실행시켜준다 (콜백함수)
request.done(function( data ) {
consolo.log.( data );
});
//에러 발생시 실행되는 메서드
request.fail(function( jqXHR, textStatus ) {
alert( "Request failed: " + textStatus );
});
/*
웹(브라우저)에서 표현할 수 있는 콘텐츠 타입
1) text/html
html을 표현하는 타입
2) text/xml
xml을 표현하는 타입
(외부 자원 관리 데이터로 저장 혹은 외부와 통신하기 위한 타입)
3) text/plain
텍스트를 표기하는 타입
4) application/json
json을 표현하는 타입
포맷터 : {"키" : "값"} 형태로 이루어진 문자열
*/
</script>
<title>콘텐츠 삽입</title>
</head>
<body>
</body>
</html>
Ajax Html Call
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
$(function() {
$('#ajaxCall').click(function() {
var num = $('#num').val()
var request = $.ajax({
url: "ajaxHtmlCall.jsp", //통신 할 url
method: "POST", // 통신할 메서드 타입
data: { len : num }, //전송할 데이터
dataType: "html" //전송받은 데이터를 변화시킬 컨텐츠 타입
});
request.done(function(data) {
console.log(data);
if(data != undefined && data != ''){
$('#ajaxResult').html(data);
}
});
request.fail(function( jqXHR, textStatus ) {
alert( "Request failed: " + textStatus );
});
});
})
</script>
<title>Insert title here</title>
</head>
<body>
<input type="number" id="num" placeholder="출력갯수">
<button type="button" id="ajaxCall">호출</button>
<div id="ajaxResult">호출 버튼을 클릭하세요</div>
</body>
</html>
ajaxHtmlCall.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList" %>
<%
//len 키 값으로 ajax02.html 에서 값 전송하여 받기
String len = request.getParameter("len");
int num = 0;
//len 값이 null과 공백이 아니라면
if(len != null && !"".equals(len.trim())){ // nullPointException을 피하기 위해 변수를 메서드 안에서 쓰기
num = Integer.parseInt(len);
}
%>
<!DOCTYPE html>
<style>
td{border : 1px solid #000;}
</style>
<table>
<tbody>
<%
for(int i = 0 ; i < num ; i ++){
%>
<tr>
<td>안녕하세요 <%= i %></td>
</tr>
<%
}
%>
</tbody>
</table>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
/*
<속성 조작 메서드>
: 선택된 객체의 속성값을 가지고 오거나 변경이 가능한 메서드
<Parsing> ((cf. 형변환))
: 서로 다른 데이터를 변환하는 작업
- parser : 서로 다른 테이터를 변환하는 대상 혹은 도구 (플러그인, api(메서드))
1) $('선택자').html()
: 선택된 객체의 html요소를 가지고 오거나 삽입
ex) $('body').html(); 선택된 객체의 자식 html 요소 가지고 오기
$('body').html('<h1>안녕하세요</h1>'); 선택된 객체에 값 삽입
2) $('선택자').text()
: 선택된 객체의 하위 요소의 text를 가지고 오거나 삽입
ex) $('body').text(); body의 하위 텍스트 전체 가지고 오기
$('body').text('안녕하세요'); body의 하위 텍스트 전체 가지고 오기
*** 3) $('선택자').attr()
: 선택된 객체의 속성을 가지고 오거나 삽입한다.
웹표준에 존재하지 않는 속성도 삽입하거나 가지고 올 수 있다.
ex) $('body').attr('myName'); body에 myName 이라는 속성의 값을 가지고 온다.
$('body').attr('myName', '홍길동'); body에 myName 이라는 속성을 생성하고 속성 myName의 값으로 홍길동을 삽입한다.
4) $('선택자').removeAttr('속성명')
: 선택된 객체의 인수값에 해당되는 속성을 제거한다.
ex) $('body').removeAttr('myName'); body에 myName이라는 속성을 제거
5) $('선택자').prop()
: 선택된 객체의 상태속성을 확인하거나 변경한다. ('checked', 'selected', 'hidden' 등)
ex) $('body').prop('hidden', true); body 태그의 상태를 hidden으로 변경
$('body').prop('hidden', false); body 태그의 상태를 hidden 해제
$('body').prop('hidden'); body 태그의 상태 중 hidden의 상태값을 true / false로 가지고 온다.
6) $('선택자').val()
: 선택된 객체의 value 속성값을 가지고 오거나 변경한다.
ex) $('input').val(); input 태그의 value속성의 값을 가지고 온다.
$('input').val('홍길동'); input 태그의 value속성의 값을 '홍길동'으로 변경한다.
7) $('선택자').css()
: 선택된 객체의 css 속성을 적용 혹은 값을 가지고 온다.
ex) $('body').css('border', '1px solid #ff0000'); body에 border라는 css속성 1px solid #ff0099을 적용
$('body').css('border'); body에 적용된 css속성 border 값을 가지고 오기
ex2) 다중으로 css 속성 적용하기
$('body').css({
'border':'1px solid #ff0000',
'padding':'5px'
})
8) $('선택자').addClass('클래스명')
: 선택된 객체에 클래스를 추가 삽입
ex) $('body').addClass('syntaxhighlighter'); body에 클래스 속성의 값에 syntaxhighlighter를 추가한다.
9) $('선택자').removeClass('클래스명')
: 선택된 객체에 인수값에 해당하는 클래스를 제거
ex) $('body').removeClass('syntaxhighlighter'); body의 클래스 속성에 syntaxhighlighter 값이 있다면 syntaxhighlighter 제거
10) $('선택자').('클래스명')
:
ex)
*/
</script>
</head>
<body>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>객체 편집 메서드</title>
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
/*
<객체 편집 메서드>
: 선택한 객체의 옵션 (메서드에 위치 옵션 포함) 위치에 html 요소를 삽입
1) $('선택자').before('html 요소')
: 선택한 대상의 이전 위치에 html 삽입
2) $('선택자').after('html 요소')
: 선택한 대상의 이전 위치에 html 삽입
*** 3) $('선택자').append('html 요소')
: 선택한 대상의 자식요소 제일 끝에 html 삽입
*** 4) $('선택자').prepend('html 요소')
: 선택한 대상의 자식요소 제일 처음에 html 삽입
5) $('선택자').clone()
: 선택한 대상을 복제한다.
*/
$(function(){
$('#beforeAfterBtn').click(function(){
$('#center').before('<div>이전</div>')
$('#center').after('<div>다음</div>')
})
$('#appendBtn').click(function(){
var len = $('#addTr').find('tr').length;
$('#addTr').append('<tr><td> 마지막' + len + ' </td></tr>')
})
$('#prependBtn').click(function(){
var len = $('#addTr').find('tr').length;
$('#addTr').prepend('<tr><td> 처음' + len + ' </td></tr>')
})
$('#cloneBtn').click(function(){
//clone 변수에 #cloneTarget을 복제한다.
var clone = $('#cloneTarget').clone();
console.log(clone,'<<clone');
//clone() 메서드로 복제시 clone변수에 담긴 객체를 조회할 수 있다.
clone.find('h2').text('안녕하세요2');
console.log(clone.html(),'<<clone.html()')
$('#cloneCopy').html(clone.html());
})
})
</script>
</head>
<body>
<h1> before after </h1>
<div id="center">
중앙
</div>
<button type="button" id="beforeAfterBtn">다음과 이전 html 삽입</button>
<h1> append prepend</h1>
<table>
<tbody id="addTr">
<tr><td> 중앙 </td></tr>
</tbody>
</table>
<button type="button" id="appendBtn">append</button>
<button type="button" id="prependBtn">prepend</button>
<div id="cloneTarget">
<h2>안녕하세요.</h2>
</div>
<div id="cloneCopy"></div>
<button type="button" id="cloneBtn">복제</button>
</body>
</html>
동적바인딩
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>동적 바인딩</title>
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
/*
<동적 바인딩>
: html 실행 순서에 따라 dom 객체가 생성되기 때문에 이벤트 실행 완료 이후에 생성되는 html 에는 이벤트를 걸 수 없다.
때문에 동적으로 이벤트를 걸거나 객체 생성시에 이벤트를 걸어야 한다.
*/
$(document).on('click','.add',function() {
var clone = $(this).parent().clone();
$('body').append(clone);
})
$(document).on('click','.del',function() {
$(this).parent().remove();
})
</script>
</head>
<body>
<div class="btn-wrap">
<button type="button" class="add">생성</button>
<button type="button" class="del">제거</button>
</div>
</body>
</html>
객체 조작 메서드 활용 실습
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>객체 조작 메서드 활용 실습</title>
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
/*
실습5. .file-add 클릭시 파일을 더 추가할 수 있는 폼을 추가하고 .file-del 클릭시 파일을 첨부할 수 있는 폼을 제거하여라.
파일 추가 최대 갯수는 5개이고 1개 최소 1개는 존재해야한다.
*/
$(document).on('click','.file-add',function(){
console.log($('.file-add').parent().length)
if($('.file-add').parent().length <= 5){
var clone = $(this).parent().clone();
$('#file-warp').append(clone);
}
})
$(document).on('click','.file-del',function(){
console.log($('.file-del').parent().length)
if($('.file-del').parent().length > 1){
$(this).parent().remove();
}
})
</script>
</head>
<body>
<div id="file-warp">
<div class="file-group">
<input type="file">
<button type="button" class="file-add">파일 추가</button>
<button type="button" class="file-del">파일 제거</button>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>객체 조작 메서드 활용 실습</title>
<script type="text/javascript" src="./resource/js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
/*
실습5. .file-add 클릭시 파일을 더 추가할 수 있는 폼을 추가하고 .file-del 클릭시 파일을 첨부할 수 있는 폼을 제거하여라.
파일 추가 최대 갯수는 5개이고 1개 최소 1개는 존재해야한다.
*/
$(document).on('click','.file-add',function(){
var len = $('.file-group').length;
if(len<5){
var clone = $(this).parent().clone();
clone.find('input').val('');
$('#file-warp').append(clone);
} else {
alert('더 이상 추가할 수 없습니다.')
}
})
$(document).on('click','.file-del',function(){
var len = $('.file-group').length;
if(len>1){
$(this).parent().remove();
} else {
alert('더 이상 삭제할 수 없습니다.')
}
})
</script>
</head>
<body>
<div id="file-warp">
<div class="file-group">
<input type="file">
<button type="button" class="file-add">파일 추가</button>
<button type="button" class="file-del">파일 제거</button>
</div>
</div>
</body>
</html>