본문 바로가기

JS

JS 이벤트 처리 - 5 ( 이미지 토글 )

1. 심볼즈(Symbols)에 대해 알아 보자

심볼즈(Symbols)"는 문자나 기호를 의미한다. 웹 페이지에서 사용할 수 있는 다양한 문자나 기호가 있고, 이러한 문자나 기호는 특정 코드를 사용하여 웹 페이지에 표시할 수 있다.

 

https://www.htmlsymbols.xyz/heart-symbols

 

HTML Symbols

...

www.htmlsymbols.xyz

 

 

시나리오 코드 1단계
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    body {
        display: flex;
        justify-content: center;
    }

    .like-heart {
        font-size: 40px;
        color: gray;
        cursor: pointer;
    }

    .like-heart.liked {
        font-size: 60px;
        color: red;
    }

</style>
<body>
    <span class="like-heart" onclick="likeToggle(this)">&#9825;</span>
   
    <script>
        function likeToggle() {
            let likeHeart = document.querySelector(".like-heart");
            console.log("likeHeart", likeHeart);
            console.log( typeof likeHeart);
            console.log(likeHeart);
            likeHeart.style.fontSize = "40px";
            // 토글 기능 ---> 상태값 저장(변수) - !부정 --> 삼항연산자를 
            likeHeart.classList.toggle("liked");
        }
        // 확인 
        // let elements = document.getElementById("example");
        // console.log(elements);
        // console.log(typeof elements);
        // Node , NodeList ,  HTMLCollection 

    </script>
</body>
</html>

 

 

💡 참고

JavaScript에서 DOM(Document Object Model) 을 통해 요소를 가져올 때 반환되는 객체 타입은 HTMLCollection, NodeList, Node 등이 있습니다. 이들은 각각 다르게 동작하며, 사용하는 메서드에 따라 달라질 수 있다.

 

1. HTMLCollection

정의 : HTMLCollection은 HTML 문서에서 특정 기준으로 검색된 요소들의 집합이다.

생성 방식 : 주로 getElementsByTagName, getElementsByClassName, getElementsByName 메서드로 생성된다.

 

특징 : 

실시간(live) 컬렉션이다. 즉, DOM이 변경되면 HTMLCollection의 내용도 자동으로 업데이트된다. 

배열과 유사하지만, 진정한 배열은 아니다. 예를 들어 forEach 메서드를 사용할 수 없다.

인덱스 번호나 item() 메서드, 또는 nameddItem() 메서드로 접근할 수 있다.

let elements = document.getElementsByClassName("example");
console.log(elements); // HTMLCollection

 

 

2. NodeList

정의 : NodeList는 노드들의 집합으로, DOM의 노드를 나타낸다.

생성 방식 : 주로 querySelectorAll, childNodes 메서드로 생성된다.

 

특징 : 

정적(static) NodeList는 DOM이 변경되더라도 그 내용이 변경되지 않는다. 그러나 동적(live) NodeList는 DOM 변경 시 자동으로 업데이트된다.

배열과 유사하며, ES6 이후에는 forEach 메서드와 같은 배열 메서드를 사용할 수 있다.

NodeList는 모든 노드(예: 텍스트 노트, 주석 등)를 포함할 수 있으며, HTML 요소로만 구성되지 않을 수 있다.

let nodes = document.querySelectorAll(".example");
console.log(nodes); // NodeList

 

 

3. Node

정의 : NodeList는 DOM의 기본 인터페이스로, 요소(Element), 텍스트(Text), 주석(Comment) 등 다영한 유형의 노드를 포함할 수 있다.

 

특징 :

Node 객체는 parentNode, childNodes, nextSibling, previousSibling 등의 프로퍼티와 메서드를 가진다.

DOM의 모든 요소와 컨텐츠는 Node의 서브클래스이다.

Node 인터페이스 자체는 단일 노드를 나타내지만, NodeList와 같은 컬렉션의 요소로도 존재한다.

let nodes = document.querySelectorAll(".example");
console.log(nodes); // NodeList

 

 

차이점 요약

HTMLCollection vs NodeList :

HTMLCollection은 HTML요소만 포함하며, 실시간으로 업데이트된다.

NodeList는 모든 노드 유형을 포함할 수 있고, 정적 또는 실시간일 수 있다.

HTMLCollection은 주로 HTML 요소를 검색하는 특정 메서드로 생성된다.

NodeList는 querySelectorAll 같은 메서드를 통해 더 유연하게 노드를 선택 할 수 있다.

 

Node vs NodeList :

Node는 단일 노드를 나타내며, NodeList는 노드의 집합이다.

Node는 DOM 트리의 개별 노드(예: 요소, 텍스트, 주석)를 나타내며, DOM을 탐색하거나 조작할 때 사용된다.

 

 

 

시나리오 코드 2단계
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    body {
        display: flex;
        justify-content: center;
    }

    .like-heart {
        font-size: 40px;
        color: gray;
        cursor: pointer;
    }

    .like-heart.liked {
        font-size: 60px;
        color: red;
    }

</style>
<body>
    <span class="like-heart" onclick="likeToggle(this)">&#9825;</span>
    <span class="like-heart" onclick="likeToggle(this)">&#9825;</span>
    <span class="like-heart" onclick="likeToggle(this)">&#9825;</span>
   
    <script>
        function likeToggle(el) {
            el.classList.toggle("liked");
        }
    </script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    body {
        display: flex;
        justify-content: center;
    }

    .like-heart {
        font-size: 40px;
        color: gray;
        cursor: pointer;
        transition: color 1s ease, transform 1s ease;
    }

    .like-heart.liked {
        
        color: red;
        /* css 애니메이션 효과 */
        transform: scale(1.5);
    }

</style>
<body>
    <span class="like-heart" onclick="likeToggle(this)">&#9825;</span>
    <span class="like-heart" onclick="likeToggle(this)">&#9825;</span>
    <span class="like-heart" onclick="likeToggle(this)">&#9825;</span>
   

    <script>
        function likeToggle(el) {
            el.classList.toggle("liked");
        }
    </script>
</body>
</html>
728x90