item의 갯수만큼 for문을 돌지만, 다른곳에서 실행하고, 개발자는 실행할 메소드만 알려주었다. 100번도 돌수 있다.
jQuery event관련 method
* click(cb) 엘리먼트를 클릭했을 때 콜백 실행
* keyup(cb) 엘리먼트에서 키보드가 다시 올라올 때 콜백 실행(입력필드에 값이 표시)
* change(cb) 엘리먼트(select, radio, checkbox)의 값(선택된/체크된 값)이 변할 때 마다 콜백 실행
* submit(cb) 폼엘리먼트의 입력값들이 서버로 제출될 때 콜백 실행
* scroll(cb) 스크롤바가 움직일 때 마다 콜백 실행
* hover(cb1, cb2) mouseenter와 mouseleave를 한 번에 처리하는 메소드
올리면 글이 보이고 마우스를 떠나면 이미지가 보이는 경우 진입과 빠짐이 거의 쌍으로 많이 사용되기 때문에 쌍으로 구현될 수 있는 편리 메소드이다.
한번에 정의 되었다.
jQuery에서 함수 this는 중요하다.
함수를 정의하게 되면 Window객체의 사용자정의객체 내부에 들어가게된다. window로 접근하게 된다. fn();로 호출하면 window.fn();으로 호출되고, alert와 console모두 앞은 생략되어있지만, Window가 작성되어 있는 것이다. 생략하고 적으면 window안에서 찾고 값을 읽어온다.
this에는 일반적으로 메소드를 호출한 객체가 들어가게된다. 자바에서는 this에는 자기자신이 들어가지만 자바스크립트에서는 메소드를 호출하는 객체가 this로 전달하게 된다. 메소드 (this)는 원하는 걸 전달 할 수 있다.
자바스크립트 함수내에서 this는 일반적으로 그 함수를 호출한 객체다.
하지만, 자바스크립트는 함수안에서 사용되는 this에 임의의 객체를 전달하는 것이 가능하다. event처리할 때 편하게 사용할 수 있다.
jQuery에서는 이벤트핸들러함수의 this에 이벤트가 발생한 엘리먼트객체가 전달된다.
this에는 이벤트가 발생한 엘리먼트 객체 (jQeury결과 집합 객체가 아님)가 전달된다.
jQuery에서는 <form>태그에서 onsubmit이벤트 발생시 실행되는 이벤트 핸들러 함수가 false값을 반환하면 폼입력값이 서버로 제출되지 않는다.
이벤트 핸들러함수가 false값을 반환하면 <form>태그에서 onsubmit이벤트 발생했을 때 서버로 폼입력값을 제출하는 기본동작이 실행되지 않는다.
즉, 이벤트핸들러 함수가 false값을 반환하면 해당 엘리먼트에서 특정이벤트 발생시 자동으로 실행되는 기본동작의 실행을 중지시킬 수 있다.
대상 엘리먼트는 <a>, <form>태그이다.
a태그에서는 onclick이벤트가 발생하면 지정된 링크로 이동하는 기본동작이 발생하는 데, 이 기본동작을 제어할 수 있다.
form태그에서는 onsubmit이벤트가 발생하면 서버로 폼입력을 제출하는 기본동작이 실행되는데, 이 기본동작을 제어할 수 있다.
a태그와 form태그 외에는 사용할 일이 없다.
버튼에 이벤트를 거는 것이 아닌 form태그에 이벤트를 걸어야한다.
$("#form-login").submit(function(){ //form태그에 걸린 id에서 onsubmit에 대한 편리메소드를 실행하면 실행되는 함수이다. var userId = $("input[name=id]").val(); //input의 속성id가 name의 속성값을 변수 userId에 입력한다. if(userId == ""){ //만약 userId 가 빈문자열이라면 alert("아이디는 필수 입력값입니다."); //경고창메세지를 출력한다. return false; //그리고 중지시킨다 -->submit은 true여야 통과된다. } var userPwd = $("input[name=pwd]").val(); //input의 name이 pwd의 속성값을 변수 userPwd에 저장한다. if(userPwd == ""){ //만약 userPwd가 빈문자열이라면 alert("비밀번호는 필수 입력값입니다."); //경고창 메세지를 출력한다. return false; //그리고 중지시킨다 }
return true; //둘다 빈칸이 아니라면 submit메소드가 실행된다.
submit이라는 이벤트가 발생될 때 이벤트 핸들러 함수가 발생되게 한다.
이벤트 핸들러 함수가 return값이 true면 제출, false면 제출되지 않게 한다.
현재 존재하지 않는 엘리먼트에 이벤트 핸들러 등록하기
<div class="card"> <div class="card-header"> <h4>입력폼<button class="btn btn-outline-primary btn-sm float-end" id="btn-add-field">추가</button></h4> <!-- 이버튼을 클릭했을 때 추가가되기 위해서 id를 부여함 --> </div> <div class="card-body"> <div class="mb-3"> <label class="form-label">이름</label> <input type="text" class="form-control"/> </div> <div class="mb-3"> <label class="form-label">경력사항</label> <div class="d-flex justify-content-between"> <input type="text" class="form-control w-75"/> <!-- 첫번째꺼에는 삭제가 없이 작성함 --> </div> </div> <div class="mb-3"> <div class="d-flex justify-content-between"> <input type="text" class="form-control w-75"/> <button class="btn btn-outline-danger btn-sm">삭제</button> </div> </div> <!-- 새 경력사항이 추가될 곳, 이 위치를 찾아야한다. 맨 마지막 mb-3 뒤에 들어가야한다.--> </div> </div>
on사용방법은 2가지가 존재한다.
$(selector).on('이벤트명', 콜백함수)
선택된 엘리먼트에서 지정한 이벤트가 발생할 때마다 콜백함수가 실행된다.
$(container).on('이벤트명', selector, 콜백함수)
container로 지정된 엘리먼트안에 selector로 검색되는 현재 존재하거나 미래에 추가될 엘리먼트에서 지정한 이벤트가 발생할 때마다 콜백함수가 실행된다.
container : 이벤트 처리 대상이 되는 엘리먼트를 후손으로 가지는 엘리먼트
selector : 이벤트 처리 대상이 되는 엘리먼트
id가 btn-add-field 엘리먼트를 클릭했을 때 실행되는 이벤트 핸들러 함수를 정의하기
id를 정의할 때!!! 팁!!!! id가 뭔지 들어내는 id로 정의하는 것이 좋다.
id = element(버튼) - action(추가) -what(필드)
id = btn-add-field = 버튼은 필드를 추가하는구나~
$("btn-add-field").click(function(){ var template = ` <div class=" mb-3 d-flex justify-content-between"> <input type="text" class="form-control w-75"/> <button class="btn btn-outline-danger btn-sm">삭제</button> </div>`;//1옆에 있는 `것, 2줄이상 되는 부분은 ``으로 감싸주고, 클릭되면 복사가 될 부분을 입력해준다.
//class가 card-body인 엘리먼트안에 있는 클래스가 .mb-3인 엘리먼트 중에서 맨 마지막번째 엘리먼트를 선택하기 --->추가를 누르면 추가 될 위치. $(".card-body .mb-3:last").after(template);//뒤에 넣는것 after, 앞에 넣는것 before //클래스가 card-body인 후손 클래스가 mb-3인데 제일 마지막 뒤에 입력한다 변수 template를 })
삭제버튼에 이벤트 추가하기
$(".card-body .btn-outline-danger").click(function(){ //기존에 존재하는 이벤트 alert("삭제"); })
새롭게 추가되는 부분에 이벤트 추가하기 (지금 존재하지 않는 이벤트를 삭제할 이벤트 ! --> 위에서 사용하는 삭제 버튼은 이미 만들어진 삭제버튼밖에 이벤트를 추가하는 것이다. )
card-body안에서 생성될 예정이다. card-body내부에서 만들어 지기 때문에 container이다. container은 꼭 존재해야한다.
$(컨테이너 엘리먼트를 선택하는 선택자).on('이벤트명','이벤트를 발생시키는 엘리먼트를 선택하는 선택자',이벤트핸들러함수)
컨테이너 엘리먼트를 선택하는 선택자
새로엘리먼트가 추가되는 부모엘리먼트를 선택하는 선택자를 정의한다.
'.card-body'는 경력사항입력필드와 삭제버튼이 추가되는 곳이다.
처리대상 이벤트 명
이벤트명을 지정한다.
이벤트를 발생시키는 엘리먼트를 선택하는 선택자
이벤트를 발생시키는 엘리먼트를 선택하는 선택자를 정의한다.
'.btn-outline-danger'버튼을 클릭했을 때 이벤트 핸들러함수가 실행된다.
이벤트 핸들러 함수
'.btn-outline-danger'버튼을 클릭했을 때 실행되는 이벤트 핸들러 함수이다.
$('.card-body').on('click','.btn-outline-danger',function(){ //card-body안에 btn-outline-danger가 새롭게 정의될 텐데, click하면 실행될 이벤트 함수 $(this).closest('.mb-3').remove(); })