브라우저 객체모델

2014. 11. 12. 11:30 나홀로스터디/JS For Web Dev


8장 브라우저 객체 모델

이 포스팅은 "프론트엔드 개발자를 위한 자바스크립트(2013 인사이트, 한선용 옮김)"에서 발췌 요약한 것입니다.
 
8.1 BOM의 핵심인 window 객체에 대한 이해
8.2 창과 프레임, 팝업 컨트롤
8.3 location 객체에서 얻는 페이지 정보
8.4 navigator 객체를 통한 브라우저 이해



8.1 window 객체
window 객체는 브라우저 창의 자바스크립트 인터페이스 구실을 하고 다른 한편으로는 ECMAScript Global 객체로 기능하며 window에 정의된 parseInt() 등의 메서드를 이용한다.


8.1.1 전역 스코프
window 객체가 ECMAScript의 Global 객체 구실을 하므로 전역에서 선언한 변수와 함수는 모두 window 객체의 프로퍼티 및 메서드가 된다.


8.1.2 창 사이의 관계와 프레임
페이지에 프레임이 들어있으면 각 프레임은 독자적인 window 객체를 가지며 이 객체들은 frames 컬렉션에 저장된다.
각 window 객체는 프레임의 name을 프로퍼티로 가진다.
top 객체는 항상 최상위(즉, 가장 바깥에 있는) 프레임을 가리키는데 이는 곧 브라우저 창이다.
window 객체 중에는 parent도 있는데 parent 객체는 항상 현재 프레임의 바로 상위인 부모 프레임이다.

최상위 window에는 name 프로퍼티 값이 존재하지 않는데 window.open() 메서드를 통해 창을 열었을 때는 예외다. self 객체는 항상 window를 가리키므로 window 객체는 self와 서로 바꿔서 써도 된다.

8.1.3 창의 위치
창의 위치를 가져오거나 설정하는 프로퍼티와 메서드도 다양한데 IE/Safari/Opera/Chrome은 모두 화면 왼쪽위에서 각각 얼마나 떨어졌는지를 나타내는 screenLeft/screenTop 프로퍼티를 지원한다.
FF는 이 기능을 screenX/screenY 프로퍼티로 지원하는데 Safari/Chrome도 이 프로퍼티를 지원한다.

var leftPos = (typeof window.screenLefr == "number") ? window.screenLeft : window.screenX;
var topPos = (typeof window.screenTop == "number") ? window.screenTop  window.screenY;

이 예제는 사용해도 브라우져마다 지원하는 위치값의 차이가 있기 때문에 일관적으로 구할 방법은 없다.
하지만 moveTo()/moveBy() 메서드로 정확한 위치로 옮기는 일은 가능하다. 각 메서드는 두개의 매개변수를 받는데 moveTo()는 이동할 x/y 좌표를 받고 moveBy()는 각 방향으로 몇 픽셀 이동할지 나타내는 숫자를 받는다.
브라우저에서 이 메서드를 금지할 가능성이 있다.


8.1.4 창 크기
창크기를 알아내는 방법은 IE9/FF/Safari/Opera/Chrome 모두 innerWidth, innerHeight, outerWidth, outerHeight 네가지 프로퍼티를 지원한다.
outerWidth, outerHeight 브라우저 창 크기를 반환하고  innerWidth, innerHeight 프로퍼티는 브라우저 창 내부의 페이지 뷰포트 크기를 나타낸다.
IE/FF/Safari/Opera/Chrome 에서 document.documentElement.clientWidthdocument.documentElement.clientHeight 프로퍼티는 각각 페이지 뷰포트의 너비와 높이를 나타낸다.

8.1.5 네비게이션과 열기
window.open() 메서드는 URL 로 이동한 후 브라우저 창을 새로 연다.
이 메서드는 이동할 URL, 대상 창, 기능을 나타내는 문자열, 새 페이지가 브라우저 히스토리에서 현재 페이지를 대체할지 나타내는 불리언 값 네가지 매개 변수를 받는데 일반적으로 세번째 매개변수까지만 사용하며 마지막 매개변수는 새 창을 열때는 적용되지 않는다.
window.open()의 두 번째 매개변수가 이미 존재하는 창이나 프레임 이름이라면 주어진 URL은 해당 이름의 창이나 프레임에서 열린다.

팝업창
두 번재 매개변수가 기존의 창/프레임 이름이 아니라면 세 번재 매개변수에 지정한 문자열로 새 창이나 탭을 생성하고 세번째 매개변수가 없다면 새 브라우져 창이 열리고 기본 브라우저 창 설정(툴바, 주소표시 줄, 상태 바 등)이 적용된다. 세 번째 매개변수는 새 창을 열 때에만 적용되고 새 창의 정보를 나타내는 쉼표로 구분된 문자열이다.

fullscreen = "yes" or "no" : 브라우저 창을 최대 크기로 생성할지 나타냄(IE전용)
height = 숫자 : 새창의 높이를 나타냄, 최소값은 100
left = 숫자 : 새 창의 x 좌표로 음수는 쓸수 없음
location = "yes" or "no" : 주소 표시줄을 표시할지 나타냄, 기본값은 브라우저에 따라 다름
menubar = "yes" or "no"  : 메뉴바를 표시할지 나타냄, 기본값은 "no"
resizable = "yes" or "no"  : 새 창의 테두리를 드래그해서 크기를 조절할수 있는지 나타냄, 기본값은 "no"
scrollbas = "yes" or "no"  : 새 창 컨텐츠가 뷰포트를 넘칠 때 스크롤을 허용할지 나타냄, 기본값은 "no"
status = "yes" or "no"  : 상태바를 표시할지 나타냄, 기본값은 브라우저에 따라 다름
toolbar = "yes" or "no"  : 툴바를 표시할지 나타냄, 기본값은 "no"
top = 숫자  : 새 창의 y 좌표, 음수는 쓸 수 없음
width = 숫자 : 새 창의 너비, 최소값은 100


이름- 값  쌍은 등호(=)로 구분하며 각 쌍은 공백을 포함할 수 없다.
window.open("http://www.wrox.com/","wroxWindow","height=400,width=400,top=10,left=10,resizable=yes");

팝업 차단
브라우저에 내장된 팝업 차단기가 동작했다면 window.open()은 대개 null을 반환한다.


8.1.6 인터벌과 타임아웃(setTimeout(), clearTimeout())
브라우저에서 자바스크립트는 단일 스레드로 실행되지만 타임아웃과 인터벌을 통해 코드가 특정 시간에 실행되게끔 조절할 수 있다.
타임아웃은 일정 시간 뒤에 코드를 실행하는 것이고, 인터벌은 일정 시간마다 코드를 반복 실행하는 것이다.
타임아웃은 window의 setTimeout() 메서드로 설정한다. 이 메서드는 매개 변수를 두 개 받는데 하나는 실행할 코드이고 하나는 코드를 실행할 때까지 기다리는 시간(밀리초)이다.
setTimeout()을 호출하면 해당 타임아웃의 숫자형 ID를 반환하고 대기중인 타임아웃을 취소하려면 다음 예제처럼 clearTimeout() 메서드에 타임아웃 ID를 넘긴다.

타임아웃으로 실행하는 코드는 항상 전역 스코프에서 실행되므로 함수의 this값은 스트릭트 모드가 아닐 때는 항상 window이고 스트릭트 모드에서는 항상 undefined이다.

인터벌은 타임아웃과 비슷하지만 페이지가 종료되거나 인터벌을 취소하기 전에는 일정한 시간마다 코드를 반복 실행한다는 점이 다르다. setInterval() 메서드로 인터벌을 설정하며 이 메서드는 setTimeout()과 같은 매개변수, 즉 실행할 코드(문자열 또는 함수)와 각 실행 사이에 대기할 시간을 밀리초로 받는다.
setInterval() 메서드 역시 인터벌 ID를 반환하며 clearInterval() 메서드는 이 ID를 매개변수로 받아 해당 인터벌을 취소한다. 인터벌을 취소하지 않으면 페이지가 떠 있는 동안 계속 실행되므로 인터벌 취소는 타임아웃 취소보다 중요하다.


8.1.7 시스템 대화상자
브라우저는 alert(), confirm(), prompt() 메서드를 통해 사용자에게 시스템 대화상자를 표시한다.
얼럿 대화상자는 일반적으로 에러처럼 사용자가 할수 있는 일이 없지만 반드시 알려야 할때 쓴다.
컨펌 대화상자는 확인과 취소버튼이 있어서 사용자가 선택할 수 있고, true 또는 false 불리언 값을 반환한다.
프롬프트 대화상자는 확인과 취소버튼 외에도 사용자가 데이터를 입력하는 텍스트 박스가 있다. prompt() 메서드는 매개변수를 두개 받는데 하나는 대화상자에 표시할 텍스트이며 하나는 텍스트 박스의 기본값(빈 문자열 가능)이다.

 

8.2 location 객체
location 객체는 현재 창에 불러온 문서 정보와 함께 일반적인 네비게이션 기능을 제공한다. location 객체는 window 의 프로퍼티인 동시에 document의 프로퍼티다. location은 현재 문서에 대한 정보를 갖고 있으며 URL 을 파싱해서 몇가지 조각으로 분리해 각각을 프로퍼티로 저장한다.


8.2.1 쿼리스트링 확장
URL 정보중 쿼리스트링은 다루기 쉬운 형태로 제공되지는 않으므로 쿼리스트링을 파싱해서 각 매개변수를 프로퍼티로 갖는 객체를 반환한다.


8.1.2 location 조작
다양한 방법으로 location 객체를 조작해서 페이지를 이동할 수 있다. 가장 많이 쓰이는 것은 assign() 메서드다.

location.assign("http://www.wrox.com"); 


이렇게하면 즉시 새 URL로 이동하며 브라우저의 히스토리 스택에 기록이 추가되는데 lacation.href이나 window.lacation에 URL을 지정하면 그 값으로 assign() 메서드를 호출한다.  헤이지를 이동하는 이 세가지 방법중에서 lacation.href을 설정하는 방법이 가장 자주 쓰인다.
location 객체의 프로퍼티를 변경하면 현재 페이지에도 영향이 있다. hash, search, hostname, port 프로퍼티를 변경하면 현재 URL에 새 값이 반영되며 새 URL로 페이지를 다시 읽는데 hash 프로퍼티를 바꿀 때는 예외이다.

 location.hash ="#section1";
 location.search = "?q=javascript";
 location.hostname = "www.yahoo.com";
 location.patname = "mydir"; 

이와 같은 방법으로 URL을 수정하면 브라우저의 히스토리 스택에 기록이 남아 사용자가 뒤로가기 버튼을 클릭해 이전 페이지로 돌아갈 수 있다. replace() 메서드를 쓰면 매개변수로 URL을 받아 이동하지만 히스토리 스택에 기록을 남기지 않기 때문에 뒤로가기 버튼을 클릭해 이전 페이지로 돌아갈 수 없다.

현재 위치를 다시 불러오는 reload() 메서드는 매개변수 없이 호출하면 페이지를 가능한 한 가장 효과적인 방법으로 다시 읽는다. 마지막 요청이후 페이지가 바뀌지 않았다면 브라우저 캐시에서 읽어오는데 서버에서 읽어오도록 강제하려면 true를 매개변수로 넘긴다.

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

reload() 호출 이후에 있는 코드는 네트워크 지연이나 시스템 자원 같은 요인의 영향으로 코드 마지막에 두는 것이 최선이다.

 


8.3 navigator 객체
navigator 객체의 프로퍼티는 일반적으로 웹 페이지를 실행중인 브라우저 타입을 판단하는데 사용한다.
브라우저에 따라 navigator 객체에서 지원하는 프로퍼티가 다르다.


8.3.1 플러그인 감지
스크립트로 가장 많이 탐지하는 것 중 하나는 브라우저에 특정 플러그인이 설치되어 있는지이다. IE 이외의 브라우저에서는 plugins 배열에서 이 정보를 얻을수 있다.

name - 플러그인 이름
description - 플러그인 설명
filename - 플러그인 파일 이름
length - 플러그인이 처리하는 마임 타입 숫자

일반적으로 name만 있으면 플러그인을 식별하기 충분하지만 항상 그렇지는 않다.


각 plugin 객체는 MineType 객체의 배열이기도 하며 대괄호 표기법으로 접근 가능하다. 각 Mime Type 객체에는 프로퍼티가 네개 있는데 마임 타입 설명인 description, plugin, 객체를 가리키는 포인터인 enablePlugin, 마임 타입의 파일 확장자를 쉼표로 구분한 문자열인 suffixes, 마지막으로 완전한 마임 타입 문자열인 type이다.


IE는 넷스케이프 스타일 객체를 지원하지 않으므로 플러그인 탐지가 어렵다. IE는 플러그인을 COM 객체로 구현했고 이들을 고유한 문자로 식별하기 때문에 hasIEPlugin() 함수로 IE 전용타입인 ActiveXObject를 사용해서 플러그인을 인스턴스화 하는 방법으로 플러그인 설치여부를 판단하는 함수를 만들수 있다.

plugins 컬렉션에는 refresh() 라는 메서드가 있는데 이 메서드는 새로 설치된 플러그인이 반영되도록 plusgins을 갱신한다. 이 메서드는 매개변수로 페이지를 새로고침해야 하는지 나타내는 불리언 값을 받는다.





8.3.2 처리기 등록
FF2는 navigator 객체에 registerContentHangler()와  regitorProtocalHandler() 메서드를 도입했다.
이 메서드는 웹사이트가 특정한 타입의 정보를 처리할 수 있음을 나타낸다.
registerContentHangler() 메서드는 처리할 마임타입, 해당 마임 타입을 처리할 페이지 URL, 애플리케이션 이름 세가지 매개변수를 받는다.
regitorProtocalHandler()은 처리할 프로토콜("mailto", "ftp" 등), 프로토콜을 처리할 페이지 URL, 애플리케이션 이름을 매개변수로 받는다. 




8.4 screen 객체
screen 객체 역시 window의 프로퍼티인데 이 객체에는 픽셀 너비와 높이 등 클라이언트 화면에 관한 정보가 들어있고 브라우저별로 screen 객체에서 지원하는 프로퍼티가 다르다.




8.5 historty 객체
history 객체는 창을 첫 번째 연 이후 사용자의 네비게이션 히스토리를 보관한다.
history는 window의 프로퍼티이므로 브라우저 창, 탭, 프레임은 각각 자신의 window 객체에 속한 history 객체를 가진다.

go() 메서드는 사용자의 이동 히스토리에서 앞으로 또는 뒤로 이동한다. 이 메서드는  매개변수로 이동할 페이지 수를 나타내는 하나의 정수를 받는데,음수를 받으면 히스토리에서 뒤로 이동하고 양수를 받으면 앞으로 이동한다.
매개변수로 문자열을 받는 경우 브라우저는 히스토리에서 해당 문자열을 포함한 첫 번째 위치로 이동한다.
go() 메서드 대신 단축 메서드인 back()forward() 메서드를 쓸수 있다.

history 객체의 length  프로퍼티는 history 스택에 기록이 얼마나 많이 있는지 나타낸다.

페이지의 URL이 바뀔 때마다 히스토리 스택에 새 기록이 추가된다. IE8 이상, Opera FF Safari3 이상, 크롬에서는  이 기록에 URL 해시가 포함되며 따라서 이들 브라우저에서 location.hash를 설정하면 히스토리 스택에 새 기록이 추가된다




 

'나홀로스터디 > JS For Web Dev' 카테고리의 다른 글

DOM  (0) 2014.12.08
클라이언트 감지  (0) 2014.11.20
함수 표현식  (0) 2014.10.23
참조타입  (0) 2014.10.17
객체에 대한 이해  (0) 2014.10.15
Copyright © HuckleberryM All Rights Reserved | JB All In One Designed by CMSFactory.NET