<button id ='btn'>버튼</button>
// 1. 버튼 선택
const btn = document.querySelector('#btn')
// 2. 콜백 함수
const detectClick = function (event){
console.log(event) // PointerEvent
console.log(event.currentTarget) // <button id = "btn">버튼</button>
console.log(this) // <button id ="btn">버튼</button>
}
// 3.버튼에 이벤트 핸들러를 부착
btn.addEventListener('click', detectClick)
const btn = document.querySelector('#btn')
const detectClick = function(event){
console.log(event)
console.log(event.currentTarget)
console.log(this)
}
btn.addEventListener('click', detectClick)
form > div > p 형태의 중첩된 구조에 각각 이벤트 핸들러가 있을 때 만약
요소를 클릭하면 어떻게 될까?
<form id = "form">
form
<div id = "div">
div
<p id = "p">p</p>
</div>
</form>
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를 클릭했는데 div와 form에 할당된 핸들러까지 동작할까?
<p> 요소를 클릭하면 p -> div -> form 순서로 3개의 이벤트 핸들러가 모두 동작했던 것세 요소 중 가장 최상위 요소인 outerouter 요소에만 핸들러가 부착
각 요소를 클릭 했을 때 event의 target과 currentTarget의 차이 비교
'currentTarget'
'target'
핸들러는 outerouter에만 할당되어 있지만 하위 요소 outer와 inner를 클릭해도 해당 핸들러가 동작함
클릭 이벤트가 어디서 발생했든 상관없이 outerouter까지 이벤트가 버블링 되어 핸들러를 실행시키기 때문
<style>
#outerouter {
width: 300px;
height: 300px;
background-color: yellowgreen;
}
#outer {
width: 200px;
height: 200px;
background-color: crimson;
}
#inner {
width: 100px;
height: 100px;
background-color: skyblue;
}
</style>
<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>
<div>
<button></button>
<button></button>
<button></button>
...
<button></button>
<button></button>
</div>
const divTag = document.querySelector('div')
divTag.addEventListener('click', function (event) {
console.log(event.target)
})
<button id="btn">버튼</button>
<p>클릭횟수 : <span id="counter">0</span></p>
<script>
// 1. 초기 값 할당
let counterNumber = 0
// 2. 버튼 요소 선택
const btn = document.querySelector('#btn')
// 3. 콜백 함수 (버튼에 클릭 이벤트가 발생할 때마다 실행할 코드)
const clickHandler = function(){
// 3.1 초기값 += 1
counterNumber += 1
// 3.2 p 요소를 선택
const spanTag = document.querySelector('#counter')
// 3.3 p 요소의 컨텐츠를 1 증가한 초기 값으로 설정
spanTag.textContent = counterNumber
}
// 4. 버튼에 이벤트 핸들러 부착 (클릭 이벤트)
btn.addEventListener('click', clickHandler)
</script>
<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 이벤트가 발생할 때마다 실행할 코드)
const inputHandler = function(event){
// 3.1 작성하는 데이터가 어디에 누적되고 있는지 찾기
// console.log(event.currentTarget)
console.log(event.currentTarget.value)
// 3.2 p 요소의 컨텐츠에 작성하는 데이터를 추가
pTag.textContent = event.currentTarget.value
}
// 4. input 요소에 이벤트 핸들러 부착 (input 이벤트)
inputTag.addEventListener('input', inputHandler)
</script>
<style>
.blue {
color: blue;
}
</style>
</head>
<body>
<h1></h1>
<button id="btn">클릭</button>
<input type="text" id="text-input">
<script>
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 (){
// 1. add 방법
h1Tag.classList.add('blue')
// 2. toggle 방법
h1Tag.classList.toggle('blue')
// 3. if 방법
if (h1Tag.classList.value){
h1Tag.classList.remove('blue')
} else{
h1Tag.classList.add('blue')
}
}
btn.addEventListener('click', clickHandler)
</script>
<input type="text" class="input-text">
<button id="btn">+</button>
<ul></ul>
<script>
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
// 2.2 데이터를 저장할 li 요소를 생성
const liTag = document.createElement('li')
// 2.3 li 요소 컨텐츠에 데이터 입력
liTag.textContent = inputData
// 2.4 li 요소를 부모 ul 요소의 자식 요소로 추가
ulTag.appendChild(liTag)
// todo 추가 후 input의 입력 데이터는 초기화
inputTag.value = ""
}
</script>
const addTodo = function (event) {
// 2.1 사용자 입력 데이터 저장
const inputData = inputTag.value
if (inputData.trim()){
// 2.2 데이터를 저장할 li 요소를 생성
const liTag = document.createElement('li')
// 2.3 li 요소 컨텐츠에 데이터 입력
liTag.textContent = inputData
// 2.4 li 요소를 부모 ul 요소의 자식 요소로 추가
ulTag.appendChild(liTag)
// todo 추가 후 input의 입력 데이터는 초기화
inputTag.value = ""
}}
else{
alert('할 일을 입력하세요')
}
</script>
<h1>중요한 내용 </h1>
<script>
const h1Tag = document.querySelector('h1')
h1Tag.addEventListener('copy', function (event) {
console.log(event)
event.preventDefault()
alert('복사 할 수 없습니다.')
})
</script>
<form id="my-form">
<input type="text" name="username">
<button type="submit">Submit</button>
</form>
<script>
const formTag = document.querySelector('#my-form')
const handleSubmit = function (event){
event.preventDefault()
}
formTag.addEventListener('submit', handleSubmit)
</script>