한 걸음씩
[JS][multicampus] Controlling event 본문
1. event
► event
- 무언가 일어났다는 신호, 사건 (모든 DOM 요소는 이러한 신호를 만들어 냄)
- 종류 : 마우스, 인풋, 키보드, 터치 등
- DOM 요소는 event를 받고, 받은 event를 '처리'(이벤트 핸들러/처리기)할 수 있음
► event handler
- 이벤트가 발생했을 때 실행되는 함수 (사용자의 행동에 어떻게 반응할지를 JS코드로 표현한 것)
EventTarget.addEventListener(type, handler)
- EventTarget : DOM 요소
- type : 특정 이벤트, 이벤트 이름 ('click')
- handler : 발생한 이벤트 객체를 수신하는 콜백 함수, 콜백 함수는 발생한 Event Object를 유일한 매개변수로 받음
- .addEventListener(): 대표적인 이벤트 핸들러 중 하나(특정 이벤트를 DOM요소가 수신할 때마다 콜백 함수를 호출)
- "대상에 특정 Event가 발생하면, 할 일을 등록한다."
<body>
<button id="btn">버튼</button>
<script>
// id가 btn인 요소 선택
const btn = document.querySelector('#btn')
console.log(btn)
// 선택한 버튼에 이벤트 핸들러 부착
// 버튼에서 click 이벤트가 발생될때마다 함수가 실행됨
btn.addEventListener('click', function (event) {
// 이벤트 객체
console.log(event) // this보다는 event.target이 객체를 볼 수 있기 때문에 유용
// 이벤트가 발생한 대상
console.log(event.target)
console.log(this)
})
</script>
</body>
btn.addEventListener('click', (event) => {
// 이벤트 객체
console.log(event)
// 이벤트가 발생한 대상
console.log(event.target)
console.log(this) // 화살표 함수에서 this는 외부에서 가져오는데
// 현재 외부에는 아무것도 없기 때문에 window객체(전역변수)를 가져온다는 것 주의하기
})
https://developer.mozilla.org/en-US/docs/Web/Events
Event reference | MDN
Events are fired to notify code of "interesting changes" that may affect code execution. These can arise from user interactions such as using a mouse or resizing a window, changes in the state of the underlying environment (e.g. low battery or media events
developer.mozilla.org
2. Event handler 활용
► click
- 버튼을 클릭하면 숫자를 1씩 증가
<body>
<button id="btn">버튼</button>
<p id="counter">0</p>
<script>
// 초기값
let countNumber = 0
// id가 btn인 요소 선택
const btn = document.querySelector('#btn')
console.log(btn)
// 선택한 버튼에 이벤트 핸들러 부착
// 버튼에서 click 이벤트가 발생될때마다 함수가 실행됨
btn.addEventListener('click', function () {
console.log('버튼 클릭!')
// countNumber를 증가시키고
countNumber += 1
// id가 counter인의 요소의 컨텐츠를 변경
const counter = document.querySelector('#counter')
counter.textContent = countNumber
})
</script>
</body>
► input
- 사용자의 입력 값을 실시간으로 출력하기
<body>
<input type="text" id="text-input">
<p></p>
<script>
// input 요소 선택
const textInput = document.querySelector('#text-input')
// 이벤트 핸들러 부착
textInput.addEventListener('input', function (event) {
// console.log(event)
// console.log(event.target)
console.log(event.target.value)
// input에 작성한 value를 p 태그의 컨텐츠로 출력하기
const pTag = document.querySelector('p')
pTag.textContent = event.target.value
})
</script>
</body>
► click & input
- 사용자의 입력 값을 실시간으로 출력하기
- 버튼을 클릭하면 출력한 값의 스타일을 변경하기
<body>
<h1 class="blue"></h1>
<button id="btn">클릭</button>
<input type="text" id="text-input">
<script>
// 인풋
const input = document.querySelector('#text-input')
input.addEventListener('input', function (event) {
const h1Tag = document.querySelector('h1')
h1Tag.textContent = event.target.value
})
// 버튼
const btn = document.querySelector('#btn')
btn.addEventListener('click', function () {
const h1 = document.querySelector('h1')
// 클래스 blue를 토글하기
h1.classList.toggle('blue')
})
</script>
</body>
► 이벤트 취소하기
- 텍스트를 복사하려고 하면 알림 창을 띄우면서 복사를 중단하기
- .preventDefault() : 현재 Event의 기본 동작을 중단
<body>
<h1>정말 중요한 내용</h1>
<script>
const h1 = document.querySelector('h1')
h1.addEventListener('copy', function (event) {
// copy event를 취소
event.preventDefault()
alert('삐빅 복사 할 수 없습니다.')
})
</script>
</body>
3. 활용
► todolist
- 할 일을 입력하고 버튼을 클릭하면 할 일 요소를 생성
- input 컨텐츠를 작성하지 않는다면 경고 알림 출력
<body>
<input type="text" class="input-text">
<button id="btn">+</button>
<ul></ul>
<script>
const addTodo = function (event) {
event.preventDefault()
const inputTag = document.querySelector('.input-text')
const data = inputTag.value
if (data.trim()) {
const liTag = document.createElement('li')
liTag.textContent = data
const ulTag = document.querySelector('ul')
ulTag.appendChild(liTag)
inputTag.value = ''
} else {
alert('할 일을 입력하세요')
}
}
const btn = document.querySelector('#btn')
btn.addEventListener('click', addTodo)
</script>
► lotto 번호 생성기
- '행운 번호 받기' 버튼 누를때 마다 6개의 번호 생성
<body>
<h1>로또 추천 번호</h1>
<button id="btn">행운 번호 받기</button>
<div></div>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
<script>
const button = document.querySelector('#btn')
button.addEventListener('click', function () {
//랜덤 숫자 6개 만들기
const numbers = _.sampleSize(_.range(1, 46), 6)
const divTag = document.querySelector('div')
const ulTag = document.createElement('ul')
//공 만들기
numbers.forEach((number) => {
const ball = document.createElement('li')
ball.textContent = number
//ball을 ul 요소의 자식으로 추가
const result = document.querySelector('#result')
ulTag.appendChild(ball)
})
//완성된 ul요소를 div 요소의 자식으로 추가
divTag.appendChild(ulTag)
})
</script>
</body>
▷ lodash
- 모듈성, 성능 및 추가 기능을 제공하는 JS 유틸리티 라이브러리
- array, object 등 자료구조를 다룰 때 사용하는 유용하고 간편한 함수들을 제공
- https://lodash.com
4. 참고
'JS' 카테고리의 다른 글
[JS][Udemy] JavaScript Functions 1 (0) | 2023.03.20 |
---|---|
[JS][Udemy] todolist project (0) | 2023.03.20 |
[JS][multicampus] Functions (0) | 2023.03.15 |
[JS][udemy] Loops (0) | 2023.03.15 |
[JS][udemy][multicampus] JS Object Literals (0) | 2023.03.14 |