리자

[펌] 웹브라우저 창, 화면에 대한 정보 얻기

http://cafe.naver.com/ArticleRead.nhn?clubid=10346911&articleid=125480&menuid=205&boardtype=L&page=1


창 위치와 크기

 대부분의 브라우저들은 브라우저 창의 크기와 위치에 관한 정보를 담은 간단한

 프로퍼티 집합을 Window 객체를 통해 제공한다.(단, IE는 예외)

 

 // 데스크탑에 띄운 브라우저 창의 전체 크기

 var windowWidth = window.outerWidth;

 var windowHeight = window.outerHeight;

 

 // 데스크탑에 띄운 브라우저 창의 위치

 var window = window.screenX

 var window = window.screenY

 

 // HTML 문서가 표시되는 화상 표시 영역인 뷰포트(viewport)의 크기

 // 이것은 브라우저 창 크기에서 메뉴바, 툴바, 스크롤바 등의 크기를 뺀 나머지

 var viewportWidth = window.innerWidth;

 var viewportHeight = window.innerHeight;

 

 // 다음의 값들은 수평, 수직 스크롤바의 위치를 나타내며, 문서 좌표와 창

 // 좌표를 상호 변환하는데 사용된다. 이 값들은 화면의 좌측 상단

 // 모서리에 문서의 어느 부분이 위치하는지 나타낸다.

 var horizontalScroll = window.pageXOffset;

 var verticalScroll = window.pageYOffset;

 

 위의 프로퍼티들은 모두 읽기 전용이다.

 

 또한 반드시 숙지해 두어야 할 몇가지 좌표계들이 있다. 화면좌표(screen

 coordinates)는 데스크탑 상에서 브라우저 창이 떠 있는 곳의 위치를

 나타내며 데스크탑의 좌측 상단 모서리에서 상대적으로 계산된다. 창 좌표

 (window coordinates)는 웹 브라우저의 뷰포트(viewport, 화상 표시 영역)

 안의 위치를 나타내며 뷰포트의 좌측 상단 모서리에서 상대적으로 계산된다.

 문서 좌표(document coordinates)는 HTML 문서 안의 위치를 나타내며

 문서의 좌측 상단 모서리에서 상대적으로 계산된다. 만약 (웹 페이지들이

 종종 그러듯이) 문서가 화면 표시 영역보다 길거나 넓다면 문서 좌표와

 창 좌표는 일치하지 않는다 이 경우에 문서 좌표와 창 좌표를 서로 변환하기

 위해 스크롤바의 위치를 고여해야 한다.

 

 IE의 Window 객체에는 위의 프로퍼티들이 없다. 몇몇 이유로 IE는 이러한

 창 위치와 크기 관련 프로퍼티들을 HTML문서의 <body> 부분에 두었다.

 더 혼란스러운 점은, IE 6에서 <!DOCTYPE> 선언부가 있는 문서를 출력

 할 때 이 프로퍼티들을 document.body 대신 document.documentElement

 엘리먼트에 둔다는 것이다.

 

브라우저 종류에 관계없이 창 위치와 크기 알아내기 모듈

 

/**

 * Geometry.js : 창, 문서의 위치와 크기를 알기 위한 이식 가능한 함수들

 * getWindowX/Y() : 화면 상에서 브라우저 창이 띄워진 위치를 반환.

 * getViewportWidth/Height() : 브라우저의 뷰포트 영역의 크기 반환.

 * getDocumentWidth/Height() : 문서의 크기를 반환.

 * getHorizontalScroll() : 수평 스크롤바의 위치를 반환.

 * getVerticalScroll() : 수직 스크롤바의 위치를 반환.

 * 브라우저의 종류에 상관없이 브라우저 창의 크기를 반환하기 위한

 * 방법은 존재하지 않는다. 따라서 getWindowWidth/Height() 함수가

 * 빠져있음을 주의.

 * 이 모듈들은 문서의 <head> 부분 대신 <body> 부분에 포함되어야 함.

 */

 

 var Geometry = {};

 

 if (window.screenLeft === undefined) { // IE

     Geometry.getWindowX = function() { return window.screenLeft; };

     Geometry.getWindowY = function() { return window.screenTop; };

 }

 else if (window.screenX) { // 파이어폭스

     Geometry.getWindowX = function() { return window.screenX; };

     Geometry.getWindowY = function() { return window.screenY; };

 }

 

 if (window.innterWidth) { // IE를 제외한 모든 브라우저

     Geometry.getViewportWidth = function() { return window.innerWidth; };

     Geometry.getViewportHeight = function() { return window.innerHeight; };

     Geometry.getHorizontalScroll = fucntion() { return window.pageXOffset; };

     Geometry.getVerticalScroll = function() { return window.pageYOffset; };

 }

 else if (document.documentElement && document.documentElement.clientWidth) {

     // 이들 함수는 DOCTYPE이 존재할 때의 IE 6을 위한 것.

     Geometry.getViewportWidth =

            fucntion() { return document.documentElement.clientWidth; };

     Geometry.getViewportHeight =

            function() { return document.documentElement.clientHeight; };

     Geometry.getHorizontalScroll =

            function() { return document.documentElement.scrollLeft; };

     Geometry.getVerticalScroll =

            function() { return document.documentElemnet.scrollTop; };

 }

 else if (document.body.clientWidth) {

      // 이들은 IE4, IE5 그리고 DOCTYPE이 없을때의 IE6을 위한 것.

      Geometry.getViewportWidth =

            function() { return document.body.clientWidth; };

      Geometry.getViewportHeight =

            function() { return document.body.clientHeight; };

      Geometry.getHorizontalScroll =

            function() { return document.body.scrollLeft; };

      Geometry.getVerticalScroll =

            function() { return document.body.scrollTop; };

 }

 

 // 이들 함수는 문서의 크기를 반환한다. 브라우저 창과 직접적으로

 // 관련은 없지만, 이곳에 함께 정의하여 두는 것이 유용하다.

 if (document.documentElement && document.documentElement.scrollWidth) {

      Geometry.getDocumentWidth =

            function() { return document.documentElement.scrollWidth; };

      Geometry.getDocumentHeight =

            function() { return document.documentElement.scrollHeight; };

 }

 else if (document.body.scrollWidth) {

      Geometry.getDocumentWidth =

            function() { return document.body.scrollWidth; };

      Geometry.getDocumentHeight =

            function() { return document.body.scrollHeight; };

 }

 

Screen 객체

 Window 객체의 screen 프로퍼티는 사용자의 디스플레이 해상도와 표현 가능한

 색 수 등의 정보를 담은 Screen 객체를 가리킨다. width와 height 프로퍼티는

 디스플레이의 크기를 픽셀단위로 나타낸다. 예를들어 문서 안에 포함될 이미지의

 크기를 결정하는 데 이들 프로퍼티 정보를 유용하게 참고할 수 있다.

 

 availWidth와 availHeight 프로퍼티들은 실제로 사용할 수 잇는 디스플레이의

 크기를 지정한다. 이 크기에는 데스크탑의 작업 표시줄 등에 의해 사용되는

 공간이 제외되어 있다. 파이어폭스 같은 브라우저들의(IE는 예외) Screen

 객체에는 availLeft와 availTop 프로퍼티 들이 추가로 정의되어 있는데, 이들

 프로퍼티는 화면에서 사용할 수 잇는 첫번째 위치를 가리킨다. 만약 새 브라우저

 창을 여는 스크립트에서 이 창을 화면의 중앙에 놓이도록 하기 위해 이들

 프로퍼티를 활용할 수 있다.

 

Navigator 객체

 Window 객체의 navigator 프로퍼티는 Navigator 객체를 가리키는데, 이 객체는

 브라우저 버전, 출력 가능한 데이터 포맷들의 목록 등 웹 브라우저 전반에 대한

 정보를 담고 있다. 과거에는 스크립트가 IE에서 실행되는지 혹은 넷스케이프에서

 실행되는지 확인하기 위해 Navigator 객체가 널리 사용되었다. 이러한 브라우저

 탐지(browser-sniffing) 접근 방식은 기존 브라우저들의 새 버전이 발표될

 때마다 끊임없이 수정해야하기 때문에 문제의 소지가 있으며, 최근에는 그 대신

 기능 테스트(capability-testing) 접근 방식을 더 선호한다. 특정 브라우저와

 그 브라우저의 기능을 가정하는 대신, 단순히 필요로 하는 기능(예를들면

 메서드)의 존재를 테스트하는 것이다. 예를 들어 이벤트 처리기 등록 메서드들과

 관련하여 기능 테스트 접근 방식을 사용하는 방법은 다음과 같다.

 

 if (window.addEventListener) {

      // 만약 addEventListener() 메서드가 지원된다면 이를 사용.

      // 넷스케이프, 모질라, 파이어폭스 등의 표준을 따르는 브라우저

 else if (window.attachEvent) {

      // 만약 attachEvent() 메서드가 존재한다면 이를 사용.

      // 표준을 모방한 IE와 다른 비표준 브라우저

 }

 else {

     // 다른경우에는 사용 가능한 메서드가 없음

     // DHTML을 지원하지 않는 오래된 브라우저

 }

 

 하지만 특정 브라우저의 특정 버전에만 존재하는 버그를 해결하려 한다면

 브라우저 탐지 접근 방식이 여전히 유용하다.

 

 Navigator 객체에는 실행 중인 브라우저의 버전 정보를 제공하려는 목적으로

 다섯개의 프로퍼티가 있다.

 

 appName

  웹 브라우저의 간단한 이름이다. IE에서는 "Microsoft Internet Explorer"

  이며, 파이어폭스 등 넷스케이프에서 유래한(모질라와 넷스케이프 같은)

  다른 브라우저들은 "Netscape"이다.

 

 appVersion

  브라우저의 버전 숫자 또는 버전과 관련된 기타 정보를 담은 프로퍼티.

  이 프로퍼티는 사용자에게 표시되는 버전 숫자와 항상 일치하지는

  않으며, 내부적으로 사용되는 버전 숫자임을 주의. 예를들어 넷스케이프

  6과 모질라, 파이어폭스의 후속 버전 브라우저들에서는 버전숫자가 5.0

  이다. 또한 IE버전 4에서 6까지의 브라우저에서는 4세대 브라우저의

  기준 기능들에 대한 호환성을 나타내기 위한 용도때문에 모두 버전숫자가

  4.0이다.

 

 userAgent

  브라우저가 USER-AGENT HTTP 헤더에 넣어 전송하는 문자열. 이

  프로퍼티는 보통 appName과 appVersion의 모든 정보를 포함하며 때로는

  더 자세한 정보를 추가로 담고 있기도 하다. 이 정보에 대해서는 표준화된

  서식이 없기 때문에 이를 브라우저 독립적인 방식으로 파싱하는것은 거의

  불가능.

 

 appCodeName

  브라우저의 코드 네임. 넷스케이프는 "Mozilla"라는 코드 네임을 사용한다.

  호환성을 위하여 IE도 역시 같은 코드 네임을 사용.

 

 platform

  브라우저가 실행되고 있는 하드웨어 플랫폼을 나타낸다. 이 프로퍼티는

  자바스크립트 1.2에서 새롭게 추가되었다.

 

 다음 자바스크립트 코드는 대화 상자에 Navigator 객체의 프로퍼티들을

 표시한다.

 

 var browser = "BROWSER INFORMATION:\n";

 for (var propname in navigator) {

       browser += propname + ": " + navigator[propname] + "\n"

 }

 alert(browser);

 

 Navigator 객체를 사용하여 브라우저 정보를 테스트할 때는 parseInt()

 와 String.indexOf() 같은 메서드들을 사용하여 필요한 정보만을

 추출해낼 수 있다. 이러한 코드를 가리키는 일반적인 용어는 클라이언트

 스니퍼(client sniffer)이며, 인터넷 상에는 이보다 더 범용으로 사용할 수

 잇는 복잡한 클라이언트 스니퍼 코드를 찾을 수 있다.(www.mozilla.org/docs/web-developer/sniffer/browser_type.html

 을 참고) 하지만 대부분 간단한 코드로도 충분하다.

 

 여기서 집고 넘어가야 할 중요한 점은 Navigator 객체의 프로퍼티가

 알려주는 브라우저 정보가 완전히 신뢰할 수 있는 것은 아니라는 것이다.

 예를들어 파이어폭스 1.0에서 appName은 "Netscape"이며 appVersion은

 '5.0'으로 시작한다. 모질라 코드에 기반하지 않은 사파리(Safari)

 브라우저에서도 똑같은 값이 반환된다. 또한 IE6.0에서 appCodeName은

 "Mozilla"이며 appVersion은 '4.0'으로 시작한다. 이것은 오래 전에

 배포된 브라우저 탐지 코드들이 아주 많기 때문이며, 만약 이 프로퍼티들을

 갱신하면 수많은 웹 페이지들의 호환성이 깨지는데, 이를 브라우저

 제작자가 감당할 수 없기 때문이다. 이것이 바로 브라우저 탐지 기법의

 쓸모가 줄어들고 대신에 기능 테스트를 선호하는 이유 중 하나다.

 
[이 게시물은 관리자님에 의해 2011-10-31 17:16:08 PHP & HTML에서 이동 됨]
|

댓글 1개

감사합니다.
댓글을 작성하시려면 로그인이 필요합니다.

프로그램

태그 필터 (최대 3개) 전체 개발자 소스 기타 mysql 팁자료실 javascript php linux flash 정규표현식 jquery node.js mobile 웹서버 os 프로그램 강좌 썸네일 이미지관련 도로명주소 그누보드5 기획자 견적서 계약서 기획서 마케팅 제안서 seo 통계 서식 통계자료 퍼블리셔 html css 반응형 웹접근성 퍼블리싱 표준화 반응형웹 홈페이지기초 부트스트랩 angularjs 포럼 스크린리더 센스리더 개발자톡 개발자팁 퍼블리셔톡 퍼블리셔팁 기획자톡 기획자팁 프로그램강좌 퍼블리싱강좌
+
제목 글쓴이 날짜 조회
15년 전 조회 4,173
15년 전 조회 2,386
15년 전 조회 3,166
15년 전 조회 1,779
15년 전 조회 2,007
15년 전 조회 1,308
15년 전 조회 4,385
15년 전 조회 3,967
15년 전 조회 3,789
15년 전 조회 5,205
15년 전 조회 3,424
15년 전 조회 1,807
15년 전 조회 1,763
15년 전 조회 1,908
15년 전 조회 1,602
15년 전 조회 4,006
15년 전 조회 2,917
15년 전 조회 2,099
15년 전 조회 1,678
15년 전 조회 1,914
15년 전 조회 2,396
15년 전 조회 1,479
15년 전 조회 2,412
16년 전 조회 1,746
16년 전 조회 1,843
16년 전 조회 1,494
16년 전 조회 2,183
16년 전 조회 1,519
16년 전 조회 1,931
16년 전 조회 2,122
16년 전 조회 1,193
16년 전 조회 1,261
16년 전 조회 1,909
16년 전 조회 5,349
16년 전 조회 1,648
16년 전 조회 2,161
16년 전 조회 2,361
16년 전 조회 1,511
16년 전 조회 1,314
16년 전 조회 2,230
16년 전 조회 4,944
16년 전 조회 2,217
16년 전 조회 2,878
16년 전 조회 1,756
16년 전 조회 3,611
16년 전 조회 4,446
16년 전 조회 3,112
16년 전 조회 2,358
16년 전 조회 2,447
16년 전 조회 2,692
16년 전 조회 2,180
16년 전 조회 5,519
16년 전 조회 3,379
16년 전 조회 1,368
16년 전 조회 1,709
16년 전 조회 5,082
16년 전 조회 2,321
16년 전 조회 3,422
16년 전 조회 2,660
16년 전 조회 1,574
16년 전 조회 5,369
16년 전 조회 2,481
16년 전 조회 5,975
16년 전 조회 1,953
16년 전 조회 4,025
16년 전 조회 3,041
16년 전 조회 2,227
16년 전 조회 2,247
16년 전 조회 4,410
16년 전 조회 3,308
16년 전 조회 2,843
16년 전 조회 2,982
16년 전 조회 2,099
16년 전 조회 1,779
16년 전 조회 1,694
16년 전 조회 1,414
16년 전 조회 1,684
16년 전 조회 1,915
16년 전 조회 1,611
16년 전 조회 4,852
16년 전 조회 3,839
16년 전 조회 1,805
16년 전 조회 1,548
16년 전 조회 2,291
16년 전 조회 4,526
16년 전 조회 3,559
16년 전 조회 2,592
16년 전 조회 4,350
16년 전 조회 3,215
16년 전 조회 1,366
16년 전 조회 1,386
16년 전 조회 2,047
16년 전 조회 1,894
16년 전 조회 2,575
16년 전 조회 2,242
16년 전 조회 1,382
16년 전 조회 4,394
16년 전 조회 1,490
16년 전 조회 1,794
16년 전 조회 2,219