간단하게 정리
src/js/keyboard.js
export class Keyboard {
#swichEl;
#fontSelectEl;
#containerEl;
constructor() {
this.#assignElement();
this.#addEvent();
}
#assignElement() {
this.#containerEl = document.getElementById("container"); // 컨테이너를 먼저 찾고
this.#swichEl = this.#containerEl.querySelector("#switch"); // 토글
this.#fontSelectEl = this.#containerEl.querySelector("#font"); // 폰트
}
#addEvent() {
this.#swichEl.addEventListener("change", this.#onChangeTheme); // 테마변경
this.#fontSelectEl.addEventListener("change", this.#onChangeFont); // 폰트변경
}
#onChangeTheme(event) {
document.documentElement.setAttribute(
"theme",
event.target.checked ? "dark-mode" : ""
);
}
#onChangeFont(event) {
document.body.style.fontFamily = event.target.value;
}
}
src/js/keyboard.js
#addEvent() {
...
document.addEventListner("keydown", (event)=>{
console.log("keydown");
console.log(event.code);
})
document.addEventListner("keyup", (event)=>{
console.log("keyup");
})
}
<div class="keyboard id="keyboard">
<div class="row">
<div class="key" data-code="KeyQ" data-val="q">Q</div>
<div class="key" data-code="KeyW" data-val="w">W</div>
.
.
.
</div>
</div>
src/js/keyboard.js
export class Keyboard {
#keyboardEl;
constructor() {
this.#assignElement();
this.#addEvent();
}
#assignElement() {
this.#keyboardEl = this.#containerEl.querySelector("#keyboard");
}
#addEvent() {
document.addEventListener("keydown", (event) => {
// console.log("keydown");
// console.log(event.code);
// 조건 key code 찾으면 (치환)
if (this.#keyboardEl.querySelector(`[data-code=${event.code}]`)) {
this.#keyboardEl
.querySelector(`[data-code=${event.code}]`)
.classList.add("active"); // active 클래스 추가
}
});
document.addEventListener("keyup", (event) => {
// console.log("keyup");
// keyup도 똑같이
if (this.#keyboardEl.querySelector(`[data-code=${event.code}]`)) {
this.#keyboardEl
.querySelector(`[data-code=${event.code}]`)
.classList.remove("active");
}
});
}
}
document.addEventListener("keydown", (event) => {
this.#keyboardEl
.querySelector(`[data-code=${event.code}]`)
?.classList.add("active"); // optional chaining
});
document.addEventListener("keyup", (event) => {
this.#keyboardEl
.querySelector(`[data-code=${event.code}]`)
?.classList.remove("active"); // optional chaining
});
. 대신 ?. 사용하여 obj.first.secondp에 접근하기 전 obj.first가 null 또는 undefined가 아니라는 것을 암묵적으로 확인 (null이나 undefined면 자동으로 undefined 뱉음)
let nestedProp = obj.first?.second;
정규표현식을 사용하여 영문 키가 아닌 한글 입력 시 한글 입력 불가 error alert message 보여주기
#addEvent() {
document.addEventListener("keydown", (event) => {
// console.log("keydown");
// console.log(event.code);
// console.log(event.key, /[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/.test(event.key));
this.#inputGroupEl.classList.toggle(
"error",
/[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/.test(event.key)
);
});
this.#inputEl.addEventListener("input", (event) => {
// console.log(event.target.value);
event.target.value = event.target.value.replace(
/[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/,
""
);
});
}
#addEvent() {
this.#swichEl.addEventListener("change", this.#onChangeTheme);
this.#fontSelectEl.addEventListener("change", this.#onChangeFont);
document.addEventListener("keydown", this.#onKeyDown.bind(this)); //
document.addEventListener("keyup", this.#onKeyUp.bind(this)); //
this.#inputEl.addEventListener("input", this.#onInput);
}
#onInput(event) {
event.target.value = event.target.value.replace(/[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/, "");
}
#onKeyDown(event) {
this.#inputGroupEl.classList.toggle(
"error",
/[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/.test(event.key)
);
this.#keyboardEl
.querySelector(`[data-code=${event.code}]`)
?.classList.add("active"); // optional chaining
}
#onKeyUp(event) {
this.#keyboardEl
.querySelector(`[data-code=${event.code}]`)
?.classList.remove("active"); // optional chaining
}
비 많이 온다 😢