document.querySelector 의 상수화

· 2024-10-10 (목) 13:43:12 · 1245 · 2

 

예전까지만 해도 우리는 아래처럼 요소에 접근을 했습니다.

 

document.getElementsByTagName("div") : 엘리먼트로 접근
document.getElementById("myId") : 아이디로 접근
document.getElementsByClassName("my-class") : 클래스로 접근
document.getElementsByName("myName") : 네임으로 접근

 

그러나 요즘은 이렇게 사용하지를 않습니다. 왜냐하면 document.querySelector 라는 강력한 도구가 있기 때문이죠.

아래처럼 접근합니다. 우리가 css 를 쓰는 것과 동일하니까 가독성도 높습니다.

 

document.querySelector("div") : 엘리먼트로 접근
document.querySelector("#myId")  : 아이디로 접근
document.querySelector(".my-class") : 클래스로 접근
document.querySelector("input[name='myName']") : 네임으로 접근

 

위에서 "input[name='myName']" 으로 접근하는 방식은 아주 효과적인 것인데요. 예를 들어서

 

<a href="...sir.kr/...">클릭</a>

 

위의 링크태그에 접근하려면 href 에 sir.kr/ 이라는 문자열을 포함하고 있는 <a> 태그라고 하면 되니까요.

 

document.querySelector("a[href*='sir.kr/']")

 

이런 식의 응용사례는 본인들이 직접 구글링을 해 보세요.

 

그리고 클래스는 여러개를 쓸 수 있으므로 document.querySelectorAll 을 써 배열처럼 사용할 수 있습니다.

 

document.querySelectorAll(".my-class")[0]
document.querySelectorAll(".my-class")[1]
document.querySelectorAll(".my-class")[2]
document.querySelectorAll(".my-class")[3]

 

즉 document.querySelector(".my-class") 과 document.querySelectorAll(".my-class")[0] 는 동일한 대상이죠.

 

배열처럼 기능하므로 for in, for of, forEach 를 쓸 수 있습니다. 저는 보통 for of 를 사용합니다.

여튼 루트을 돌려 저것들에게 글자색상을 red 로 주고 width 를 100px 로 한꺼번에 주려면...

 

for (i of document.querySelectorAll(".my-class")) {
    i.style.color = "red";
    i.style.width = "100px";
}

 

만일 [1] 에만 red 를 주고 나머지는 blue 를 주려면 카운터변수를 하나 생성해서 아래처럼요.

 

count = 0;
for (i of document.querySelectorAll(".my-class")) {
    i.style.color = count == 1 ? "red" : "blue";
    count++;
}

 

이제 종착역이 다가왔네요. 문제는...

document.querySelector 나 document.querySelectorAll 은 글자길이가 너무 깁니다.

물론 짧은 글자의 변수를 하나 연결해도 되겠지만 연결해야 할 대상이 많으면 영 그렇죠.

그래서 요즘 제가 착안한 방식입니다. 화살표 함수를 두개 만들고 이걸 상수화 시켰습니다.

 

const $_ONE = (one) => document.querySelector(one);
const $_ALL = (all) => document.querySelectorAll(all);

 

이렇게 해 놀으면

 

document.querySelector("#myId") 은 $_ONE("#myId") 로 간결화 됩니다.

document.querySelectorAll(".my-class")[1] 은 $_ALL(".my-class")[1] 로 간결화 됩니다.

 

관례적으로 상수의 네이밍은 모든 글자를 "대문자"와 "언더바"로 사용하기 때문에 달러 하나 주고 저리 이름을 주었는데 본인들이 다른 형태의 네이밍을 해도 상관은 없습니다.

|

댓글 2개

저도 작업하면서 알게되었네요. 외국산 소스들은 다 저렇게 쿼리셀렉터를 사용해서 처리하더군요.

2025-01-23 (목) 00:17:48

@techstar 

제이쿼리 같지만 그래도 바닐라입니다.

실제로는 $_ALL 하나로 충분합니다.

왜냐하면 [0] 이 있으니까요.

 

댓글을 작성하시려면 로그인이 필요합니다.

개발자팁

5,403건

개발과 관련된 유용한 정보를 공유하세요. 질문은 QA에서 해주시기 바랍니다.

+
분류 제목 글쓴이 날짜 조회
MySQL 24-12-14 조회 1,768
기타 24-12-14 조회 1,935
JavaScript 24-12-13 조회 1,986
JavaScript 24-12-13 조회 1,576
PHP 24-12-13 조회 2,037
PHP 24-11-26 조회 2,262
기타 24-11-14 조회 2,393
기타 24-10-30 조회 2,306
PHP 24-10-11 조회 1,958
JavaScript 24-10-10 조회 1,246
JavaScript 24-09-26 조회 1,782
24-09-25 조회 2,273
JavaScript 24-09-07 조회 2,030
24-09-11 조회 1,484
24-09-19 조회 2,393
24-09-10 조회 1,863
24-08-19 조회 1,587
24-10-03 조회 1,614
24-08-07 조회 1,219
24-07-23 조회 1,907
24-07-08 조회 1,502
24-06-27 조회 1,404
PHP 24-08-23 조회 1,596
PHP 24-07-31 조회 1,342
OS 24-07-22 조회 1,747
기타 24-07-22 조회 1,185
기타 24-07-12 조회 1,401
기타 24-07-02 조회 1,532
기타 24-07-02 조회 1,078
JavaScript 24-06-30 조회 1,202