처리
(event handle)할 수 있음대표적인 이벤트 핸들러 중 하나
특정 이벤트를 DOM 요소가 수신할 때마다 콜백함수를 호출
EventTarget.addEventListener(type, handler)
요소에 addEventListener를 부착하게 되면 내부의 this값은 대상 요소를 가리키게 됨
부모 요소의 핸들러가 동작
하는 현상최상단의 조상 요소(document)
를 만날 때까지 이 과정이 반복되면서 요소 각각에 할당된 핸들러가 동작이벤트가 정확히 어디서 발생
했는지 접근할 수 있는 방법
'target' 속성
'currentTarget' 속성
핸들러가 부착된
요소현재
요소this
랑 같음 <button id="btn">버튼</button>
<p>클릭횟수 : <span id="counter">0</span></p>
// 1. 초기값 할당
let counterNumber = 0
// 2. 버튼 요소 선택
const btn = document.querySelector('#btn')
// 3. 콜백 함수 (버튼에 클릭 이벤트가 발생할때마다 실행할 코드)
const clickHandler = function () {
// 3.1 초기값 += 1
counterNumber += 1
// 3.2 span 요소를 선택
const spanTag = document.querySelector('#counter')
// 3.3 p 요소의 컨텐츠를 1 증가한 초기값으로 설정
spanTag.textContent = counterNumber
}
// 4. 버튼에 이벤트 핸들러 부착 (클릭 이벤트)
btn.addEventListener('click', clickHandler)
<body>
<input type="text" id="text-input">
<p></p>
<script>
// 1. input 요소 선택
const inputTag = document.querySelector('#text-input')
// 2. p 요소 선택
const pTag = document.querySelector('p')
// 3. 콜백 함수 (input 요소에 input 이벤트가 발생할때마다 실행할 코드)
// 3.1 작성하는 데이터가 어디에 누적되고 있는지 찾기
const inputHandler = function (event) {
// console.log(event)
// console.log(event.currentTarget)
console.log(event.currentTarget.value)
console.log(this.value)
// 3.2 p요소의 컨텐츠에 작성하는 데이터를 추가
pTag.textContent = event.currentTarget.value // 이거를 변수에 담아서 넘겨도 되고, 이렇게 써도 되고
}
// 4. input 요소에 이벤트 핸들러 부착 (input 이벤트)
inputTag.addEventListener('input', inputHandler) // input 이벤트가 발생할 때
</script>
</body>
<body>
<h1></h1>
<button id="btn">클릭</button>
<input type="text" id="text-input">
<script>
// input 구현
const inputTag = document.querySelector('#text-input')
const h1Tag = document.querySelector('h1')
const inputHandler = function (event) {
h1Tag.textContent = event.currentTarget.value
}
inputTag.addEventListener('input', inputHandler)
// click 구현
const btn = document.querySelector('#btn')
const clickHandler = function (event) {
// console.log(event)
// h1Tag.classList.add('blue') // class 추가 (ex.다크모드)
// toggle
h1Tag.classList.toggle('blue') // 토글쓰면 복잡하게 if 안써도돼
}
btn.addEventListener('click', clickHandler)
</script>
</body>
<body>
<input type="text" class="input-text">
<button id="btn">+</button>
<ul></ul>
<script>
// 1. 필요한 요소 선택
const inputTag = document.querySelector('.input-text')
const btn = document.querySelector('#btn')
const ulTag = document.querySelector('ul')
const addTodo = function (event) {
// 2.1 사용자 입력 데이터 저장
const inputData = inputTag.value // event.currentTarget.value라고하면 이 event는 클릭 이벤트 인자라서 안됨
// 3. 사용자 입력 데이터가 빈 데이터인지 확인
if (inputData.trim()) { // 문자열에 공백 제거
// 2.2 데이터를 저장할 li 요소를 생성
const liTag = document.createElement('li')
// console.log(liTag)
// 2.3 li 요소 컨텐츠에 데이터 입력
liTag.textContent = inputData
// console.log(liTag)
// 2.4 li 요소를 부모 ul 요소의 자식 요소로 추가
ulTag.appendChild(liTag)
// 2.5 todo 추가 후 input의 입력 데이터는 초기화
inputTag.value = ''
} else {
alert('투두를 입력하세요')
}
}
// 2. 버튼에 이벤트 핸들러를 부착
btn.addEventListener('click', addTodo)
</script>
</body>
<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>
// 1. 필요한 요소 선택
const btn = document.querySelector('#btn')
const divTag = document.querySelector('div')
// 2. 로또 번호를 생성하는 함수 | 태그를 만들고 출력까지하는 (콜백함수)
const getLottery = function (event) {
// 2.1 1부터 45까지의 값이 필요
const numbers = _.range(1, 46)
// console.log(numbers)
// 2.2 45개의 요소가 있는 배열에서 6개 번호 추출
const sixNumbers = _.sampleSize(numbers, 6)
// console.log(sixNumbers)
// 2.5 6개의 li 요소를 담을 ul 요소 생성
const ulTag = document.createElement('ul')
// 2.3 추출한 번호 배열을 "반복"하면서 li 요소를 생성 (배열반복 -> forEach)
sixNumbers.forEach(function (number) {
// 2.4 번호를 담을 li 요소 생성 후 입력
const liTag = document.createElement('li')
liTag.textContent = number
// console.log(liTag)
// 2.6 만들어진 li를 ul 요소에 추가
ulTag.appendChild(liTag)
console.log(ulTag)
})
// 2.7 완성한 ul 요소를 div 요소에 추가
// 반복이 끝난 이후에!
divTag.appendChild(ulTag)
}
// 3. 버튼 요소에 이벤트 핸들러를 부착
btn.addEventListener('click', getLottery)
</script>
</body>
<body>
<h1>중요한 내용</h1>
<form id="my-form">
<input type="text" name="username">
<button type="submit">Submit</button>
</form>
<script>
// 1
const h1Tag = document.querySelector('h1')
h1Tag.addEventListener('copy', function (event) {
console.log(event)
event.preventDefault()
alert('복사 할 수 없습니다.')
})
// 2
const formTag = document.querySelector('#my-form')
const handleSubmit = function (event) {
event.preventDefault()
}
formTag.addEventListener('submit', handleSubmit)
</script>
</body>