노마드코더 바닐라 JS로 크롬 앱 만들기 강의를 듣고 정리한 기록입니다. 아래 내용은 3.0 - 3.8 에 해당합니다.
javascript 는 html 과 상호작용합니다. html 요소들을 javascript 로 읽고 추가하고 수정할 수 있습니다. document (브라우저에 저장된 객체)를 사용하면 html 요소들을 선택하고 변경할 수 있습니다.
document.title = "Hi"
// title 을 선택하고 Hi 라는 문자열 삽입
document.getElementById() 메소드를 사용하면 id 값이 지정된 html 태그를 선택할 수 있습니다.
//html
<h1 id="title">Grab me!</h1>
//js
document.getElementById("title")
console.dir() 을 콘솔에 찍어보면 해당 element 의 속성값을 확인할 수 있습니다.
// innerText 속성을 찾아서 적용해보면,
const title = document.getElementById("title")
title.innerText = "Got yo!";
class 이름으로 선택할 때는 document.getElementsByClassName() 을 사용하고, tag 요소로 선택할 때는 document.getElementsByTagName() 를 사용할 수 있습니다.
//html
<h1 class="hello">Grab me!</h1>
//js
document.getElementsByClassName("hello");
document.getElementsByTagName("h1")
// 해당 요소가 여러개면 배열로 가져옴
추천하는 방법은 querySelector() 와 querySelectorAll() 으로 조금 더 구체적으로 선택할 수 있습니다.
document.querySelctor(".hello h1")
// class 가 hello 인 h1 태그를 선택
// 못 찾으면 null 값 반환
document.querySelector("#hello");
// id 값을 호출할 때는 # 을 붙여서 구분합니다.
app.js 라는 별도의 js 파일을 만들고 html 파일에 import (연결)해서 씁니다.
<script src="app.js"></script>
js 의 style 속성을 사용해 css 값에 변화를 줄 수 있습니다.
const Link = document.querySelector("a")
Link.style.color = "blue"
Event 는 마우스를 클릭하거나, 커서를 올리거나, 입력하거나, 엔터를 누르는 행동들을 의미합니다. 이런 모든 Event 들을 js 는 listen 할 수 있습니다. 우선 click event 부터 살펴보면,
const title = document.querySelector("div h1") // 태그 선택
function handleTitleClick () { // 클릭 시 실행할 함수
console.log("title was clicked!")
}
title.addEventListener("click", handleTitleClick); // 클릭 이벤트 확인하고 실행할 함수 지정
click 으로 css 속성을 바꾸는 함수를 작성해보면,
const title = document.querySelector("div h1")
function handleTitleClick () {
title.style.color = 'blue';
}
title.addEventListener("click", handleTitleClick);
listen 하고 싶은 event 를 찾고 싶다면 h1 html element mdn 을 검색하거나 console.dir() 로 확인할 수 있습니다. 프로퍼티 앞에 on 이 붙어 이으면 event listener 입니다.
const title = document.querySelector("div h1")
function handleTitleClick(){
title.style.color = 'blue';
}
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);
// 이렇게 표기할 경우 on 을 붙이진 않습니다.
이벤트를 확인하는 코드는 아래와 같이 변경해서 쓸 수 있습니다.
title.addEventListener("click", handleTitleClick);
title.addEventListener("mouseenter", handleMouseEnter);
// 위 두줄과 아래 두줄은 같은 동작이지만, 위 코드처럼 표기하는 것 선호
title.onclick = handleTitleClick;
title.onmouseenter = handleMouseEnter;
window 의 event 를 listen 할 수도 있습니다. 화면의 크기가 바뀌면 배경 색이 바뀌는 코드를 작성해보면,
function handleWindowResize(){
document.body.style.backgroundColor = 'tomato';
}
window.addEventListener("resize", handleWindowResize)
유저가 copy 하는 행위를 확인할 때는,
window.addEventListener("copy", handleWindowCopy);
와이파이가 연결되어 있는지 확인하고 싶다면,
window.addEventListener("offline", handleWindowOffline);
window.addEventListener("online", handleWindowOnline);
한 번 클릭하면 블루, 또 클릭하면 레드.. 이런식으로 번갈아 가며 적용하려면 조건문을 써야 합니다.
const h1 = document.querySelector("div h1");
function handleTitleClick(){
if(h1.style.color === "blue"){
h1.style.color = "tomato";
} else {
h1.style.color = "blue";
}
}
h1.addEventListener("click", handleTitleClick);
위 함수식을 조금 더 정리해보면,
function handleTitleClick(){
const currentColor = h1.style.color; 변수로 묶어주고
let newColor; // 선언만
if(currentColor === "blue"){
newColor = "tomato";
} else {
newColor = "blue";
}
h1.style.color = newColor; // 이걸 왜 뒤에 넣어주는지..
}
element 의 style 을 js 에서 바로 변경하는 것은 좋지 않습니다. css 에 특정 클래스 이름으로 속성 변화값을 만들고, js 에서 해당 html 요소에 그 클래스 값을 지정하는 것이 좋습니다.
.active {
color: blue;
}
이렇게 css 를 작성하고, js 에서 h1 에 active 라는 class 를 달아줍니다.
const h1 = document.querySelector("div h1");
function handleTitleClick(){
h1.className = "active"
}
h1.addEventListener("click", handleTitleClick);
h1.className 은 현재의 이름을 가져오기도 하고 변경하기도 합니다. 위 함수를 조건문으로 수정해보면,
function handleTitleClick(){
if(h1.className === "active"){
h1.className = "";
} else {
h1.className = "active";
}
}
이렇게 설정이 되면 css 에서만 추가적인 변화를 주면 됩니다.
.active {
color: blue;
transition: color .5s ease-in-out;
}
클래스 이름을 실수로 잘못 적으면 동장을 안하니 중복되는 클래스 이름도 변수로 지정하는 것이 좋습니다. 변수의 경우 잘못 적게 되면 콘솔창에서 확인이 가능합니다.
// active 를 clicked 로 교체한 상태
function handleTitleClick(){
const clickedClass = "clicked";
if(h1.className === "clickedClass"){
h1.className = "";
} else {
h1.clasName = "clickedClass";
}
}
classList 를 활용하면 특정 class 만 선택해서 조정할 수 있습니다.
// 위 코드를 수정해보면,
function handleTitleClick(){
const clickedClass = "clicked";
if(h1.classList.contains(clickedClass)){
h1.classList.remove(clickedClass);
} else {
h1.classList.add(clickedClass);
}
}
// 비교나 대입 연산자를 쓰지 않고 사용할 수 있습니다.
classList.containts // 포함여부 확인
classList.remove // 해당 클래스 없애기
classList.add // 해당 클래스 넣기
이런 작업은 toggle 을 활용하면 더 쉽게 만들 수 있습니다. toggle 은 있다면 없애주고, 없다면 추가해줍니다.
function handleTitleClick(){
h1.classList.toggle("clicked");
}