codeit 을 통해 공부하고 정리한 내용입니다!
함부로 내용을 가져가서 사용하면 안 됩니다.
학원 마치고 집 와서 인강으로 계속 들으려니까.. 약간 피곤하기도 하다.ㅠㅠ
밥 먹고 쉬다가.. 한 시간 정도 늦게 공부를 시작했다.😭
조금씩 진도나가는게 느려지고 있다. 게으른게 아니라 내용이 조금씩 어려워지고있다!!
// DOM 에 접근하는 방법
let btn = document.querySelector('#myBtn');
btn.onclick = function(){
console.log('Hi Codeit!');
}
// 이벤트 핸들러 등록하기
function event1(){
console.log('Hi Codeit!');
}
function event2(){
console.log('Hi again!');
}
// elem.addEventListener(even, handler)
btn.addEventListener('click', event1);
btn.addEventListener('click', event2);
// elem.removeEventListener(ene, handler)
// 이벤트를 제거하기 위해서는 외부에서 함수를 작성해야한다.
btn.removeEventListener('click', event2);
// 이렇게 작성을 할 수 있지만 제거하기 위해서는 위에서 처럼 외부에서 함수를 작성해야한다.
btn.addEnventListener('click', function(){
console.log('event3!;);
}
// 이렇게 작성하면 안 지워진다!! 의미 없는 코드가 된다.
btn.removeEventListener('click', function() {
console.log('click!');
});
const btn = document.querySelector('#btn');
function printBtn() {
console.log(btn.outerHTML);
}
btn.onclick = function() {
console.log('click!');
};
btn.onclick = printBtn; // 이렇게 사용하면 안된다!!!
btn.removeEventListener('click', printBtn); // 삭제 안됨 x
아래는 공통 프로퍼티!
const myInput = document.querySelector('#myInput');
const myBtn = document.quertSelector('#myBtn');
function printEvent(event){
console.log(event);
}
myInput.addEventListener('keydown', printEvent);
myBtn.addEventListener('click', printEvent);
for of 와 for in 이 헷갈린다.
const toDoList = document.querySelector('#to-do-list');
const items = toDoList.children;
// 내가 작성한 부분
for (let i = 0; i < 3; i++){
items[i].addEventListener('click', updateToDo);
}
// 모범 답안
for (let item of items) {
item.addEventListener('click', updateToDo);
}
// arrow function으로 함수 표현을 간략하게 바꾼 것이라고 한다.
for (let elem of document.querySelectorAll('*')) {
elem.addEventListener("click", e => alert(`캡쳐링 단계: ${elem.tagName}`), true);
elem.addEventListener("click", e => alert(`버블링 단계: ${elem.tagName}`));
}
main의 이벤트가 코드에서 먼저 실행되고 출력되는게 맞다고 생각했는데..
이게 currentTarget 이라는 메소드 때문인 것인지 자식 요소들의 이벤트를 먼저 출력하는데 이유를 모르겠따.
자식 노드의 이벤트가 없기 때문에 자식 노드를 클릭하면 부모 노드 이벤트가 발생하는 이벤트 버블링 현상이 일어나는데 까지는 이해가된다. 그런데 여기서 왜 자식 노드에서 부모 노드의 이벤트가 발생하는 것일까? 무엇인가 놓치고 있는 기분이 든다.
const main = document.querySelector('#main');
const toDoList = main.lastElementChild;
function printCurrentTarget(event) {
console.log(event.currentTarget);
}
main.addEventListener('click', printCurrentTarget); // <= 먼저 이벤트가 발생하는데
for (let child of toDoList.children) { // <= 이 친구들이 먼저 출력이된다.
child.addEventListener('click', printCurrentTarget);
}
아래와 같이 작성하면 기존의 리스트 들은 이벤트가 작동하지만 새로 추가되는 리스트는 이벤트가 작동이 안되는 것을 확인할 수 있다.
const list = document.querySelector('#list');
for (let item of list.children){
item.addEventListener('click', function(e){
e.target.classList.toggle('done');
}
}
const li = document.createElement('li');
li.classList.add('item');
li.textContent = '일기쓰기';
list.append(li);
위와 같은 문제를 해결하기 위해서는 자식 노드 하나씩 이벤트를 주는 것이 아니라 부모 요소에서 이벤트를 다루게 하면 된다.(위임했다고 보면 된다)
list.addEventListener('click', function(e){
e.target.classList.toggle('done');
})
위의 해결방법도 불안전하다. 자식 요소를 제외한 부모인 요소를 선택해도 이벤트 핸들러가 작동한다. 아래와 같이 if 문을 추가해서 작성을 하면 된다.
list.addEventListener('click', function(e){
if (e.target.classList.contains('item'){
e.target.classList.toggle('done');
}
}
const link = document.querySelector('#link');
const checkbox = document.querySelector('#checkbox');
const inputs = document.querySelector('#input');
// event.preventDefault
link.addEventListener('click', function(e){
e.preventDefault();
alert('지금은 클릭 할 수 없습니다.');
}
inputs.addEventListener('keydown', funtion(e) {
if (!checkbox.checked){
a.preventDefault();
alert('체크박스를 먼저 클릭해 주세요');
}
})