BOM, DOM Object Model

2021. 12. 2. 10:46Study/JavaScript

브라우저 객체 모델 (Browser Object Model : BOM)

실제 우리가 사용하고 있는 브라우저와 관련된 객체의 집합이다.

대표적으로 window(최상위 객체), location, navigator, history, screen, document 객체가 있다.

 

window 객체 구조도

 

location Object 웹 링크, url에 관련된 객체
navigatior Object 브라우저의 탑재 메뉴들 관장
history Object 히스토리 관장
screen Object 윈도우 창, 사이즈 관장 (반응형 웹 관련)

 


 

window 객체

* 브라우저의 내장 객체 중 최상위 객체

* 모든 전역 객체, 함수, 변수는 자동적으로 window 객체에 속함

* 모든 전역 변수는 window 객체의 속성이 됨

* 모든 전역 함수는 window 객체의 메서드가 됨

* window를 생략한 형태로 window객체와 메서드 사용 가능

* 적용하기 위한 공식적인 웹표준은 없느나, 주로 브라우저들에서 지원되고 있음.

function aaa(){
  window.alert('안녕');
  var a = window.prompt('이름을 입력하세요','');
  window.alert(a); // a는 지역변수기 때문에 window. 을 쓰면 안된다
}

window.aaa();

 

윈도우 창 띄우기 (팝업창)

location yes, no, 1, 0 주소 입력창의 유무
menubar yes, no, 1, 0 메뉴의 유무
resizable yes, no, 1, 0 화면 크기 조절 유무
status yes, no, 1, 0 상태표시줄 유무
toolbar yes, no, 1, 0 툴바 유무
left, top 픽셀값 윈도우의 위치값
window.open('http://naver.com', 'win1', 'width=400, height=300, left=0, top=0');
window.close(); // 창 닫기

* 매개변수가 3개 들어감 : 주소, 제목, 옵션

* 지금은 잘 사용하지 않음

 

 

3초 후에 창 닫기

window.onload = function () {  // 윈도우가 로드될 때
  alert('3초후 이 페이지는 종료됩니다.');

    window.setTimeout(function () { // 3초 후에 함수를 1회 실행합니다.
    window.close();
  }, 3000);
};

 

 

 

screen 객체

* 윈도우의 사이즈를 핸들링한다.

* 운영체제의 화면에 대한 정보를 가지고 있는 객체

* window 객체의 한 부분으로써 window,screen 속성을 통해 접근 (window는 생략 가능)

* 방문자의 화면을 고려해 적당한 사이즈의 팝업창을 제공 가능

 

 

화면 크기와 같은 사이즈의 윈도우창을 띄움

var child = window.open('http://naver.com', 'win1', 'width=300, height=200');
var width = screen.width;

var height = screen.height;
child.moveTo(0, 0);
child.resizeTo(width, height);

 

 

 

location 객체

* 현재 URL에 대한 정보를 가지고 있는 객체

* window 객체의 한 부분으로써 window.location 속성을 통해 접근 (window는 생략 가능)

* a 태그를 대신해 사용할 수 있다.

location='http://naver.com';
location.href='http://nate.com';
location.replace('http://daum.net');
// 위 3가지가 같은 뜻이다

* 페이지 새로고침 : location.reload(); 또는 location.href=location.href;

 

 

 

 

navigator 객체

* 웹 문서를 실행하고 있는 브라우저에 대한 정보를 가지고 있는 객체

* window 객체의 한 부분으로써 window.navigator 속성을 통해 접근 (window는 생략 가능)

var infoBrowser;
infoBrowser = '브라우저의 이름 : ' + navigator.appName + '\n\n';
infoBrowser += '브라우저의 코드명 : ' + navigator.appCodeName + '\n\n';
infoBrowser += '브라우저의 버전 : ' + navigator.appVersion + '\n\n';
infoBrowser += '운영체제 환경 : ' + navigator.platform;
infoBrowser += '자바 사용 여부 : ' + navigator.javaEnabled();

console.log(infoBrowser);

 

 

 

 

history 객체

* 브라우저의 방문 기록(history)에 대한 정보를 가지고 있는 객체

* window 객체의 한 부분으로써 window.history 속성을 통해 접근 (window는 생략 가능)

* 사용자들의 사생활을 보호하기 위해, JavaScript를 통해 접근하는데 제한이 있음

back(); // 히스토리 리스트 안에서 이전 URL 로드(브라우저의 “뒤로 가기” 버튼 클릭)
forward(); //히스트로 리스트 안에서 다음 URL 로드(브라우저의 “앞으로 가기” 버튼 클릭)
go('http://naver.com'); // 히스토리 리스트의 특정 URL로 이동

 

 


 

 

문서 객체 모델 (Document Object Model : DOM)

태그의 계층이라고 생각하면 된다.

화면에서 일어나는 어떤 계층적인 태그의 구조

 

* 문서에 접근하기 위한 표준으로, W3C (world wide web consortium)에서 정의

* core DOM, XML, HTML DOM으로 나뉘어짐

* 웹 문서를 로드할 때, 브라우저는 구성 요소들을 객체화하여 트리 구조의 DOM을 생성

* HTML DOM은 HTML 구성요소들을 획득, 변경, 추가, 삭제하기 위한 표준

* HTML 문서를 브라우저에서 로드 시 각 구성요소들을 객체화하여 객체 드리 구조를 나타냄

 

 


 

 

document 객체

* HTML 문서와 관련있는 객체

* window 객체의 한 부분으로써 window.documet 속성을 통해 접근 (window는 생략 가능)

* 좁은 의미의 문서 객체 모델 : document 객체와 관련된 객체의 집합

* 로드된 문서에 단 하나의 document 객체 존재

* HTML 문서 객체 접근의 시발점

 

* 사용할 때 계산순서가 중요한데, html을 전부 로드한 후에 계산되어야 한다.

window.onload = function(){
     // body를 모두 load한 후에 이 스크립트를 실행해라.
     // onload 안에 스크립트를 넣을 경우, 스크립트 코드가 head에 있어도 마지막에 실행된다.
};

 

ex1. 요소 노드 생성, 텍스트노드 생성, 노드 연결

window.onload = function () {
  var header = document.createElement('h1'); // 요소 노드 생성
  var textNode = document.createTextNode('DOM-document Object Model'); // 텍스트 노드 생성
  header.appendChild(textNode);// 노드를 연결합니다.
  document.body.appendChild(header);
};

// createElement(tagName) 요소 노드를 생성
// createTextNode(text)  텍스트 노드 생성
// appendChild(node)  객체에 노드 연결

* 노드(계층) : 요소노드(태그의 계층)와 텍스트노드(텍스트)로 구분 됨

 

 

ex2. 문서 객체의 innerHTML 속성

* 해당 요소에 자식으로 문자화 된 태그를 실제 HTML로 처리해주는 속성
window.onload = function () {  /// 계산순서 맨 밑으로, html이나 css 관련 스크립트 있을 때
  var output = '';
  output += '<ul>';
  output += '<li>JavaScript</li>';
  output += '<li>jQuery</li>';
  output += '<li>Ajax</li>';
  output += '</ul>';

  document.body.innerHTML += output;  // html은 생략, += 안하고 = 하면 body내용 사라짐
  document.body.innerHTML += '<h2>document 객체</h2>';
};


// 배열과 반복문을 사용한 태그의 생성
window.onload = function () {  /// 계산순서 맨 밑으로, html이나 css 관련 스크립트 있을 때
  var output = '';
  var arr=['HTML', 'CSS', 'JavaScript', 'PHP', 'SQL'];

  output += '<ul>';
  for (var i=0; i<arr.length; i++){
  	output += '<li>' + arr[i] + '</li>';
  };
  output += '</ul>';

  document.body.innerHTML += output;
  document.body.innerHTML += '<h2>document 객체</h2>';
};

 

ex2-1. write() 메서드

* body에 있는것이 사라지기 때문에 권장하지 않음
window.onload = function () {
  document.write('<h1>웹사이트 제작</h1>');
  document.write('<p>웹사이트 제작를 제작해 봅시다</p>');
};

 

 

 


요소에 접근하기 (자바스크립트의 타겟팅)

 

하나의 요소 노드를 리턴하는 메서드

*document.method()
getElementById( ' 태그의 id ' ) 가장 많이 사용
querySelector( ' css선택자 ' ) ie8부터 지원, 일치하는 요소들 중 첫번째 요소만 리턴
* id, class 사용가능
특히 class 사용시 가장 첫 번째 요소만 리턴
거의 사용하지 않음

 

하나 혹은 그 이상의 요소를 리턴하는 메서드

*document.method()
객체배열로 처리된다.  (index 값이 들어가야 한다. [0])
getElementsByTagName( ' 태그명 ' )[0]  
getElementsByName( ' name값 ' )[0] 주로 form요소들에 사용
getElementsByClassName( ' 클래스명 ' )[0] ie9부터 지원
querySelectorAll( ' css선택자 ' )[0] ie8부터 지원

 


 

ex3. document.getElementById ( 'id' )

window.onload = function(){
  var header1 = document.getElementById('header_1'); // #header_1
  var header2 = document.getElementById('header_2');  // #header_2

  //문서 객체의 속성을 변경합니다.
  header1.innerHTML = '첫번째 타이틀 입니다.'
  header2.innerHTML = '두번째 계층의 타이틀 입니다.';
};
<h1 id="header_1">Heading 1</h1>
<h2 id="header_2">Heading 2</h2>
// 네비게이션
window.onload = function(){
  var header1 = document.getElementById('header_1');
  var header2 = document.getElementById('header_2');

  console.log(typeof(header1));
  var output = '';
  var arr=['HTML', 'CSS', 'JavaScript', 'PHP', 'SQL'];

  output += '<ul>';
  for (var i=0; i<arr.length; i++){
  	output += '<li><a href="./sub1/sub1_' + (i+1) + '.html">' + arr[i] + '</a></li>';
  };
  output += '</ul>';

  //문서 객체의 속성을 변경합니다.
  header1.innerHTML = output;

  header2.innerHTML = '두번째 계층의 타이틀 입니다.';
};

 

ex3-1. document.querySelector( 'css선택자' )

window.onload = function () {
  var head1 = document.querySelector('#head1');  // class 선택자 그대로 선택
  var head2 = document.querySelector('.head2');  // class 선택자 그대로 선택

  head1.innerHTML ='GOOD DAY';
  head2.innerHTML ='HAPPY DAY';
}
<h3 id="head1">좋은날</h3>     // head1 text node
<h3 class="head2">행복한날</h3>     // head2 text node

 

 

ex4. document.getElementsByTagName( '태그명' )

window.onload = function () {
  var headers = document.getElementsByTagName('h2');
  // 객체배열
  
  headers[0].innerHTML += '두번째 타이틀 1입니다';
  headers[1].innerHTML += '두번째 타이틀 2입니다';
};
<h2>Heading 2</h2>
<h2>Heading 2</h2>

 

 

ex4-1. document.getElementsByName( 'name값' )

window.onload = function () {
  var check = document.getElementsByName('check');
  document.body.innerHTML +='가져온 문서 객체의 수 : ' + check.length;
}
<input name="check" type="button" value="봄">
<input name="check" type="button" value="여름">

 

 

ex4-2. document.getElementsByClassName( '클래스명' )

window.onload = function () {
  var head = document.getElementsByClassName('head');

  head[0].innerHTML = '첫번째 타이틀';
  head[1].innerHTML = '두번째 타이틀';
  head[2].innerHTML = '세번째 타이틀';
}
<h2 class="head">헤딩1</h2>
<h2 class="head">헤딩2</h2>
<h2 class="head">헤딩3</h2>

 

 

ex4-3. document.querySelectorAll( 'CSS선택자, 태그명' )

window.onload = function () {
  var head = document.querySelectorAll('.head');

  head[0].innerHTML = '첫번째 타이틀';
  head[1].innerHTML = '두번째 타이틀';
  head[2].innerHTML = '세번째 타이틀';
}
<h2 class="head">헤딩1</h2>
<h2 class="head">헤딩2</h2>
<h2 class="head">헤딩3</h2>

 

 

'Study > JavaScript' 카테고리의 다른 글

setInterval, setTimeout, 현재시간표시  (0) 2021.12.03
JavaScript 문서 객체 조작  (0) 2021.12.03
Object 내장객체  (0) 2021.12.01
Object 사용자 정의 객체  (0) 2021.12.01
변수의 유효범위 scope  (0) 2021.11.30