기초

  1. console.dir 을 사용하면 document를 호출할 수 있다.
  2. console.dir(title); 을 통해서 더 자세하게 객체의 형태로 id를 관찰할 수 있고 textContent: “Grab me!” 등 을 통해서 JS를 통해서 HTML을 읽을 수 있다는 것을 알 수 있다.
  3. title을 보면 Momentum이라고 되어있는데 우리는 js에서 title을 정의한적이 없다.
  4. document가 HTML을 JS의 관점의 object로 보여준다.
  5. JS는 HTML에 접근하고 읽을 수 있게 설정이 되어 있다.
  6. JS에서 document.title = “JS”를 하면 타이틀이 바뀐다.
  7. console에서 document.body를 사용하면 html의 body부분을 가져올 수 있다.
  8. html에서 타이틀을 HTML로 바꾸고 js에서 title을 JS로 바꾸었을 때 JS로 나온다.

getElement

HTML

<h1 id="title">Grab me!</h1>

JS

const title = document.getElementById("title");
title.innerText = "good!"

일 때 title로 good!이 나온다.


<h1 autofocus id="title">Grab me!</h1>

autofocus를 추가하면 autofocus가 true로 바뀐다.


<h1 autofocus class="hello" id="title">Grab me!</h1>

class를 추가하면 className이 생긴다.


class를 js로 가져오려면

const hellos = document.getElementsByClassName("hello");

querySelector


querySelector는 element를 CSS방식으로 검색할 수 있다.

const title = document.querySelector(".hello h1");

querySelector는 하나의 element만 반환한다.

하지만

const ddiv = document.querySelectorAll("ddiv h1");

console.log(ddiv); // NodeList(3) [h1, h1, h1]

모두 반환한다.


const ddivv = document.querySelector(".hello h1:first-child");

조건에 맞는 첫번째 element만 반환 따라서 querySelectorAll로 사용해도 됨


const title = document.querySelector("div.hello:first-child h1")

class hello를 가진 div 내부의 first-child인 h1을 찾는 코드


const title = document.querySelector("#hello");
const title = document.getElementById("hello");

같은 일을 하는 코드

하지만

querySelector("#hello form"); 
querySelector("#hello h1");

등이 가능하기 때문에 더 유리하다.


const title = document.querySelector(".hello h1");
title.innerText = "Hello";

class hello 의 h1 안에 있는 innerText를 Hello로 바꾸는 코드

이것을

console.dir(title);

했을 때 h1은 object형식으로 표시되고 수많은 element들을 보여준다. 그중에서 on으로 시작되는 것들이 바로 events다. 실행시킬 때는 on을 빼고 사용하면 된다.

또한 style에서 color를 찾을 수 있었고 color를 바꾸는 방법은

title.style.color = "blue";

events

JS에서 대부분 작업할 일은 evnets를 listen하는 것이다. 클릭, 엔터 등의 동작 혹은 내부에서의 변화에 반응하는 것들이 events라고 할 수 있다.


function handleTitleClick() {
    title.style.color = "blue";
}

title.addEventListener("click", handleTitleClick);

클릭 이벤트를 활성화하는 방법

위 코드는

title.onclick = handleTitleClick;

와 같다. 하지만 addEventListener는 removeEventListener로 제거할 수 있다는 장점을 가지고 있다.

함수를 따로 JS내에서 실핼시킬 필요가 없다. addEventListener의 두번째 인수로 받아서 이용하는 사람에게 실행시킬 수 있도록 만들기 때문


listen하고 싶은 event를 찾는 가장 좋은 방법은, 구글링 ex) h1 html element mdn 그리고 API를 찾아라


function handleMouseenterTitle() {
    console.log("mouse is here");
}

title.addEventListener("mouseenter", handleMouseenterTitle);
title.onmouseenter = handleMouseenterTitle;

마우스를 title 위에 올리면 console이 찍히는 코드


function handleMouseLeaveTitle() {
    title.innerText = "Mouse is gone";
}

title.addEventListener("mouseleave", handleMouseLeaveTitle);

title.onmouseleave = handleMouseLeaveTitle;

마우스가 title 위를 떠나면 title.innerText가 바뀌는 코드


window events

function handleWindowResize() {
    document.body.style.backgroundColor = "tomato";
}
window.addEventListener("resize", handleWindowResize);

사이즈를 변경하면 백그라운드 컬러가 변경된다.


function handleWindowCopy() {
    alert("copier!");
}
window.addEventListener("copy", handleWindowCopy);

카피를 하면 copier!을 alert으로 반환한다.


function handleWindowOffline() {
    alert("No wifi");
}
window.addEventListener("offline", handleWindowOffline);

와이파이 연결이 끊기면 alert으로 No wifi를 반환


function handleWindowOnline() {
    alert("connect wifi");
}
window.addEventListener("online", handleWindowOnline);

와이파이가 연결되면 alert으로 connect wifi를 반환


click events 응용

const h1 = document.querySelector("h1");

function handleh1Click() {
    const currentColor = h1.style.color;
    let newColor;
    if(currentColor === "blue"){
        newColor = "tomato";
    }   else    {
        newColor = "blue";
    }
    h1.style.color = newColor;
}

h1.addEventListener("click", handleh1Click);

클릭 할때마다 h1의 color가 바뀌는 코드


  1. element를 찾아라
  2. event를 listen해라
  3. 그 event에 반응해라

하지만 style을 건들 때는 CSS를 이용하는 것이 좋다.


JS

function handleh1Click() {
    h1.className = "active";
}

h1.addEventListener("click", handleh1Click);

CSS

h1 {
    color : blue;
}

.active {
    color: tomato;
}

HTML

<h1>Grab me!</h1>

->

<h1 class="active">Grab me!</h1>

color: blue -> tomato


className은 getter이자 setter이다.

function handleh1Click() {
    if(h1.className === "active"){
        h1.className = "";
    }   else    {
        h1.className = "active";
    }
}

h1.addEventListener("click", handleh1Click);

CSS를 통해서 클릭할 때 h1.className의 색상이 바뀌게 하는 코드


h1 {
    color : blue;
    transition: color 0.5s ease-in-out;
}

색상이 천천히 바뀌는 코드


HTML

    <h1 id="title" class="">Grab me!</h1>

CSS

.clicked {
    color: red;
}

JS

const h1 = document.querySelector("h1");

function handleh1Click() {
    const clickedClass = "clicked";
    if(h1.className === clickedClass){
        h1.className = "";
    }   else    {
        h1.className = clickedClass;
    }
}

h1.addEventListener("click", handleh1Click);

JS에 CSS의 clicked를 clickedClass에 변수로 할당하여 사용하면 err를 줄일 수 있다. 만약 변수의 이름에 오류가 있다면 console에서 확인이 가능하기 때문


만약 HTML

<h1 class="sexy-font">Grab me!</h1>

처럼 class가 있고 CSS

.sexy-font {
    font-family: system-ui, -apple-system, BlinkMacSystemFont, 
    'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 
    'Helvetica Neue', sans-serif
}

일 때

위 함수를 실행시키면

<h1 class="">Grab me!</h1>
<h1 class="clicked">Grab me!</h1>

를 반복하며 class= “sexy-font”가 사라지고 오류 또한 나오지 않는다.

따라서

function handleh1Click() {
    const clickedClass = "clicked sexy-font";
    if(h1.className === clickedClass){
        h1.className = "";
    }   else    {
        h1.className = clickedClass;
    }
}

h1.addEventListener("click", handleh1Click);

로 지정해주면

<h1 class="">Grab me!</h1>
<h1 class="clicked
sexy-font">Grab me!</h1>

처럼 된다.


하지만 좋은 방법은 아니다. class를 변경하거나 추가한다면 JS와 CSS를 업데이트 해야하기 때문이다. 그래서 JS로 모든 class name을 변경하지는 않아야 한다. 따라서 sexy-font를 삭제하지 않고 clicked class를 변경해야 한다. classList로 해결할 수 있다.


DOMTokenList.contains() Returns true if the list contains the given token, otherwise false.

function handleh1Click() {
    const clickedClass = "clicked";
    if(h1.classList.contains(clickedClass)){
        h1.classList.remove(clickedClass);
    }   else    {
        h1.classList.add(clickedClass);
    }
}
h1.addEventListener("click", handleh1Click);
<h1 class="sexy-font">Grab me!</h1>
<h1 class="sexy-font clicked">Grab me!</h1>

sexy-font는 유지되면서 clicked 유뮤만 바뀐다.


toggle

DOMTokenList.toggle() Removes the token from the list if it exists, or adds it to the list if it doesn’t. Returns a boolean indicating whether the token is in the list after the operation.

위 함수와 같은 역할을 해주는 코드

따라서

function handleh1Click() {
    h1.classList.toggle("clicked");
}

만 사용해도 된다.

toggle은 h1의 classList에 clicked class가 이미 있는지 확인해서 만약 있다면, toggle이 clicked를 제거한다. 만약 h1의 classList에 clicked가 존재하지 않는다면, toggle은 clicked를 classList에 추가를 해줄 것이다.


댓글남기기