input에 텍스트를 입력하고 엔터키를 입력했을때 todoList에 todo가 추가되는 기능을 구현하기 위해 event 객체의 key 속성을 사용하여 Enter 키가 입력되었을때 addTodo 함수를 호출해주려 아래와 같은 코드를 작성해 보았습니다
input.addEventListener('keydown', ({ key }) => {
if (key !== 'Enter') {
return
}
addTodo()
})
영어를 입력하고 엔터키를 눌렀을때는 아무런 문제가 없는데 한국어를 입력하고 엔터를 입력했을때는 이벤트가 두번 발생하는 문제가 생겼습니다
이벤트가 한번 발생합니다
isComposing
속성은 true
입니다
input.addEventListener('keydown', ({ key, isComposing }) => {
if (key !== 'Enter') {
return
}
console.log('===========')
console.log({ inputValue: input.value, key, isComposing })
addTodo()
})
이벤트가 두번 발생합니다
isComposing
속성은 true
입니다isComposing
속성은 false
입니다isComposing
이 true
일때 return
처리를 해주면 이벤트가 두번 발생하는 문제가 해결됩니다
input.addEventListener('keydown', ({ key, isComposing }) => {
if (isComposing) {
return
}
if (key !== "Enter") {
return
}
addTodo()
})
input.addEventListener('keydown', ({ key, isComposing }) => {
if (isComposing) {
return
}
if (key !== 'Enter') {
return
}
console.log({ key, isComposing })
addTodo()
})
input.addEventListener('keydown', ({ key, isComposing }) => {
if (isComposing) {
// return
}
if (key !== 'Enter') {
return
}
console.log({ key, isComposing })
addTodo()
})
keypress와 keyCode는 더이상 지원되지 않으므로 프로덕션 코드에서 사용하면 안된다고 합니다