id
와 class
속성을 이용해서 JavaScript로 HTML 태그를 선택하는 방법에 대해 알아봤는데요.document.getElementsByTagName('태그이름')
메소드를 활용하면 태그 이름으로 태그를 선택할 수 있습니다.
const btns = document.getElementsByTagName('button');
이렇게 하면 HTML 문서 내에 있는 모든 button
태그를 선택하게 됩니다. https://bakey-api.codeit.kr/api/files/resource?root=static&seqId=3827&directory=%E1%84%90%E1%85%A2%E1%84%80%E1%85%B3%E1%84%8B%E1%85%B5%E1%84%85%E1%85%B3%E1%86%B7%E1%84%8B%E1%85%B3%E1%84%85%E1%85%A9%E1%84%90%E1%85%A2%E1%84%80%E1%85%B3%E1%84%89%E1%85%A5%E1%86%AB%E1%84%90%E1%85%A2%E1%86%A8%E1%84%92%E1%85%A1%E1%84%80%E1%85%B5&name=%E1%84%90%E1%85%A2%E1%84%80%E1%85%B3%E1%84%8B%E1%85%B5%E1%84%85%E1%85%B3%E1%86%B7%E1%84%8B%E1%85%B3%E1%84%85%E1%85%A9%E1%84%90%E1%85%A2%E1%84%80%E1%85%B3%E1%84%89%E1%85%A5%E1%86%AB%E1%84%90%E1%85%A2%E1%86%A8%E1%84%92%E1%85%A1%E1%84%80%E1%85%B5 document.getElementsByClassName('class')
메소드와 마찬가지로 태그 이름으로 요소를 찾는 경우에 여러 개의 요소가 선택될 수 있기 때문에 메소드 이름에 Element(s)
, s가 있고, 실행결과 역시 HTMLCollection을 리턴한다는 점도 함께 기억해 두시면 좋을 것 같습니다. 참고로 css 선택자처럼 '*'
값을 전달하게 되면 모든 태그를 선택할 수도 있는데요.
const btns = document.getElementsByTagName('button');
const allTags = document.getElementsByTagName('*');
하지만, css 스타일링을 할 때도 태그 이름으로 스타일링을 하는 경우는 거의 없죠? 마찬가지로 명확한 의도가 없이 이렇게 많은 요소들을 한꺼번에 다루게 되면 예상치 못한 실수를 할 가능성이 있기 때문에 자바스크립트에서도 많이 사용되는 메소드는 아닙니다. <css 선택자로 태그 선택하기> css 선택자를 활용해서 태그를 선택하는 메소드는 document
객체의 querySelector
와 querySelectorAll
두 가지가 있습니다. 하나의 요소를 선택할 때는 querySelector
를 사용하는데,querySelector('#ID')
는 getElementById('ID')
와 같은 결과를 리턴합니다.querySelector
메소드를 활용할 때 클래스나 태그 이름처럼 여러 개의 요소가 존재하는 선택자를 쓰더라도 그 중 가장 첫번째 요소 하나만 선택한다는 점, 이 부분도 잘 기억해 두시면 좋을 것 같습니다. 그리고 여러 개의 요소를 선택할 때는 querySelectorAll
을 사용합니다. 여러 개의 요소가 선택되기 때문에 NodeList라는 이름의 유사 배열에 각 요소가 담기게 되는데요.querySelectorAll
를 사용할 때 주의해야 할 부분은 만약 존재하지 않는 요소를 선택할 경우, undefined
나 null
값이 리턴되는 것이 아니라getElementById
와 동일하게 querySelector
메소드를 활용해 존재하지 않는 요소를 선택할 경우에는 null
값을 리턴합니다.
alert('message');
alert
라는 함수를 사용하면, 브라우저에 경고창을 띄울 수 있습니다. https://bakey-api.codeit.kr/api/files/resource?root=static&seqId=3779&directory=%E1%84%8C%E1%85%A5%E1%86%BC%E1%84%83%E1%85%A1%E1%86%B8%E1%84%8B%E1%85%B5%E1%86%AF%E1%84%81%E1%85%A1?-1&name=%E1%84%8C%E1%85%A5%E1%86%BC%E1%84%83%E1%85%A1%E1%86%B8%E1%84%8B%E1%85%B5%E1%86%AF%E1%84%81%E1%85%A1%3F-1 주어진 코드를 실행했을 때 화면에 나타나는 채점이라고 적힌 button
태그를 클릭하면 정답입니다!👏🏻
라는 경고창이 나타나도록 코드를 작성해 주세요.
...
<button id="grade" onclick="alert('정답입니다!👏🏻')">
...
하지만, 이 방법은 자바스크립트 코드가 복잡해질 경우 HTML 파일의 가독성과 코드의 일관성을 해치기 때문에 웹 페이지의 구조를 결정하는 일은 HTML 파일에, 동작을 담당하는 일은 js 파일에만 작성하는 것이 좀 더 권장되는 방식이라고도 배웠습니다. 그래서 이번 실습 과제에서도 이 방법을 사용하지 말고, 자바스크립트 파일에서 코드를 작성하라는 조건이 있는데요. 지난 시간에 배운 내용 중에서 버튼을 클릭했을 때 어떤 동작이 일어나게 하는 다른 한 가지 방법은 바로 태그를 선택한 다음, 해당 태그의 onclick 프로퍼티를 활용하는 방법이었습니다.
document.querySelector('#grade');
document.querySelector('button');
document.querySelectorAll('button')[0];
document.getElementsByTagName('button')[0];
그리고 이 값 중 하나를 변수에 담아서 onclick 프로퍼티에 이벤트 핸들러를 할당하면 되는데요.alert('정답입니다!👏🏻')
로 작성하면 되겠죠? 결과적으로 아래와 같이 코드를 작성하면, 이번 실습을 해결할 수 있습니다.
const myBtn = document.querySelector('#grade');
myBtn.onclick = function() {
alert('정답입니다!👏🏻');
};
메소드 | 의미 | 결과 |
---|---|---|
document.getElementById('id') | HTML id속성으로 태그 선택하기 | id에 해당하는 태그 하나 |
document.getElementsByClassName('class') | HTML class속성으로 태그 선택하기 | class에 해당하는 태그 모음(HTMLCollection) |
document.getElementsByTagName('tag') | HTML 태그 이름으로 태그 선택하기 | tag에 해당하는 태그 모음(HTMLCollection) |
document.querySelector('css') | css 선택자로 태그 선택하기 | css 선택자에 해당하는 태그 중 가장 첫번째 태그 하나 |
document.querySelectorAll('css') | css 선택자로 태그 선택하기 | css 선택자에 해당하는 태그 모음(NodeList) |
document.getElementById('id')
<!DOCTYPE html>
<html>
<body>
<p id="myId">Hello World!</p>
<script>
var element = document.getElementById('myId');
console.log(element); // <p id="myId">Hello World!</p>
</script>
</body>
</html>
document.getElementsByClassName('class')
<!DOCTYPE html>
<html>
<body>
<p class="myClass">Hello</p>
<p class="myClass">World!</p>
<script>
var elements = document.getElementsByClassName('myClass');
console.log(elements); // HTMLCollection(2) [p.myClass, p.myClass]
</script>
</body>
</html>
document.getElementsByTagName('tag')
<!DOCTYPE html>
<html>
<body>
<p>Hello</p>
<p>World!</p>
<script>
var elements = document.getElementsByTagName('p');
console.log(elements); // HTMLCollection(2) [p, p]
</script>
</body>
</html>
document.querySelector('css')
<!DOCTYPE html>
<html>
<body>
<p class="myClass">Hello</p>
<p class="myClass">World!</p>
<script>
var element = document.querySelector('.myClass');
console.log(element); // <p class="myClass">Hello</p>
</script>
</body>
</html>
document.querySelectorAll('css')
<!DOCTYPE html>
<html>
<body>
<p class="myClass">Hello</p>
<p class="myClass">World!</p>
<script>
var elements = document.querySelectorAll('.myClass');
console.log(elements); // NodeList(2) [p.myClass, p.myClass]
</script>
</body>
</html>
이 예시들은 각 메소드가 어떻게 HTML 요소를 선택하고 결과를 반환하는지를 보여줍니다. getElementById
는 단일 요소를 반환하며, getElementsByClassName
과 getElementsByTagName
는 HTMLCollection을 반환하고, querySelector
는 첫 번째 일치 요소를, querySelectorAll
은 NodeList를 반환합니다.배열과 유사한 객체 ex) HTMLCollection, NodeList, DOMTokenList, ...
숫자 형태의 indexing이 가능하다.
length
프로퍼티가 있다.
배열의 기본 메소드를 사용할 수 없다.
Array.isArray(유사배열)
의 리턴값은 false
다.
이벤트 : 웹 페이지에서 발생하는 대부분의 일(사건)들 ex) 버튼 클릭, 스크롤, 키보드 입력, ...
이벤트 핸들링 : 자바스크립트를 통해 이벤트를 다루는 일
이벤트 핸들러 : 이벤트가 발생했을 때 일어나야하는 구체적인 동작들을 표현한 코드. 이벤트 리스너(Event Listener)라고도 부른다.
const btn = document.querySelector('#myBtn');
btn.onclick = function() {
console.log('Hello Codeit!');
};
<button id="myBtn" onclick="console.log('Hello Codeit!')">클릭!</button>