Event object
네트워크 활동이나 사용자와의 상호작용 같은 사건의 발생을 알리기 위한 객체
이벤트가 발생했을 때 생성되는 객체
Event 발생
DOM 요소는 Event를 받고
받은 Event를 처리할 수 있음
addEventListener()
메서드를 통해Event handler
Event handler - addEventListner()
EventTarget.addEventListner(type, handler function)
type
handler function
버튼을 클릭하면 특정 변수 값 변경하기
<body> <button id="btn">버튼</button> <p id="counter">0</p> <script> // 초기값 let counterNumber = 0 // ID가 btn인 요소를 선택 const btn = document.querySelector('#btn') // btn이 클릭 되었을 때마다 함수가 실행됨 btn.addEventListener('click', function(event) { console.log('버튼 클릭했음') counterNumber += 1 const counter = document.querySelector('#counter') counter.innerText = counterNumber }) </script> </body>
input에 입력하면 입력 값을 실시간으로 출력하기
<body> <input type="text" id="text-input"> <p></p> <script> // 1. input 선택 const textInput = document.querySelector('input') // 2. input 이벤트 등록 // input은 이벤트의 대상 textInput.addEventListener('input', function(event) { console.log(event) console.log(event.target) console.log(event.target.value) // 3. input에 작성한 값을 p 태그에 출력하기 const pTag = document.querySelector('p') // input의 value를 받아오기 pTag.innerText = event.target.value }) </script> </body>
Event 전파란?
event.preventDefault()
웹 페이지 내용을 복사하지 못하도록 하기
<body> <div> <h1>정말 중요한 내용</h1> </div> <script> const h1 = document.querySelector('h1') h1.addEventListener('copy', function (event) { // copy event의 기본 동작을 막기 event.preventDefault() alert('Cant copy') }) </script </body>
버튼을 클릭하면 랜덤 로또 번호 6개를 출력하기
<style>
/* 스타일은 수정하지 않습니다. */
.ball {
width: 10rem;
height: 10rem;
margin: .5rem;
border-radius: 50%;
text-align: center;
line-height: 10rem;
font-size: xx-large;
font-weight: bold;
color: white;
}
.ball-container {
display: flex;
}
</style>
</head>
<body>
<h1>로또 추천 번호</h1>
<button id="lotto-btn">행운 번호 받기</button>
<div id="result"></div>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
<script>
// 버튼 클릭하면 로또 번호 뽑아주기
const button = document.querySelector('#lotto-btn')
button.addEventListener('click', function() {
const ballContainer = document.createElement('div')
ballContainer.classList.add('ball-container')
//로또 숫자 6개 뽑기
const numbers = _.sampleSize(_.range(1,46), 6)
console.log(numbers)
numbers.forEach(number => {
const ball = document.createElement('div')
ball.classList.add('ball')
ball.innerText = number
ball.style.backgroundColor = 'crimson'
// ball을 ballContainer에 넣어주기
ballContainer.appendChild(ball)
})
// ball 6개가 ballContainer에 들어가있음
const result = document.querySelector('#result')
result.appendChild(ballContainer)
});
</script>
</body>
[참고] lodash
- 모듈성, 성능 및 추가 기능을 제공하는 JavaScript 유틸리티 라이브러리
- array, object 등 자료구조를 다룰 때 사용하는 유용하고 간편한 유틸리티 함수들을 제공
- 함수 예시
- reverse, sortBy, range, random ...
- https://lodash.com/
CREATE, READ 기능을 충족하느 todo app 만들기
<body>
<form action="#">
<input type="text" class="inputData">
<input type="submit" value="Add">
</form>
<ul></ul>
<script>
const formTag = document.querySelector('form')
const addTodo = function (event) {
event.preventDefault() // form 제출 기능 막기
const inputTag = document.querySelector('.inputData')
const data = inputTag.value
if (data.trim()) {
const liTag = document.createElement('li')
liTag.innerText = data
const ulTag = document.querySelector('ul')
ulTag.appendChild(liTag)
event.target.reset()
} else {
alert('할일을 입력하세요')
}
}
formTag.addEventListener('submit', addTodo)
</script>
</body>
[참고] this와 addEventListner
- addEventListner에서의 콜백 함수는 특별하게 function 키워드의 경우
addEventListner를 호출한 대상을 (event.target) 뜻함- 반면 화살표 함수의 경우 상위 스코프를 지칭하기 때문에 window 객체가 바인딩 됨
- 결론
- addEventListner의 콜백 함수는 function 키워드를 사용하기