dict와 유사key, value로 구성key는 문자형만 가능in 연산자 대신 hasOwnProperty()를 사용할 것self)arr.forEach(function (item, index, array) {
// item: 현재 접근하고 있는 인자
// index: 현재 접근하고 있는 인자의 인덱스
// array: 접근하고 있는 배열 전체
})
arr.map(function (item, index, array) {
return 데이터
})
arr.filter(function (item, index, array) {
return true or false
})
return 값이 true인 애들만 모아 새로운 배열을 생성arr.reduce(function (acc, cur, index, array) {
// acc: 이전까지 누적된 값
// cur: 현재 쳐다보고 있는 값
}, 초기값)
Event : 웹 페이지 상에서 무언가 일어났다는 신호 또는 사건
click 이벤트input 이벤트 등event object를 자동으로 생성Event Handler : 특정 이벤트가 발생했을 때 실행되는 콜백 함수
특정 DOM 요소에, 지정한 이벤트가 발생했을 때 실행할 이벤트 핸들러를 등록하는 메서드
EventTarget.addEventListener(type, handler)
// EventTarget: DOM 요소
// type: 수신할 이벤트
// handler: 핸들러
요소 가져오기 → 콜백 함수 생성 → 리스너 등록
const button = document.querySelector('button')
// 이벤트 핸들러
const handleClick = function () {
window.alert('버튼이 클릭 되었습니다!')
}
// addEventListener 메서드를 이용해 버튼에 이벤트 핸들러를 등록
button.addEventListener('click', handleClick)
<button id="btn">버튼</button>
// 1. 버튼 요소 선택
const btn = document.querySelector('#btn')
// 2. 이벤트 핸들러
const detectClick = function (event) {
console.log(event) // PointerEvent
console.log(event.type) // click
}
// 3. 버튼에 이벤트 핸들러를 등록
btn.addEventListener('click', detectClick)
this는 이벤트 리스너가 연결된 요소를 가리킴event.currentTarget 속성 값과 동일const btn = document.querySelector('#btn')
const detectClick = function (event) {
console.log(event.currentTarget) // <button id="btn">버튼</button>
console.log(this) // <button id="btn">버튼</button>
}
btn.addEventListener('click', detectClick)
form > div > p 형태의 중첩된 구조에 각각 이벤트 핸들러가 연결되어 있을 때, <p> 요소를 클릭해도 모든 부모 요소의 핸들러가 실행됨.
const formElement = document.querySelector('#form')
const divElement = document.querySelector('#div')
const pElement = document.querySelector('#p')
const clickHandler1 = function (event) {
console.log('form이 클릭되었습니다.')
}
const clickHandler2 = function (event) {
console.log('div가 클릭되었습니다.')
}
const clickHandler3 = function (event) {
console.log('p가 클릭되었습니다.')
}
formElement.addEventListener('click', clickHandler1)
divElement.addEventListener('click', clickHandler2)
pElement.addEventListener('click', clickHandler3)
<p> 클릭 시 출력 결과:
p가 클릭되었습니다.
div가 클릭되었습니다.
form이 클릭되었습니다.
→ 사실 addEventListener를 3개 쓸 필요 없다. 어차피 버블링으로 최상단 조상(form)까지 가니까.
그럼 각각을 구분할 수 있는 방법은? → 이벤트가 정확히 어디서 발생했는지 접근하는 두 가지 속성을 사용한다.
this와 동일<div id="outerouter">
outerouter
<div id="outer">
outer
<div id="inner">inner</div>
</div>
</div>
<script>
const outerOuterElement = document.querySelector('#outerouter')
const clickHandler = function (event) {
console.log('currentTarget:', event.currentTarget.id)
console.log('target:', event.target.id)
}
outerOuterElement.addEventListener('click', clickHandler)
</script>
inner 클릭 시 결과:
currentTarget: outerouter
target: inner
inner를 클릭했을 때 등록된 event handler가 없으니까 아무 일도 안 일어나는 게 아니라,
버블링에 의해 계속 부모 요소로 이동하다가 outerouter를 만나서 등록된 event handler가 실행되는 것!
event.target을 이용하면 실제 어떤 자식 요소에서 이벤트가 발생했는지 알 수 있기 때문HTML의 각 요소가 기본적으로 가지고 있는 이벤트가 때로는 방해되는 경우가 있어 취소할 필요가 있다.
// 복사 이벤트 금지
const h1Tag = document.querySelector('h1')
h1Tag.addEventListener('copy', function (event) {
console.log(event)
event.preventDefault()
alert('복사 할 수 없습니다.')
})
submit 동작 취소를 통해 새로고침 방지// 폼 제출 시 페이지 새로고침 동작 취소
const formTag = document.querySelector('#my-form')
const handleSubmit = function (event) {
event.preventDefault()
}
formTag.addEventListener('submit', handleSubmit)
| 개념 | 핵심 |
|---|---|
event | 웹 페이지에서 발생한 사건 |
addEventListener | DOM 요소에 이벤트 핸들러 등록 |
| 버블링 | 자식 → 부모로 이벤트 전파 |
| 캡처링 | 부모 → 자식으로 이벤트 전파 |
event.target | 실제 이벤트가 발생한 요소 |
event.currentTarget | 핸들러가 연결된 요소 (= this) |
preventDefault() | 기본 동작 취소 |