정적인 웹페이지에 자바스크립트를 사용하면 동적으로 만들 수 있다.
- 웹 페이지의 Document 객체 제어(HTML, CSS 작업)
- 웹 페이지의 Window 객체 제어 및 브라우저 제어
- 웹 페이지에서 발생하는 이벤트 처리
- HTTP를 이용한 통신 제어
최신 웹 브라우저에서는 다음과 같은 기능을 제공한다.
- 파일 읽기와 쓰기
- 데이터베이스 기능
- 비동기 통신
- 2,3차원 그래픽 등등..
이전까지는 자바스크립트의 속도가 매우 느렸으나, 크롬과 파이어폭스가 실행 중에 JS코드를 컴파일하는 JIT 컴파일러 (Just In Time Compiler)
를 도입하면서 빠른 실행 속도를 구현했다.
1. script 요소의 내용물로 작성하기 (인라인 스크립트)
<script>
console.log("Hello"); // JS 코드
</script>
2. 외부 파일 읽어 들이기 (외부 스크립트)
<script src="../scripts/sample.js"></script>
3. 이벤트 처리기 속성에 작성하기
<input type="button" value="click" onclick="console.log('Hello!');">
4. JavaScript : URL (자바스크립트 의사 프로토콜)
<a href="javascript:console.log('I\'m pretty good!');">What's going on?</a>
최근에는 자바스크립트 코드에서 3번, 4번을 거의 사용하지 않는다. 이벤트 처리기를 등록할 때는 3번 대신 addEventListener
메서드를 사용한다.
웹 브라우저에서 HTML문서를 분석하고 표시하는 프로그램을 렌더링 엔진
이라고 한다. 렌더링 엔진
은 다음과 같은 처리 과정을 거쳐 HTML 문서의 구문을 분석하고 DOM 트리를 구축한 후에 JS코드를 실행한다.
- 웹 브라우저로 웹 페이지를 열면 가장 먼저
Window 객체
가 생성된다.
Document 객체
가Window 객체
의 프로퍼티로 생성되며 웹 페이지를 해석해서DOM 트리
의 구축을 시도한다.Document 객체
는 readState 프로퍼티를 가지고 있고 초깃값은loading
이라는 문자열이다.
- HTML문서는 HTML구문을 작성 순서에 따라 분석하며
Document 객체
요소와 텍스트 노드를 추가한다.
- HTML문서 안에
script
요소가 있으면script
코드의 구문을 분석하고 그 결과 오류가 발생하지 않으면 그 시점에 코드를 실행한다.script
코드가 실행할 때는 HTML문서의 구문 분석이 일시적으로 멈추고script
코드가 완료하면 다시 HTML문서 구문 분석을 실행한다 (script
요소는 동기적)
- HTML문서의 모든 내용을 읽고 DOM 트리 구축을 완료하면
document.readState
프로퍼티 값이interactive
로 바뀐다.
- 웹 브라우저는
Document 객체
에 DOM트리 구축 완료를 알리기 위해DOMContentLoaded 이벤트
를 발생시킨다.
- 이 시점에 img 등 외부 리소스를 읽어들인다.
- 모든 리소스를 읽어 들인 후에는
document.readState
프로퍼티 값이complete
로 바뀐다. 그리고 웹 브라우저는 Window 객체를 상대로load 이벤트
를 발생시킨다.
- 이 시점부턴 다양한 이벤트(사용자 정의, 네트워크 이벤트)를 수신하고 발생하면 이벤트 처리기가 비동기로 호출된다.
async와 defer 속성
script 요소의 논리 속성으로 HTML5부터 추가된 속성이다. 이 속성들을 사용하면 자바스크립트 코드를 실행할 때 HTML구문 분석을 막지 않는다.
<script async src="../scripts/sample.js"></script>
<script defer src="../scripts/sample.js"></script>
async
defer
ECMAScript 5를 지원하지 않는 오래된 웹 브라우저에서도 문제없이 웹 페이지를 표시하고 같은 기능을 사용할 수 있도록 대응하는 작업을 크로스 브라우징 대책
이라고 한다.
이런 방법들이 있구나 정도로 생각하면 될 것 같다.
클라이언트 측 자바스크립트에서 가장 중요한 객체는 Window
객체이다. 전역 객체이고 전역 변수는 Window 객체의 프로퍼티이다.
Window 객체의 주요 프로퍼티
프로퍼티 | 설명 |
---|---|
screen | Screen 객체를 가리킨다. |
document | Document 객체를 가리킨다. |
location | Location 객체를 가리킨다. |
navigator | Navigator 객체를 가리킨다. |
parent | 해당 창이 프레임 안의 창이면 부모 window 객체를 가리킨다. |
closed | 현재 창이 닫혀 있는지를 뜻하는 논리값. |
screenX, screenY | 화면의 왼쪽 윗부분을 기준으로 수평위치와 수직 위치. |
innerHeight, innerWidth | 창 안쪽의 높이와 너비(스크롤 영역은 제외). |
outerHeight, outerWidth | 창 바깥의 높이와 너비(스크롤 영역 포함). |
scrollX, scrollY | 수평 방향과 수직 방향으로 HTML 문서가 스크롤되는 픽셀의 수. |
Window 객체의 주요 메서드
메서드 | 설명 |
---|---|
alert(message) | 경고 대화상자를 표시. |
prompt(message, default) | 입력 대화상자를 표시. |
confirm(question) | 확인 대화상자를 표시. |
setTimeout(callback, interval) | interval마다 callback을 호출. |
setInterval(callback, delay) | delay후에 callback을 호출. |
blur() | 창에서 포커스를 제거. |
focus() | 창에 포커스를 준다. |
moveBy(x,y) | 창을 수평으로 x, 수직으로 y만큼 이동. |
moveTo(x,y) | 창을 좌표 (x,y)로 이동. |
resizeBy(width, height) | 창의 너비를 width, 높이를 height만큼 키운다. |
resizeTo(width, height) | 창의 너비를 width, 높이를 height로 설정한다. |
Location 객체의 프로퍼티
프로퍼티 | 설명 | 예 |
---|---|---|
hash | 앵커 부분 | #anchor |
host | 호스트 이름 : 포트번호 | www.example.com:80 |
hostname | 호스트 이름 | www.example.com |
href | 전체 URL | http://www.example.com:80/test/index.html?q=value#anchor |
pathname | 웹 사이트의 루트를 기준으로 한 상대 경로 | /test |
protocol | 프로토콜 | http: |
search | 질의 문자열 | ?q=value |
Location 객체의 메서드
메서드 | 설명 |
---|---|
assign(url) | url이 가리키는 문서를 읽는다. 웹 브라우저의 이력에 남는다. |
reload() | 문서를 다시 읽어 들인다. |
replace(url) | url로 이동한다. 웹 브라우저의 이력에 남지 않는다. |
toString() | location.href 값을 반환한다. |
Location 객체의 사용 예
location.href = "http://www.gulbut.co.kr/";
location.assign("http://www.gulbut.co.kr/");
location.replace("http://www.gilbut.co.kr/");
setTimeout(function () {
location.replace("/book/bookList.aspx");
}, 3000);
location.reload();
location.hash = "#header"; // id = "header"인 요소로 스크롤
location.search = "some data"; // URL 끝에 "?some%20data"를 덧붙여 서버에 보낸다
history.back(); // 웹페이지 열람 이력 하나 되돌아가기
history.forward(); // 웹페이지 열람 이력 하나 진행하기
history.go(-3); // 웹 페이지 열람 이력 세 개 되돌아가기
history.go(2); // 웹 페이지 열람 이력 두 개 진행하기
history.pushState(null, null, "page2.html");
// pushState의 인수는 3가지가 있다.
// state : 새롭게 추가되는 웹 페이지 열람 이력과 연결할 객체
// title : 새로운 열람 웹 페이지 이력을 가리키는 문자열
// url : 새로운 열람 이력의 URL
Navigator 객체는 스크립트가 실행 중인 웹 브라우저 등의 애플리케이션 정보를 관리한다.
Navigator 객체의 주요 프로퍼티
프로퍼티 | 설명 |
---|---|
appCodeName | 웹 브라우저의 내부 코드 네임. 정확하지 않음 |
appVersion | 웹 브라우저의 버전. 정확하지 않음 |
onLine | 웹 브라우저가 네트워크에 연결되어 있는지를 뜻하는 논리값 |
Navigator 객체의 주요 메서드
메서드 | 설명 |
---|---|
javaEnabled() | Java를 사용할 수 있는지를 뜻하는 논리값 반환 |
getUserMedia() | 단말기의 마이크와 카메라에서 audio와 video 스트림을 반환 |
Screen 객체는 화면 크기와 색상 등의 정보를 관리한다.
Screen 객체의 주요 프로퍼티
프로퍼티 | 설명 |
---|---|
availTop, availLeft | 사용할 수 있는 화면의 첫 번째 픽셀의 y, x좌표 |
availHeight, availWidth | 사용할 수 있는 화면의 높이, 너비 |
orientation | 화면 방향 |
위의 표에 나와있는 "사용할 수 있는 화면"이란 작업 표시줄 등을 제외한 나머지 부분을 뜻한다.
Screen 객체를 사용하면 스마트폰 등의 작은 화면에 표시할 때 작은 글꼴, 작은 화면을 표시할 떄 사용할 수 있다.
Document 객체는 창에 표시되고 있는 웹 페이지를 관리한다. Document 객체는 클라이언트 측 자바스크립트에서 가장 중요한 객체이다.
Document 객체의 주요 프로퍼티
프로퍼티 | 설명 |
---|---|
characterSet | 문서에 적용된 문자 인코딩(읽기전용) |
cookie | 문서의 cookie를 쉼표로 연결한 문자열 |
domain | 문서의 도메인(읽기전용) |
lastModified | 문서를 마지막 수정한 날(읽기전용) |
referrer | 문서에 링크된 페이지 URL |
title | 문서 제목 |
URL | 문서 URL(읽기 전용) |
Document 객체의 주요 메서드
메서드 | 설명 |
---|---|
close(), open() | 문서를 닫거나 연다 |
write(text) | 문서를 쓰기 위해 연다 |
웹 브라우저는 일반적으로 여러 개의 창과 탭을 표시한다. 각각의 창과 탭은 별도의 브라우징 컨텍스트
(사용자에게 표시되는 환경)를 제공한다.
// 창 열때
var w = open(url, 창의 이름, 옵션);
// 창 닫을 때
w.close();
open 메서드의 인수
open 메서드로 설정할 수 있는 옵션의 이름
옵션의 이름 | 설명 |
---|---|
width, height | 창 너비, 창 높이 |
location | 주소 표시줄 표시 여부(yes or no) |
scrollbars | 스크롤 막대 표시 여부(yes or no) |
resizable | 창 크기 변경 가능 여부(yes or no) |
toolbar | 도구 모음 표시 여부(yes or no) |
status | 상태 표시줄 표시 여부(yes or no) |
menubar | 메뉴 막대 표시 여부(yes or no) |
open 메서드로 연 창은 위치와 크기를 바꾸거나 스크롤 할 수 있다.
위치 변경 moveBy
, moveTo
메서드 사용
w.moveBy(10, 20);
w.moveTo(100, 150);
크기 변경 resizeBy
, resizeTo
메서드 사용
w.resizeBy(10, 20);
w.resizeTo(200, 150);
스크롤 표시 scrollBy
, scrollTo
메서드 사용
w.scrollBy(0, 100); // 아래쪽으로 100px 스크롤
w.scrollTo(0, 0); // 시작 위치로 이동