article
요소의 자손 노드로 있는 모든 img
요소를 찾고 싶지만, 느려질 수 있기 때문에 HTML 컬렉션 객체의 탐색을 피하려고 한다.
CSS 스타일의 선택자 문자열과 선택자 API를 사용해서 article
요소 내부의 img
요소에 접근하면 된다.
var imgs = document.querySelectorAll("article img");
IE7, 파이어폭스 2 등과 같은 초기 버전의 브라우저는 선택자 API를 지원하지 않는다. IE8은 선택자 변형의 상당수를 지원하지 않는다.
querySelectorAll
은 선택자에 해당하는 모든 요소를 반환하지만 querySelector
는 처음 찾은 결과만 반환한다.
부모 노드와 관계없이 모든 img
요소에 접근하려면 다음과 같이 사용한다.
var imgs = document.querySelectorAll("img");
만약 article
요소의 자식으로 있는 img
요소만 가져오고 싶다면 다음과 같이 한다.
var imgs = document.querySelectorAll("article > img");
바로 뒤에 문단이 나오는 img
요소에 접근하고 싶다면 다음과 같이 한다.
var imgs = document.querySelectorAll("img + p");
비어 있는 alt
속성을 가지고 있는 img
요소에 접근하려면 다음과 같이 한다.
var imgs = document.querySelectorAll('img[alt=""]');
반대로 비어 있지 않은 alt
속성을 가지고 있는 img
요소에 접근하려면 다음과 같이 한다.
var imgs = document.querySelectorAll('img:not([alt=""])');
getElementsByTagName
을 통해 구한 객체 컬렉션과 달리 querySelectorAll
로 반환받은 요소 컬렉션은 라이브 컬렉션이 아니다. 업데이트 전에 가져온 컬렉션이라면 페이지의 업데이트 사항이 컬렉션에 반영되지 않는다.
선택자 API는 훌륭하지만 모든 문서 질의에 사용하면 안된다. 특정 아이디를 가진 요소에 접근할 때는 비효율적이므로 이때는
getElementById
를 사용하는 것이 더 좋다.