# 브라우저 객체 모델(BOM)

  • 과거엔 브라우저마다 달랐음
  • HTML5에서 다루고 있으며, 표준화 되어가고 있다.
  • 5.2 The Window object
  • 5.5 Session history and navigation
  • 6.3 Dynamic markup insertion
  • 등등

Q: ECMA에서는 BOM을 다루지 않는가?

# 1. window 객체

브라우저 창의 JS 인터페이스 ECMA 스크립트 Global 객체로 기능

# 1.1 전역 스코프

전역에서 선언한 변수와 함수는 모두 window객체의 프로퍼티/메서드

var age = 29;
function sayAge(){
    alert(this.age) ;
}

alert(window.age); // 29
sayAge(); // 29
window.sayAge(); // 29

window를 생략해서 쓸 수 있다

window를 사용하지 않는 것과 사용하는 것이 약간의 차이 있음. window에 정의하는 경우 delete 연산자로 제거 가능

var age = 29;
window.color = "red"
// IE9 미만에서는 에러, 다른 브라우저에서는 모두 false 반환
delete window.age;
// IE9 미만에서는 에러, 다른 브라우저에서는 모두 true 반환
delete window.color;
alert(window.color); / / undefined

선언하지 않았을 가능성이 있는 변수의 존재 여부를 window 객체를 통해 확인 가능

// oldValue를선언한적 없으므로 에러가발생합니다
var newValue = oldValue ;

// 아래는프로퍼티 검색이므로 에러가발생하지 않습니다
// newValue는 undefìned로 설정됩니다
var newValue = window.oldValue;

# 1.2 창 사이의 관계와 프레임

<htm1>
    <head>
        <tit1e>Frameset Examp1e</tit1e>
    </head>
    <frameset rows="160,*">
        <frame src="frame.htm" name="topFrame">
        <frameset cols="50%, 50%">
            <frame src="anotherframe.htm" name="leftFrame">
            <frame src="yetanotherframe.htm" name="rightFrame">
        </frameset>
    </frameset>
</html>

프레임에 접근하는 다양한 방법

window.frames[O]
window.frames["topFrame"]
top.frames[O]
top.frames ["topFrame"]
frames[O]
frames["topFrame"]

top, parent, self 객체

# 1.3 창의 위치

창 위치를 판단하는 크로스 브라우저 코드 (IE, 오페라 vs 파이어폭스, 사파리/크롬은 양쪽 지원)

var leftPos = (typeof window.screenLeft "number") ? window.screenLeft : window.screenX;
var topPos = (typeof window.screenTop "number") ? window.screenTop : window.screenY;
// 창을 왼쪽 위 구석으로 옮깁니다
window.moveTo(0,0);
// 창을 아래쪽으로 100 픽셀 옮깁니다
window.moveBy(0, 100);
// 창을 (200, 30이으로 옮깁니다
window.moveTo(200, 300);
// 창을 왼쪽으로 50 픽셀 옮깁니다
window.moveBy(-S0, 0);

# 1.4 창 크기

outerWidth, outerHeight : 창 크기 innerWidth, innerHeight : 테두리, 툴바 포함되지 않은 창 크기

IE8에서는 DOM을 사용해서 알아냄 document.documentElement.clientWidth : 뷰포트 너비 document.documentElement.clientHeight : 뷰포트 높이

모바일에서는 창크기와 뷰포트의 값이 동일함 레이아웃 뷰포트는 또 다른 개념. 렌더링 된 페이지의 크기를 알 수 있음

// 1OOx1OO으로 변경
window.resizeTo(100,100);
// 1OOx1OO에서 200x150으로 변경
window.resizeBy(200,150);
// 300x300으로 변경
window.resizeTo(300,300);

# 1.5 내비게이션과 열기

window.open() : 새 창 열기

window.open("http://www.wrox.com/" , "topFrame");
// _self, _parent, _top, _blank 등도 쓸 수 있음

window.open("http://www.wrox.com/", "wroxWindow","height=400,width=400, top=10, left=10, resizable=yes");
// 다양한 매개변수 지정 가능 : width,height,left,location,menubar,resizable, scrollbars, status

// 창 닫기
wroxWin.close();

보안상 제한과 팝업 차단을 가정해서 작업해야 함

# 1.6 인터벌과 타임아웃

// 이렇게 하변 안됩니다 : 성능이 떨어진다
setTimeout("alert(’Hello world!’)", 1000);

// 이렇게하십시오
setTimeout(function() {
    alert("Hello world!");
}, 1000);

큐에 등록된 작업을 취소하려면 다음과 같이

// 타임아웃설정
var timeoutId = setTimeout(function() {
    alert ("Hello world!");
}, 1000);

// 타임아웃취소 : 실행전에만 취소 가능
clearTimeout(timeoutId);

setInterval 도 유사함, setTimeout으로 대체 가능하기 때문에 잘 쓰지 않음

# 1.7 시스템 대화상자

alert(), confirm(), prompt() window.print(); // 인쇄 window.find(); // 찾기

# 2 location 객체

DOM 객체 이기도 함 window.location은 document.location과 동일함

location 프로퍼티 들

  • hash : URL 해시(#)
  • host : 서버 이름과 포트 변호(있다면)
  • hostname : 포트번호를 제외한 서버이름
  • href : 현재 페이지의 완전한 URL
  • pathname : URL에 포함된 디렉터리 및 파일 이름
  • port : 포트번호
  • protocol : 페이지에서 사용하는 프로토콜 ex)http:, https:
  • search : URL의 쿼리 스트링 부분

# 2.1 쿼리스트링 확장

location.search 프로퍼티가 URL의 물음표 다음을 반환하긴 하지만, 쿼리스트링 매개변수를 하나씩 분리해서 제공하지는 않습니다. 그래서 파싱해서 사용해야 함

// 쿼리스트링이 ?q=Toby&num=10 라고가정합니다
var args = getQueryStringArgs();

alert(args["q“]); // "Toby"
alert(args["num"]); // "10"

# 2.2 location 조작

location.assign("http://lezhin.com"); // 페이지 이동
window.location = "http://lezhin.com";
location.href = "http://lezhin.com";

location.reload() ; // 가능하면 캐시에서
location.reload(true); // 항상 서버에서

# 3 navigator 객체

navigator 객체 프로퍼티

  • appCodeName
  • appMinorVersion
  • appName : 완전한브라우저 이름
  • appVersion : 브라우저 버전
  • buildID
  • cookieEnabled
  • cpuClass
  • javaEnabled()
  • language
  • mimeTypes
  • onLine
  • oscpu
  • platform
  • plugins
  • preference()
  • product
  • productSub
  • userAgent : 브라우저 문자열
  • userLanguage
  • userProfile
  • vendor
  • vendorSub

# 3.1 플러그인 감지

// 플러그인 탐지 - IE에서는 동작하지 않습니다
function hasPlugin(name){
    name = name.toLowerCase();
    for (var i=0; i < navigator.plugins.length; i++){
        if (navigator.plugins[il.name.toLowerCase().indexOf(name)
            return true;
        }
    }
    return false;
}
// 플래시를찾음
alert(hasPlugin("Flash"));

// 퀵타임을찾음
alert(hasPlugin("QuickTime")) ;

IE는 예외처리해서 찾도록 함

# 3.2 처리기등록

HTML5에서 되살아난 registerContentHandler()와 registerProtocolHandler() 메서드

# registerContentHandler()

웹사이트가 특정한 마임 타입의 정보를 처리할 수 있음

// 어떤 사이트를 RSS 피드 처리기로 등록하기
navigator.registerContentHandler("application/rss+xml","http://www.somereader.com?feed=%s" , "Some Reader");

# registerProtocolHandler()

웹사이트가 특정한 프로토콜의 정보를 처리할 수 있음 ("mailto" , "ftp" 등)

# 4 screen 객체

픽셀 너비와 높이 등 클라이언트 화면에 관한 정보 많은 브라우저에서 이 기능을 제한하므로 이 코드는 동작하지 않을때가 많음

screen.width, screen.height 정도 사용함 iOS, Android 갱신 방식 다름

# 5 history 객체

// 한페이지 뒤로
history.go(-1) ;

// 한페이지 앞으로
history.go(1) ;

// 두페이지 앞으로
history.go(2);

// 한페이지 뒤로
history.back() ;

// 한페이지 앞으로
history.forward();

if (history.length == 0){
  // 시용자가 이 페이지를 처음으로 열었을 때 실행할 코드
}