- 이벤트(Event) : 동작, 행위
- 브라우저에서의 동작, 행위 : click, keydown, keyup, change, submit, ... - 이벤트 리스너(Event Listener)
- 이벤트가 발생하는 것을 대기하고 있다가 이벤트가 발생하는 것이 감지되면 연결된 기능(함수)를 수행하는 것 - 이벤트 핸들러(Event Handler)
- 이벤트 리스너에 연결된 기능으로 이벤트 발생 시 수행하고자 하는 내용을 작성해둔 함수(function)
- 1) 인라인 이벤트 모델
- 요소 내부에 이벤트를 작성하는 방법으로,
on이벤트명 = 함수명() 형태로 작성
<button onclick="test1(this)">인라인 이벤트 모델 확인</button>
// 인라인 이벤트 모델
// ex) 버튼의 배경색, 글자색 변경
function test1(button){ // 변수 button에는 이벤트가 발생한 요소(== button)가 담겨 있음
button.style.backgroundColor = "purple";
button.style.color = "yellow";
}
See the Pen Untitled by Namu (@Namu-the-sans) on CodePen.
- 2) 고전 이벤트 모델
- 요소가 가지고 있는 이벤트 속성(이벤트 리스너)에 이벤트 핸들러를 연결하는 방법으로,
인라인 모델처럼 HTML 요소에 JS 코드가 포함되는 것이 아닌 script에만 이벤트 관련 코드를 작성할 수 있음
<button id="test2-1">고전 이벤트 모델 확인</button>
<button id="test2-2">#test2-1 이벤트 제거</button>
<button id="test2-3">고전 이벤트 모델 단점</button>
// 고전 이벤트 모델
// 고전 표준 이벤트 모델은 랜더링(화면해석)된 HTML 요소에 이벤트 관련 동작을 부여하는 코드
// ★★ 랜더링 되지 않은 요소에는 이벤트 관련 동작을 추가할 수 없음 ★★
// [문제 원인 : HTML 코드 해석 순서 (위 -> 아래)]
// -> 해결 방법 : HTML 요소가 먼저 랜더링된 후 JS 코드 수행
document.getElemetnByID('test2-1').onclick=function(){
// 익명 함수(이벤트 핸들러에 많이 사용)
alert('고전 이벤트 모델 알림창');
}
// 이벤트 제거
document.getElementById('test2-2').onclick=function(){
// #test2-1의 이벤트를 제거
document.getElementById('test2-1').onclick=null;
alert('#test2-1의 이벤트를 제거함');
}
// 고전 이벤트 모델 단점
// -> 한 요소에 동일한 이벤트 리스너(onclick)에 대한
// 다수의 이벤트 핸들러(배경색 변경, 폰트 변경)를 작성할 수 없음
// (작성 시 마지막으로 해석된 이벤트 핸들러만 적용됨)
document.getElementById('test2-3').onclick=function(event){
// 버튼 색 바꾸기
// 방법 1) 요소를 문서에서 찾아서 선택
// document.getElementById('test2-3').style.backgroundColor='red';
// 방법 2) 매개변수 e 또는 event 활용
// -> 이벤트 핸들러에 e 또는 event를 작성하는 경우
// 해당 이벤트와 관련된 모든 정보가 담긴 이벤트 객체가 반환됨
// event.target : 이벤트가 발생한 요소
// event.target.style.backgroundColor='skyBlue';
// 방법 3) this 활용 -> 이벤트가 발생한 요소(== event.target)
this.style.backgroundColor='green';
}
/* document.getElementById('test2-3').onclick=function(){
document.getElementById('test2-3').style.fontSize='30px';
*/
See the Pen Event-2 by Namu (@Namu-the-sans) on CodePen.
See the Pen event-3 by Namu (@Namu-the-sans) on CodePen.
See the Pen event-4 by Namu (@Namu-the-sans) on CodePen.
See the Pen event-5 by Namu (@Namu-the-sans) on CodePen.
See the Pen event-6 by Namu (@Namu-the-sans) on CodePen.
See the Pen event-7 by Namu (@Namu-the-sans) on CodePen.
※ 고전 이벤트 모델 단점 : 한 요소에 동일한 이벤트 리스너(onclicl)에 대한 다수의 이벤트 핸들러(배경색 변경, 폰트 변경)를 작성할 수 없음 (작성 시 마지막으로 해석된 이벤트 핸들러만 적용됨) : 두 번째 이벤트 ('30px' 적용 X)
- 3) 표준 이벤트 모델
- W3C(HTML, CSS, JS 웹표준 지정 단체)에서 공식적으로 지정한 이벤트 모델(이벤트 동작 지정 방법)
- 한 요소에 여러 이벤트 핸들러를 설정할 수 있음 → 고전 이벤트 모델의 단점 보완
<div id="test3">네모네모</div>
#test3{
width: 200px;
height: 200px;
border: 1px solid black;
cursor: pointer;
background-color: darkcyan;
}
// 표준 이벤트 모델 확인하기
document.getElementById('test3').addEventListener("click", function(){
// this : 이벤트가 발생한 요소
// console.log(this.clientWidth); // 현재 요소의 너비(테두리 제외)
// 현재 요소의 너비를 300px로 변경
// this.style.width = '300px';
this.style.width = this.clientWidth + 20 + 'px';
})
// test3에 이미 click 이벤트에 대한 동작이 존재하는데 중복해서 적용 가능
document.getElementById('test3').addEventListener('click',function(){
this.style.height = this.clientHeight + 20 + 'px';
})
See the Pen 24-12-25 js review21 by Namu (@Namu-the-sans) on CodePen.
- 이벤트 복습 문제
- 색상을 영어로 입력한 후, 변경 버튼을 클릭하면
아이디가 div1인 요소의 배경색이 변경되도록 하시오.
<div id="div1"></div>
<input type="text" id="input1">
<button id="changeBtn1">변경</button>
#div1{
width: 100px;
height: 100px;
border: 1px solid black;
}
/* 복습 문제 */
document.getElementById('changeBtn1').addEventListener('click',function(){
const div1 = document.getElementById('div1');
const input1 = document.getElementById('input1');
// input1에 작성된 값 얻어오기
const bgColor = input1.value;
// div1의 배경색 변경
div1.style.backgroundColor = bgColor;
})
/* 복습 문제 */
document.getElementById('changeBtn1').addEventListener('click',function(){
document.getElementById('div1').style.backgroundColor = document.getElementById('input1').value;
})
See the Pen 24-12-25 js review22 by Namu (@Namu-the-sans) on CodePen.
/* 복습 문제 응용 */
// 아이디가 input1인 요소에 입력된 값이 변경되었을 때
// 해당 값으로 배경색 변경 후 값 초기화
document.getElementById('input1').addEventListener('change', function(){
/* change 이벤트
text 관련 input 태그는
입력된 값이 변할 때 change라고 하지 않고!
입력이 완료된 후 포커스를 잃거나 엔터를 눌렀을 때,
입력된 값이 이전과 다를 경우 change 이벤트가 발생한 걸로 인식함
*/
document.getElementById('div1').style.backgroundColor = this.value;
// this : 이벤트가 발생한 요소(#input1)
this.value = ''; // input1에 작성된 값 초기화
})
See the Pen 24-12-25 js review23 by Namu (@Namu-the-sans) on CodePen.
▶ HTML 요소 기본 이벤트 제거
- a 태그 기본 이벤트 제거
<a href="https://www.naver.com" id="moveNaver">네이버로 이동</a>
// a태그 기본 이벤트 제거
document.getElementById('moveNaver').addEventListener('click',function(e){
// 매개변수 e 또는 event = 이벤트 발생 객체
// (이벤트와 관련된 정보가 담겨 있는 객체)
e.preventDefault(); // HTML 요소가 가지고 있는 기본 이벤트를 막음(제거)
// prevent : 막다, 방지하다, 예방하다
// Default : 기본 / 기본값
})
See the Pen 24-12-25 js review24 by Namu (@Namu-the-sans) on CodePen.
- form 태그 기본 이벤트 제거
- 내부에서 submit 버튼이 클릭되면 action 경로로 제출
- 방법 1. submit 버튼을 사용 안 하는 방법
<form action="https://www.naver.com" name="testForm1">
"제출" 이라고 입력되었을 때만 버튼이 submit으로 동작
입력 : <input type="text" name="in1" id="in1">
<button type="button" id="testBtn1">제출하기</button>
</form>
// 방법 1. submit 버튼 사용 안 하는 방법
document.getElementById('testBtn1').addEventListener('click',function(){
// 아이디가 in1인 요소에 입력된 값 얻어오기
const in1 = document.getElementById('in1').value;
// 아이디가 in1인 요소에 작성된 값이 "제출"일 경우 이름이 testForm1인 form 태그를 submit
if(in1 == "제출"){
// ★★ form태그의 name 속성이 있을 경우 직접 선택 가능
// document.form태그의 name 속성 값
document.testForm1.submit();
// ★★ form요소.submit() : form 요소 제출 함수
}
})
See the Pen 24-12-25 js review25 by Namu (@Namu-the-sans) on CodePen.
- 방법 2. onsubmit을 이용해서 form 태그가 제출되는 것을 막는 방법
※ onsubmit : form 태그가 제출되었을 때 → 제출하기 버튼이 클릭되었을 때를 의미
onsubmit = "return false" → submit을 막는 방법
<form action="01_JS 개요.html" onsubmit="return checkIn2()">
"제출" 이라고 입력되었을 때만 버튼이 submit으로 동작
입력 : <input type="text" name="in2" id="in2">
<button type="submit" id="testBtn2">제출하기</button>
</form>
// 방법 2. onsubmit을 이용해서 form 태그 제출 막기
function checkIn2(){
// 아이디가 in2인 요소에 "제출"이 입력된 경우에만 submit(return true) 수행
const in2 = document.getElementById('in2').value;
if(in2 == "제출"){
return true;
} else{
return false;
}
}
See the Pen 24-12-25 js review26 by Namu (@Namu-the-sans) on CodePen.
- ★★JavaScript 코드를 body 태그의 마지막에 작성하는 이유 ★★
1. 고전 / 표준 이벤트 모델 방식의 코드 수행을 위해서.
(HTML 요소를 먼저 랜더링 → JS 코드 해석)
2. head 태그에 용량이 큰 JS 코드를 추가하면 페이지 로딩 시간이 길어지게 됨.
→ body 태그의 마지막으로 옮기면 화면 랜더링 후 JS 코드가 나중에 해석됨
'HTML, CSS, JavaScript > JavaScript' 카테고리의 다른 글
배열(Array) (0) | 2024.12.25 |
---|---|
문자열, 숫자, 형변환, 연산자 (0) | 2024.12.25 |
변수와 자료형 ( 변수 선언 방식, 자료형 ) (0) | 2024.12.17 |
요소 접근 방법 ( DOM, document.get~. document.querySelector~ ) (2) | 2024.12.16 |
데이터 입출력 ( innerHTML, innerText, value ) (0) | 2024.12.16 |