JavaScript

Working with DOM : Web Browser를 위한 JavaScript

jmeen 2021. 9. 1. 22:25
728x90

Working with DOM : Web Browser를 위한 JavaScript

 

웹 브라우저 대화상자

alert vs prompt vs confirm

alert : 가장 기본적인 웹 브라우저 대화상자

alert("Welcome!");

confirm : 사용자의 선택을 요청
- 반환값은 Boolean

var choice = confirm("Ready to go?");
console.log(choice);

prompt : 사용자 입력 값을 받음
- 취소시 null

var name = prompt("What is you name?");

 

HTML에 JavaScript 삽입하기

내부 JavaScript

script 태그 : HTML 문서 안에 JavaScript를 삽입
- script 태그는 HTML 문서 어디에서든 사용할 수 있음
- script 태그는 한 문서 안에 여러 개를 사용해도 상관 없음
- script 태그가 삽입된 위치에서 소스가 실행(순차 실행)

<!DOCTYPE html>
<html>
<head>
    <title>JavaScript Example</title>
    <script>
        var name = prompt("What is your name?");
    </script>
</head>
<body>
    <script>
        document.write("<p>Welcome, " + name + "</p>");
    </script>
</body>
</html>

외부 JavaScript 불러오기

script 태그의 src 속성을 이용, JavaScript 소스 파일 위치를 지정
- 복수 개의 HTML에서 공통적인 함수 등을 작성, 별도의 파일로 분리하고 HTML에서 불러오면 개별 HTML 페이지 내에 매번 JavaScript를 작성하지 않고도 동일 코드를 재사용할 수 있다.
- 프로젝트의 규모가 커질 수록 JavaScript를 HTML로부터 분리하는 것이 효율적

<!DOCTYPE html>
<html>

<head>
    <title>JavaScript Example</title>
    <script src="ask.js"></script>
</head>

<body>
    <script src="print.js"></script>
</body>

</html>

ask.js

var name = prompt("What is your name?");

print.js

document.write("<p>Welcome, " + name + "</p>");

 

Document Object Model

간단한 이해

HTML은 XML의 하위 집합
- XML과 같이 Contents, Attribute 등을 이용, 내용과 속성에 접근할 수 있다
- 단, XML처럼 강한 구속력이 작용하지는 않는다.
- HTML은 Document Object Model이라는 Tree 구조로 구성

 

Document Object Model
- 객체 지향 모델로서 구조화된 문서를 표현하는 형식 (위키피디아)
- 플랫폼/언어 중립적으로 구조화된 문서를 표현하는 W3C의 공식 표준

 

HTML 엘리먼트는 세 부분(여는 태그, 콘텐트, 닫는 태그)으로 구성
- 콘텐트가 없는 엘리먼트의 경우, 닫는 태그 없이 단독으로 사용하기도 함 : 예) <br/>
- 대부분 엘리먼트는 속성을 가지며 중첩이 가능함

 

속성(Attribute)
- 태그의 동작을 제어하기 위해 여는 태그 안에 사용되는 특수 용어
- 속성은 주로 속성명=속성값의 쌍으로 기술된다

 

id와 class 속성

HTML 태그는 id와 class를 가질 수 있다
- id와 class는 모든 태그가 가질 수 있는 공통 속성
- id: 페이지 내 유일한 요소 식별 값(페이지 내 유일해야 함)
- class: 페이지 내 동일 클래스를 가진 요소가 여럿 있을 수 있으며, 한 요소가 여러 클래스를 가질 수도 있음

document 객체

DOM을 다루는 브라우저 내장 객체

document 객체 : 웹 문서(HTML) 자체를 가리키는 DOM 요소

console.log(document.__proto__); // HTMLDocument

모든 자식 노드의 확인

console.log(document.children); // HTMLCollection

개별 자식 노드의 확인

console.log(document.childElementCount)
console.log(document.children[0]); // HTML Element

document에 내용 출력: document.write()

document.write("Welcome!");

DOM 요소에 접근하기

document 객체를 이용, DOM 요소에 접근할 수 있음
태그명을 이용한 DOM 요소 접근 : .getElementsByTagName()

document.getElementsByTagName("p");
// 문서 내 모든 p 태그를 검색 - HTMLCollection

id 속성을 이용한 DOM 요소 접근 : .getElementById()

document.getElementById("search");
// 문서 태그 중 id가 search인 요소를 검색

class 속성을 이용한 DOM 요소 접근 : .getElementsByClassName()

document.getElementsByClassName("section_footer");
// 문서 태그 중 section_footer 클래스를 포함한 요소를 검색

document 객체를 이용, DOM 요소에 접근할 수 있음
- Selector를 이용한 DOM 요소 탐색 : .querySelector(), .querySelectorAll()
- .querySelector() 메서드는 셀렉터 조건을 만족하는 첫 번째 HTMLElement를 반환
- .querySelectorAll() 메서드는 셀렉터 조건을 만족하는 HTMLCollection을 반환

document.querySelectorAll("div.words");
// 문서 내 words 클래스가 포함된 모든 div 노드 리스트를 반환

.querySelectorAll() 메서드는 NodeList를 반환 -> HTMLCollection과 거의 동일한 방식으로 사용 가능

 

 

태그 속성의 제어

getAttribute, setAttribute

HTMLElement 객체에서 속성을 가져오거나 수정하는 메서드

이벤트 리스너

Event와 EventListener

- Event : 웹 브라우저나 사용자가 행하는 어떤 동작.
예) 웹 페이지의 링크 누르기, 웹 브라우저가 페이지를 로드
- EventListener (이벤트 처리기) : Event가 발생했을 때 처리할 함수로 연결해주는 것

- 브라우저에서 이루어지는 모든 동작이 이벤트가 되는 것은 아니며 이벤트 리스너를 통해 처리 함수가 연결되어 있지 않으면 이벤트가 발생하더라도 아무 일도 일어나지 않음.
- 요소의 종류에 따라 발생시킬 수 있는 이벤트는 다를 수 있다.

 

DOM Event의 종류

마우스 이벤트

이벤트 리스너의 이름 : on + 이벤트명
예: click -> onclick

이벤트 설명
click 사용자가 요소를 마우스로 클릭했을 때
dbclick 사용자가 요소를 마우스로 두번 클릭했을 때
mousedown 사용자가 요소를 마우스 버튼을 누를 때
mousemove 사용자가 요소 위에서 마우스포인터를 움직일 때
mouseover 마우스 포인터가 요소 위로 올라올 때
mouseout 마우스 포인터가 요소 밖으로 벗어날 때
mouseup 사용자가 누르고 있던 마우스 버튼에서 손을 땔 때

 

키보드 이벤트

이벤트 설명
keypress 사용자가 키보드를 누를 때
keydown 사용자가 키보드를 눌렀을 때(누른 상태)
keyup 사용자가 키보드를 눌렀다 뗄 때(해제)

 

문서 로딩 이벤트(브라우저가 발생시키는 이벤트)

이벤트 설명
abort 웹 문서가 완전히 로딩되기 전, 불러오기를 멈췄을 때
error 문서가 정확히 로딩되지 않았을 때
load 문서 로딩이 완료되었을 때. 주로 초기화 작업에 활용
resize 문서 화면 크기가 바뀌었을 때
scroll 문서 화면에 스크롤이 발생했을 때
unload 문서를 벗어날 때

 

폼 이벤트 : 폼 입력 양식에서 발생하는 이벤트 // 이벤트 리스너의 이름 : on + 이벤트명

이벤트 설명
blur 폼 요소가 포커스를 잃었을 때
change 목록, 체크 상태 등이 변경되었을 때
focus 폼 요소에 포커스가 놓였을 때
reset 폼이 리셋되었을 때
submit submit 버튼을 눌렀을 때

 

 

태그에 이벤트 리스너를 붙이는 방법 

1. Inline 방식 – 추천하지 않음

<img src="Penguins.jpg" alt="펭귄" onclick="alert(this.alt);">

 

2. <script> 이용

<img id="pic" src="Penguins.jpg" alt="펭귄">
<script>
    var obj = document.getElementById("pic");
    obj.onclick = function (evt) {
        alert(evt.target.alt);
    }
</script>

3. .addEventListener 메서드를 이용 -> 가장 추천

<img id="pic" src="Penguins.jpg" alt="펭귄">
<script>
    function introduce(evt) {
        alert(evt.target.alt);
    }
    window.addEventListener("load", function () {
        var obj = document.getElementById("pic");
        obj.addEventListener("click", introduce, false);
    }, false);
</script>

 

 

동적으로 스타일 변경하기

HTMLElement의 style 객체를 이용하면 동적으로 요소의 스타일을 추가, 변경할 수 있다
- 단, CSS의 속성명과 JavaScript DOM style 객체의 변수명은 다를 수 있다(JavaScript 변수 명명 규칙)

<style>
    #box {
        width: 100px;
        height: 100px;
        background-color: red;
    }
</style>
<div id="box"></div>

CSS : kebab-case

<div id="box"></div>
<script>
    var box =
        document.getElementById("box");
    box.style.backgroundColor = "red";
    box.style.width = "100px";
    box.style.height = "100px";
</script>

JavaScript : camelCase

 

 

 

동적으로 요소 생성하기

DOM에 새로운 노드 추가하기

STEP 1. createElement로 새로운 요소 만들기
STEP 2. 새 요소에 속성과 내용 설정
STEP 3. 부모 요소에 Child로 추가(.appendChild)

<ul id="cart">
</ul>
<script>
    var items = ["김", "단무지", "햄"];
    var parent = document.getElementById("cart");
    for (var i = 0; i < items.length; i++) {
        var child = document.createElement("li");   	 // step 1
        child.innerText = items[i];    			// step 2
        parent.appendChild(child);			// step 3
    }
</script>

동적으로 요소 삭제하기

DOM에서 기존 요소 삭제하기
- parent에서 .removeChild() 메서드로 child 삭제

<ul id="cart">
    <li>김</li>
    <li>단무지</li>
    <li class="unwanted">시금치</li>
    <li>햄</li>
</ul>
<script>
    var parent = document.getElementById("cart");
    var items = document.getElementsByClassName("unwanted");
    for (var i = 0; i < items.length; i++) {
        var unwanted = items[i];
        parent.removeChild(unwanted);
    }
</script>

 

동적으로 요소 검사하기

.hasChildNodes() : 자식 노드가 있는지 확인

<ul id="cart">
    <li>김</li>
    <li>단무지</li>
    <li class="unwanted">시금치</li>
    <li>햄</li>
</ul>
<script>
    var parent = document.getElementById("cart");
    console.log(parent.hasChildNodes()); // true
</script>

.children : 자식 노드 요소 리스트에 접근

<ul id="cart">
    <li>김</li>
    <li>단무지</li>
    <li class="unwanted">시금치</li>
    <li>햄</li>
</ul>
<script>
    var parent = document.getElementById("cart");
    for (var i = 0; i < parent.children.length; i++) {
        console.log(parent.children[i]);
    }
</script>

동적으로 요소 추가하기

insertBefore() :
- 부모 노드에 자식 노드를 추가할 때 기준이 되는 노드를 지정하고 그 앞에 자식 노드를 추가

<ul id="cart">
    <li>김</li>
    <li>단무지</li>
    <li>햄</li>
</ul>
<script>
    var parent = document.getElementById("cart");
    var newItem = document.createElement("li");
    newItem.innerText = "시금치";
    parent.insertBefore(newItem, parent.children[0]);
</script>

 

폼 요소 검증

폼 요소에 접근하기

 1. id 값이나 class 값을 사용

<input id="nameField" type="text">
<button onclick="sayHello()">Say Hi</button>
<script>
    function sayHello() {
        var nameField = document.getElementById("nameField");
        alert("Hello, " + nameField.value);
    }
</script>

 2. name 속성 이용

<form name="loginForm">
    <input name="idField" type="text" />
    <input name="pwField" type="password" />
    <button onclick="checkForm();">로그인</button>
</form>
<script>
    function checkForm() {
        alert("ID:" + document.loginForm.idField.value);
        alert("PW:" + document.loginForm.pwField.value);
    }
</script>