DOM은 Document Object Model의 약자로 웹 페이지를 트리 구조로 표현하고 다루기 위한 프로그래밍 인터페이스 입니다. 마치 건물 설계도와 비슷하게, DOM은 HTML, CSS, JavaScript와 같은 웹 기술을 사용하여 웹 페이지의 구조와 내용을 정의하고 조작할 수 있도록 해줍니다.
DOM은 웹 페이지를 트리 구조로 표현합니다. 이 트리 구조는 node
라는 개체들로 구성되며, 이들은 웹 페이지의 각 부분을 나타냅니다. 예를 들어, HTML 태그는 각각 하나의 노드를 형성하고, 이들 태그 노드는 부모-자식의 계층적인 관계를 가지게 됩니다. 이렇게 트리 구조로 나타내는 것이 중요한 이유는, 웹 페이지의 각 요소에 접근하고 조작하는 것을 더욱 쉽고 효율적으로 만들기 때문입니다. 예를 들어, 특정 노드를 찾아내거나 그 부모 노드나 자식 노드를 찾는 것 등이 가능해집니다.
<html>
요소가 루트 노드에 해당합니다.<div>
, <p>
, <a>
등의 HTML 태그가 요소 노드에 해당합니다.<a href="https://www.example.com">
에서 href
속성이 속성 노드에 해당합니다.<p>Hello, World!</p>
에서 "Hello, World!"가 텍스트 노드에 해당합니다.<!--
으로 시작하여 -->
으로 끝나는 형식으로 작성됩니다.DOM API(Document Object Model Application Programming Interface)의 약어로, DOM API를 사용하면, 웹 페이지의 요소들을 프로그래밍적으로 탐색하고, 수정하고, 추가하고, 삭제할 수 있습니다. 예를 들어, 특정 HTML 태그를 선택하거나, 요소의 텍스트 내용을 변경하거나, 새로운 요소를 생성하고 기존 요소에 추가하거나, 이벤트 리스너를 추가하여 사용자의 특정 행동에 반응하도록 설정할 수 있습니다.
remove
메서드를 호출하여 해당 요소를 제거할 수 있습니다.웹 브라우저에서 이벤트는 사용자 또는 브라우저 자체에 의해 발생하는 액션이나 발생을 말합니다. 예를 들어, 사용자가 웹 페이지에서 버튼을 클릭하거나, 마우스를 이동하거나, 키보드 키를 누르는 것은 모두 이벤트에 해당합니다. 또한 웹 페이지 로딩 완료, 이미지 로딩 완료 등도 이벤트에 해당합니다. 이러한 이벤트에 대응하여 특정 작업을 수행하려면 이벤트 핸들러 또는 이벤트 리스너를 사용합니다. 이벤트 핸들러는 특정 이벤트가 발생했을 때 호출되는 함수입니다.
Event | Description |
---|---|
load | 웹페이지나 스크립트의 로드가 완료되었을 때 |
unload | 웹페이지가 언로드될 때(주로 새로운 페이지를 요청한 경우) |
error | 브라우저가 자바스크립트 오류를 만났거나 요청한 자원이 존재하지 않는 경우 |
resize | 브라우저 창의 크기를 조절했을 때 |
scroll | 사용자가 페이지를 위아래로 스크롤할 때 |
select | 텍스트를 선택했을 때 |
Event | Description |
---|---|
keydown | 키를 눌렀을 때 이벤트가 발생 |
keyup | 누르고 있던 키를 뗄 때 이벤트가 발생 |
keypress | 키를 누른 상태에서 이벤트가 발생 |
Event | Description |
---|---|
click | 요소에 마우스를 클릭했을 때 이벤트가 발생 |
dbclick | 요소에 마우스를 더블클릭했을 때 이벤트가 발생 |
mousedown | 요소에 마우스 버튼을 누르고 있을 때 |
mouseup | 누르고 있던 요소에 마우스 버튼을 뗄 때 |
mousemove | 마우스를 움직일 때 (터치스크린에서 동작하지 않는다) |
mouseover | 마우스를 요소 위로 움직였을 때 (터치스크린에서 동작하지 않는다) |
mouseout | 마우스를 요소 밖으로 움직였을 때 (터치스크린에서 동작하지 않는다) |
mouserenter | 해당 요소에 마우스 커서를 올려다놓았을때 |
mouseleave | 해당 요소에 마우스 커서를 빼낼때 |
Event | Description |
---|---|
focus/focusin | 요소에 포커스가 이동되었을 때 이벤트 발생 |
blur/foucusout | 요소에 포커스가 벗어났을 때 이벤트 발생 |
Event | Description |
---|---|
dragstart | 사용자가 드래그를 시작할 때 발생합니다. 이 이벤트는 드래그되는 요소에서 발생합니다. |
drag | 요소가 드래그되는 동안, 매 350ms마다 한 번씩 발생합니다. 이 이벤트는 드래그되는 요소에서 발생합니다. |
dragend | 사용자가 드래그를 끝낼 때 발생합니다. 이 이벤트는 드래그가 끝난 요소에서 발생합니다. |
dragenter | 드래그하는 요소가 드롭 대상 요소로 들어갈 때 발생합니다. 이 이벤트는 드롭 대상 요소에서 발생합니다. |
dragover | 드래그하는 요소가 드롭 대상 요소 위에 있을 때, 매 350ms마다 한 번씩 발생합니다. 이 이벤트는 드롭 대상 요소에서 발생합니다. |
dragleave | 드래그하는 요소가 드롭 대상 요소를 벗어날 때 발생합니다. 이 이벤트는 드롭 대상 요소에서 발생합니다. |
drop | 드래그하는 요소가 드롭 대상 요소 위에서 드롭될 때 발생합니다. 이 이벤트는 드롭 대상 요소에서 발생합니다. |
Event | Description |
---|---|
input | input 또는 textarea 요소의 값이 변경되었을 때 contenteditable 어트리뷰트를 가진 요소의 값이 변경되었을 때 |
change | select box, checkbox, radio button의 상태가 변경되었을 때 |
submit | 사용자가 입력한 데이터를 서버로 전송하는 역할을 합니다. |
reset | 사용자가 입력한 모든 데이터를 지우고 양식을 처음 상태로 되돌립니다. |
어떠한 이벤트가 발생했을 때 이를 처리하는 함수를 이벤트 리스너 또는 이벤트 핸들러라고 한다.
<button onclick="alert('클릭!')">버튼</button>
let button = document.querySelector("button");
// 첫 번째 클릭 이벤트 핸들러를 추가합니다.
button.onclick = function () {
console.log("첫 번째 클릭 이벤트 핸들러");
};
// 두 번째 클릭 이벤트 핸들러를 추가합니다.
// 이 핸들러는 첫 번째 핸들러를 덮어쓰게 됩니다.
button.onclick = function () {
console.log("두 번째 클릭 이벤트 핸들러");
};
target.addEventListener(event, function, useCapture)
on
접두사가 포함되지 않는다는 점을 기억하는 것입니다. 예를 들어, onchange
대신 change
를 사용하세요. 일부 DOM 이벤트로는 click
, change
, drag
, copy
등이 있습니다.event
가 target
에서 발생하면 function
이 실행됩니다.true
또는 false
값을 갖는 부울 데이터 유형입니다. addEventListener
캡처 또는 버블링의 두 단계로 실행되고 useCapture
전파 단계를 설정합니다.useCapture
가 true
로 설정되면, 이벤트 핸들러는 캡처 단계에서 호출됩니다. 이는 이벤트가 상위 요소에서 하위 요소로 전파되는 동안에 이벤트 핸들러가 실행되는 것을 의미합니다. 반면에 useCapture
가 false
또는 지정되지 않으면, 이벤트 핸들러는 버블링 단계에서 호출됩니다. 이는 이벤트가 하위 요소에서 상위 요소로 전파되는 동안에 이벤트 핸들러가 실행되는 것을 의미합니다.이벤트 객체(Event Object)는 JavaScript에서 이벤트가 발생했을 때 이벤트에 대한 정보를 담고 있는 객체입니다. 이벤트 객체는 이벤트 핸들러 함수 내에서 자동으로 생성되며, 이벤트가 발생한 요소에 대한 정보와 해당 이벤트에 대한 세부 정보를 제공합니다. 이벤트 객체는 일반적으로 이벤트 리스너 함수의 첫 번째 매개변수로 전달됩니다.
click
, mouseover
, keydown
등이 있습니다. <div class="parent">
<input type="text" class="val">
<button id="btn">button</button>
</div>
// 이벤트 객체를 인자로 받는 함수를 정의합니다. 이 함수는 이벤트의 유형과 키 코드를 콘솔에 출력합니다.
function getEventType(e) {
console.log(e.type); // 이벤트의 유형을 출력합니다. 여기서는 'keyup' 이벤트입니다.
console.log(e.keyCode); // 키보드 이벤트에서 입력된 키의 코드를 출력합니다.
}
// '.val' 선택자를 사용하여 입력 상자 요소를 선택하고, 이를 inputBox 변수에 할당합니다.
let inputBox = document.querySelector(".val");
// inputBox 요소에 'keyup' 이벤트 리스너를 추가합니다. 이 이벤트가 발생하면 getEventType 함수가 호출됩니다.
inputBox.addEventListener("keyup", getEventType);
<div class="parent">
Parent
<div class="child">Child</div>
</div>
let parent = document.querySelector(".parent");
let child = document.querySelector(".child");
parent.addEventListener("click", function (event) {
console.log("target:", event.target); // 실제로 클릭된 요소를 출력합니다.
console.log("currentTarget:", event.currentTarget); // 이벤트 핸들러가 등록된 요소를 출력합니다.
});
event.target
은 실제로 클릭된 요소를 가리킵니다. 만약 child
요소를 클릭하면, event.target
은 child
요소를 가리키게 됩니다.event.currentTarget
은 이벤트 핸들러가 등록된 요소를 가리킵니다. 이 경우에는 parent
요소에 이벤트 핸들러가 등록되었으므로, event.currentTarget
은 항상 parent
요소를 가리키게 됩니다.<a href="<https://www.example.com>">클릭하세요!</a>
// HTML 요소 선택
let link = document.querySelector("a");
// 이벤트 핸들러 등록
link.addEventListener("click", function (event) {
// 링크 클릭에 대한 기본 동작 취소
event.preventDefault();
// 콘솔에 메시지 출력
console.log(
"기본 동작이 취소되었습니다. 이 링크는 어디로도 이동하지 않습니다."
);
});
<div class="outer"> <button>Click Me!</button> </div>
// HTML 요소를 선택합니다.
let button = document.querySelector("button");
let outerDiv = document.querySelector(".outer");
// 버튼에 클릭 이벤트 핸들러를 추가합니다.
button.addEventListener("click", function (event) {
alert("버튼이 클릭되었습니다!");
event.stopPropagation(); // 이벤트 전파를 중단합니다.
});
// 바깥 div에도 클릭 이벤트 핸들러를 추가합니다.
outerDiv.addEventListener("click", function () {
alert("바깥 div가 클릭되었습니다!");
});
버튼이 클릭되었습니다!
알림이 출력되고 이벤트 전파가 중단되어 바깥 div가 클릭되었습니다!
알림은 출력되지 않습니다.event.stopPropagation()
이 없었다면, 버튼 클릭 시에 버튼이 클릭되었습니다!
가 출력된 이후에 이벤트가 상위 요소로 전파되어 바깥 div가 클릭되었습니다!
도 출력되었을 것입니다.