Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발자입니다

노마드코더 JS로 크롬앱만들기) #3 JAVASCRIPT ON THE BROWSER - document, querySelector, addEventListener, CSS 변경 본문

Javascript/노마드코더 - JS로 크롬앱 만들기

노마드코더 JS로 크롬앱만들기) #3 JAVASCRIPT ON THE BROWSER - document, querySelector, addEventListener, CSS 변경

끈기JK 2022. 9. 26. 10:39

■ JS에서 HTML 태그 선택

 

document. 다음 아래와 같이 HTML 태그를 선택할 수 있다.

document.title = "Hi" // HTML <title>을 Hi로 변경한다.
document.body  // HTML <body>
document.location  // HTML page 주소

 

getElements의 여러 방법들

const title = document.getElementById("title");
const hellos = document.getElementsByClassName("hello");
const hellos = document.getElementsByTagName("h1");

 


 

■ querySelector

 

노마드 코더에서는 99% querySelector 방식을 사용한다.

 

 querySelector는 CSS에서 선택하는 방식으로 입력한다.

// index.html
    <div class="hello">
        <h1>Grab me!</h1>
    </div>
// app.js
const title = document.querySelector(".hello h1");

 

class가 여러개일 경우 첫 번째 class만 가져온다.

모든 class 다 가져오려면 querySelectorAll 사용한다. 반환값은 Array이다.

 

하나의 element만 반환받는 방법

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

 

아래 두 코드는 같은 의미이다.

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

 

console.dir(elements) : elements 상태 모두 보여준다

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

console.dir(title);

 


 

■ EventListener

 

-addEventListener("이벤트", 동작) : 이벤트 발생시 동작을 실행한다. 동작에 ()를 붙이지 않는다. ()를 브라우저가 보면 바로 실행시킨다.

 

-"이벤트" 목록

"click" : 클릭시 실행

"mouseenter" : 마우스 포인터 진입시 실행

"mouseleave" : 마우스 포인터 나갈시 실행

 

-removeEventListener("이벤트", 동작) : 이벤트 발생 관련 동작을 제거한다.

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

function handleTitleClick() {
    title.innerText = "title was clicked!";
}

function handleMouseEnter() {
    title.innerText = "mouse is here!";
}

function handleMouseLeave() {
    title.innerText = "mouse is gone!";
}

title.addEventListener("click", handleTitleClick);
title.addEventListener("mouseenter", handleMouseEnter);
title.addEventListener("mouseleave", handleMouseLeave);
// 위 코드는 모두 아래처럼 대체 가능하다. 그러나 제거가 안돼서 위를 선호한다.
title.onclick = handleTitleClick;
title.onmouseenter = handleMouseEnter;
title.onmouseleave = handleMouseLeave;

// 이벤트 제거
title.removeEventListener("click", handleTitleClick);

구글에 h1 html element mdn 검색해서 정보 확인한다.

console.dir 에서 나오는 정보 중 on이 앞에 있는게 eventListener 이다.

 

-창 크기 변경시 이벤트 발생(배경색 변경)

"resize" : 창 크기 변경시 이벤트 발생시킨다.

// app.js
function handleWindowResize() {
    document.body.style.backgroundColor = "tomato";
}

window.addEventListener("resize", handleWindowResize);

document.body, title, head는 중요하기 때문에 document 밑에 존재한다. 하지만 div는 존재하지 않는다.

 

-"copy" : 복사시 이벤트 발생

function handleWindowCopy() {
    alert("copier!");
}

window.addEventListener("copy", handleWindowCopy);

 

-"offline" : 네트워크 연결 끊겼을때

"online" : 연결시 이벤트 발생

function handleWindowOffline() {
    alert("SOS! no WIFI!");
}

function handleWindowOnline() {
    alert("ALL GOOOOOD!");
}

window.addEventListener("offline", handleWindowOffline);
window.addEventListener("online", handleWindowOnline);

 

window 관련 이벤트 사이트: https://developer.mozilla.org/ko/docs/Web/API/window

DOM 인터페이스 사이트: https://developer.mozilla.org/ko/docs/Web/API/Document_Object_Model#dom_%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4

 


 

■ if 함수 넣어 이벤트 발생

// app.js
const h1 = document.querySelector("div.hello:first-child h1");

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

h1.addEventListener("click", handleTitleClick);

 

-위 코드에 CSS 적용

javascript에서 스타일 변경하는건 용도에 맞지 않아 CSS로 스타일 변경한다.

*h1.className : getter면서 setter이다.

*const clickedClass 정의해서 사용하는 이유는 직접 "clicked"를 입력했을때 오타가 나면 찾기 힘들기 때문이다.

*클릭시 h1.className 코드에 의해 class="clicked"가 입력되고 CSS style을 적용받는다.

// app.js
const h1 = document.querySelector("div.hello:first-child h1");

function handleTitleClick() {
    const clickedClass = "clicked";  // 직접 "clicked"를 입력했을때 오타가 나면 찾기 힘들기 때문
    if (h1.className === clickedClass) {
        h1.className = "";
    } else {
        h1.className = clickedClass;
    }
}

h1.addEventListener("click", handleTitleClick);
/* style.css */
body {
    background-color: beige;
}

h1 {
    color: cornflowerblue;
    transition: color .5s ease-in-out;
}

.clicked {
    color: tomato;
}

 

-위 코드에 .classList 사용

h1.className으로 class 지정하면 기존에 지정된 class를 제거한다.

h1.classList를 사용하면 제거하지 않고 추가할 수 있다. .contains, .remove, .add로 제어한다.

// app.js
const h1 = document.querySelector("div.hello:first-child h1");

function handleTitleClick() {
    const clickedClass = "clicked";
    if (h1.classList.contains(clickedClass)) {
        h1.classList.remove(clickedClass);
    } else {
        h1.classList.add(clickedClass);
    }
}

h1.addEventListener("click", handleTitleClick);
/* style.css */
body {
    background-color: beige;
}

h1 {
    color: cornflowerblue;
    transition: color .5s ease-in-out;
}

.clicked {
    color: tomato;
}

.sexy-font {
    font-family: 'Courier New', Courier, monospace;
}

 

-.toggle 사용하여 적용

.toggle을 사용하여 동일하게 만들 수 있다.

classList.toggle("클래스명") : 클래스명이 해당 태그에 있는지 확인하고, 없으면 클래스를 추가하고 있으면 클래스를 제거한다.

// app.js
const h1 = document.querySelector("div.hello:first-child h1");

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

h1.addEventListener("click", handleTitleClick);