const title = document.querySelector(".hello h1");
// .hello는 className표시, id를 쓰고 싶으면 #idName
console.log(title); // => 콘솔창에 출력은 <h1>Grab me!</h1> 요렇게...
const title = document.querySelector(".hello h1");
title.innerText = "Hello!!"
const title = document.querySelector("div.hello:first-child h1");
function handleTitleClick(){
title.style.color = "blue";
}
title.addEventListener("click", handleTitleClick);
//click하면 handleTitleClick이라는 function이 동작하길 원함
//그래서 handle~ 함수에 () 를 안넣은 것임. 중요!!!
//즉, js가 대신 실행시켜주길 바라는 것임!
function handleMouseEnter() {
title.innerText = "Mouse is here!"
}
function handleMouseLeave() {
title.innerText = "Mouse is gone!"
}
title.addEventListener("mouseenter", handleMouseEnter);
title.addEventListener("mouseleave", handleMouseLeave);
function handleWindowResize(){
document.body.style.backgroundColor = “tomato”;
}
function handleWindowCopy(){
alert(“copier”);
}
window.addEventListener(“resize”, handleWindowResize);
window.addEventListener(“copy”, handleWindowCopy);
const h1 = document.querySelector("div.hello:first-child h1");
function handleTitleClick() {
const currentColor = h1.style.color;
let newColor; //const는 변할 수 없으니 변경이 가능한 let을 쓰자
// 지금 newColor는 비어있는 let변수이다.
if (currentColor === "blue") {
newColor = "tomato";
} else {
newColor = "blue";
}
h1.style.color = newColor;
}
h1.addEventListener("click", handleTitleClick);
1번 질문 : 왜 currentColor를 const로 받을까 첨부터 let변수로 하면 안돼는지?
답 : 아마 질문하신 의도가 newColor라는 변수 선언 없이 currentColor를 애초에 let으로 설정해두고 조건에 따라 변한 색을 currentColor에 저장하면 안되는지에 대한 것 같습니다.
보통 헷갈리지 않고 변수를 활용하기 위해서 '원래 어떤 색이었는지'와 '새로 적용해줘야 할 색이 무엇인지'처럼 의미의 차이가 확연한 경우 다른 변수로 저장해두는 것이 보통입니다.
또한 기존의 색을 const로 설정해두면 값이 변하지 않기 때문에, 만일 그 색이 필요해서 찾아보거나 활용하게 될 때 믿을 수 있는 값을 얻을 수 있겠죠. 단지 영상에 나온 코드에서 사용하려면 let potato = h1.style.color;로 선언해두고 potato를 계속 활용할 수도 있겠지만, 일반적으로 코드를 작성할 때 니코쌤이 했듯이 변수가 가지는 의미에 따라서 나눠서 선언하는 방식이 바람직하다고 할 수 있을 것 같습니다!2번 질문 : 왜 계속 색이 바뀌는 거지?
답 : 함수 내에서 선언된 변수는 함수 밖에서는 존재하지 않습니다. 그렇기 때문에 const currentColor로 변수 선언을 하더라도, 함수가 호출될 때 마다 새로운 값을 받을 수 있습니다.
/*CSS*/
h1 {
color: cornflowerblue;
}
.clicked {
color: tomato;
}
//JS
const h1 = document.querySelector("div.hello:first-child h1");
function handleTitleClick() {
// h1.className은 getter이면서 setter
// 즉, 현재의 class를 얻어올 수도 있지만 class를 변경할 수도 있다.
// getter(획득자) setter(설정자)
if (h1.className === "clicked") {
h1.className = "";
} else {
h1.className = "clicked";
}
}
h1.addEventListener("click", handleTitleClick);
function handleTitleClick() {
const clickedClass = "clicked";
if(h1.className === clickedClass) {
h1.className = "";
} else {
h1.className = clickedClass;
}
}
function handleTitleClick() {
const clickedClass = "clicked";
if (h1.classList.contains(clickedClass)) {
//contains은 우리가 명시한 class가 HTML element의 class에 포함되어 있는지 말해준다
//위의 조건은 h1의 class에 clickedClass가 포함되어 있니?
h1.classList.remove(clickedClass) //포함되어 있다면 제거해줘!
} else {
h1.classList.add(clickedClass) // 없다면 더해줘!
}
}
//add와 remove로 classname을 더하고 뺄 수 있다. 전체를 교체하지 않고!!!
function handleTitleClick() {
h1.classList.toggle("clicked");
}
//위에 5줄의 코드가 toggle 덕분에 이렇게 한 줄이 되었다.
- 만약 처음부터 toggle의 기능을 공부하고 썼다면 음.. 이런게 있군하고 넘어갔을 것이다.
- class를 지정하고 if문, 함수 등을 써보면서 코드가 구동이 되는 성취감을 느껴보고, 길어지고 반복되는 코드를 줄이고 싶어지고, 드디어 이런 혁명적인 toggle을 넣고 충격을 받으면서 시간은 걸렸지만 기초부터 확실하게 차근차근 공부하는 기분이다.!!
- 힘들지만... 뿌듯하네..