RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR

We've added to ChartServer a few chart types to let you easily draw advanced map pins. You can use these with the Google Maps API to add pins to your maps, or for any other application. The rotated map pins can be useful for indicating clusters of locations.

ChartServer에 지도 마커의 핀 이미지를 그리게 하는 몇 가지 차트 타입을 추가해 왔다. 이것들을 통하여 Google Maps API를 이용한 지도나, 다른 어떤 어플리케이션에 핀 이미지를 추가할 수 있다. 기울여진 맵 핀은 장소들의 클러스터링 된 것을 인지시켜줄 때 유용하다.

Standard map pin with a letter inside

글씨가 들어가 있는 기본적인 맵 핀


To get a standard map pin with a letter inside, use an URL like

http://www.google.com/chart?chst=d_map_pin_letter&chld=A|FF0000|000000 

The chld URL argument contains several components separated by "|". The meaning of each component is:

chld URL인자는 "|"로 분리된 여러 개의 인자를 포함한다. 각각의 컴포넌트의 의미는 다음과 같다.

  1. letter to put in the map pin, for example A, b, or 9. This must be in UTF-8, and then URL-escaped, so, for example, to get a space you must type +, to get a plus sign you must type %2B, to get љ you must type %D1%99, and to get 駅 you must type %E9%A7%85.
    맵 핀에 넣어질 글씨  A, b, 또는 9. 이것은 반드시 UTF-8로 인코딩 되어야 하고, URL-escape되어져야 한다. 따라서 예를 들면 공백을 넣으려면 + 를 타이핑해라, 플러스 기호를 얻으려면  %2B,  љ 는 %D1%99,  駅 는 %E9%A7%85를 타이핑 해라.
    이 그림과 같이 a와 공백 그리고  +를 넣으려면
    http://www.google.com/chart?chst=d_map_pin_letter&chld=a+%2B|FF0000|000000
  2. pin fill color, as a 6-digit hexadecimal number, for example 000000 for black, FF0000 for red, FFFFFF for white, or FFFF00 for yellow.
    핀을 채울 컬러. 6자리 핵사 코드 
  3. text color, also as a 6-digit hexadecimal number.
    글자의 색깔, 6자리 핵사 코드

Standard map pin with an icon inside
아이콘이 들어가 있는 기본 맵 핀

To get a standard map pin with an icon inside, use an URL like
아이콘이 들어가 있는 기본 맵 핀을 얻으려면 URL을 다음과 같이 사용해라.

http://www.google.com/chart?chst=d_map_pin_icon&chld=home|FFFF00

The chld URL argument contains several components separated by "|". The meaning of each component is:
chld URL 인자는 "|"로 분리된 몇개의 인자를 포한한다. 각각의 컴포넌트의 의미는

  1. icon to put in the map pin. See here for the list of valid icon names.
    맵 핀에 넣을 icon . 여기에 가능한 아이콘 이름 리스트가 있다.
  2. pin fill color, as a 6-digit hexadecimal number, for example 000000 for black, FF0000 for red, FFFFFF for white, or FFFF00 for yellow.
    핀을 채울 컬러. 6자리 핵사 코드

Map pin with advanced shape and a letter inside
문자와 추가 쉐이프를 가진 맵핀

To get a map pin with an advanced shape and a letter inside, use an URL like
문자와 추가 쉐이프를 가진 맵핀을 생성하는 URL은 다음과 같다.

http://www.google.com/chart?chst=d_map_xpin_letter&chld=pin_star|A|00FFFF|000000|FF0000

The chld URL argument contains several components separated by "|". The meaning of each component is:
chld URL 인자는 "|"로 분리된 몇개의 인자를 포한한다. 각각의 컴포넌트의 의미는

  1. shape to use for the map pin. The valid shape names are: pin for a normal pin, pin_star for a pin with a star, pin_sleft for a left-leaning pin, and pin_sright for a right-leaning pin.
    맵핀에 사용되어질 shape. 가능한 쉐이프 이름은 pin 기본 핀, pin_star 별모양 핀, pin_sleft 왼쪽으로 기울여진 핀,  pin_sright 오른쪽으로 기울여진 핀.
  2. letter to put in the map pin, for example A, b, or 9. This must be in UTF-8, and then URL-escaped, so, for example, to get a space you must type +, to get a plus sign you must type %2B, to get љ you must type %D1%99, and to get 駅 you must type %E9%A7%85.
    맵 핀에 넣어질 글씨  A, b, 또는 9. 이것은 반드시 UTF-8로 인코딩 되어야 하고, URL-escape되어져야 한다. 따라서 예를 들면 공백을 넣으려면 + 를 타이핑해라, 플러스 기호를 얻으려면  %2B,  љ 는 %D1%99,  駅 는 %E9%A7%85를 타이핑 해라
  3. pin fill color, as a 6-digit hexadecimal number, for example 000000 for black, FF0000 for red, FFFFFF for white, or FFFF00 for yellow.
    핀을 채울 컬러. 6자리 핵사 코드 
  4. text color, also as a 6-digit hexadecimal number.
    문자를 채울 컬러. 6자리 핵사 코드 
  5. star fill color, also as a 6-digit hexadecimal number. This is only used for the pin_star pin shape. For other shapes, just use 0.
    별 모양을 채울 컬러, 6자리 핵사 코드. 이것은  핀 모양 옵션이 pin_star 일 때만 사용, 다른 모양을 위해서는 그냥  0을 사용

Map pin with advanced shape and an icon inside
추가 쉐이프와 아이콘을 가진 맵핀

To get a map pin with an advanced shape and a letter inside, use an URL like
추가 쉐이프와 글자를 가진 맵 핀을 생성하려면 URL은 다음과 같다.

http://www.google.com/chart?chst=d_map_xpin_icon&chld=pin_star|home|00FFFF|FF0000

The chld URL argument contains several components separated by "|". The meaning of each component is:
chld URL 인자는 "|"로 분리된 몇개의 인자를 포한한다. 각각의 컴포넌트의 의미는

  1. shape to use for the map pin. The valid shape names are: pin for a normal pin, pin_star for a pin with a star, pin_sleft for a left-leaning pin, and pin_sright for a right-leaning pin.
    맵핀에 사용되어질 shape. 가능한 쉐이프 이름은 pin 기본 핀, pin_star 별모양 핀, pin_sleft 왼쪽으로 기울여진 핀,  pin_sright 오른쪽으로 기울여진 핀. 
  2. icon to put in the map pin. See here for the list of valid icon names.
    맵 핀에 넣을 icon . 여기에 가능한 아이콘 이름 리스트가 있다. 
  3. pin fill color, as a 6-digit hexadecimal number, for example 000000 for black, FF0000 for red, FFFFFF for white, or FFFF00 for yellow.
    핀을 채울 컬러. 6자리 핵사 코드
  4. star fill color, also as a 6-digit hexadecimal number. This is only used for the pin_star pin shape. For other shapes, just use 0.
    별 모양을 채울 컬러, 6자리 핵사 코드. 이것은  핀 모양 옵션이 pin_star 일 때만 사용, 다른 모양을 위해서는 그냥  0을 사용

Map pin with text inside, scaling, and rotation
텍스트와 , 스케일, 회전각을 가진 맵핀

To get a map pin with text inside, scaling, and rotation, use an URL like
텍스트오 , 스케일, 회전각을 가진 맵 핀을 얻으려면 URL은 다음과 같다.

http://www.google.com/chart?chst=d_map_spin&chld=1.2|30|FFFF88|10|_|foo|bar

The chld URL argument contains several components separated by "|". The meaning of each component is:
chld URL 인자는 "|"로 분리된 몇개의 인자를 포한한다. 각각의 컴포넌트의 의미는

  1. scale factor for the map pin. A positive decimal number; the larger it is, the larger the map pin will be. For example, 0.5, 1, or 2.2. 스케일 값이 0.5 이면 스케일 되지 않은 핀의 will give you a map pin of the same size as the non-scaled pins, in case you only want to have rotation.
    맵 핀을 위한 scale factor . 양수의 decimal 숫자. 숫자가 클수록 맵 핀이 커질 것이다. 예를 들어 0.5, 12.2. scale factor 0.5  값은 스케일 되지 않은 기본 핀의 크기와 같다.(1이 아니라는 것을 주의 ), 이 때는 단지 너가 회전만을 원한다고 생각한다.
  2. rotation for the map pin, in degrees, counting counter-clockwise; you can use negative or positive numbers. For example, 30, -45, or 270. If you don't want any rotation, use 0.
    맵 핀의  rotation , 각도 단위, 반시계 방향. 양수 음수 모두 사용가능. 예를 들면  30, -45, or 270. 회전각을 원하지 않으면 0을 사용. 
  3. pin fill color, as a 6-digit hexadecimal number, for example 000000 for black, FF0000 for red, FFFFFF for white, or FFFF00 for yellow.
    핀을 채울 컬러. 6자리 핵사 코드
  4. font size for the text in the map pin, in pixels. For example, 10, 12, or 16.
    맵 핀의 font size . 예를 들어 10, 12, 16.
  5. font style for the text in the map pin: _ for normal text and b for boldface.
    맵 핀 텍스트의 font style: _ 는 기본 텍스트 b 는 굵은 글씨체.  
  6. text, one or more "|"-separated component in the URL. Each component will be written as a different line, from top to bottom. Each component must be in UTF-8, and then URL-escaped, so, for example, to get a space you must type +, to get a plus sign you must type %2B, to get љ you must type %D1%99, and to get 駅 you must type %E9%A7%85.
    맵 핀에 넣어질 글씨  A, b, 또는 9. 이것은 반드시 UTF-8로 인코딩 되어야 하고, URL-escape되어져야 한다. 따라서 예를 들면 공백을 넣으려면 + 를 타이핑해라, 플러스 기호를 얻으려면  %2B,  љ 는 %D1%99,  駅 는 %E9%A7%85를 타이핑 해라

Shadow of a map pin
맵 핀의 그림자

If you want to use these images with the Maps API, you will need to be able to draw their shadows, too.
Maps API와 이미지를 사용할 경우, 맵 핀의 그림자도 필요할 것이다.

Standard map pins
기본 맵 핀

To get the shadow of a standard map pin, i.e. a pin with d_map_pin_letter or d_map_pin_icon, use an URL like
기본 맵핀의 그림자를 얻기 위해서는 , 예를 들어 d_map_pin_letter 혹은 d_map_pin_icon의 URL은 다음과 같다.

http://www.google.com/chart?chst=d_map_pin_shadow

There is no chld URL argument.
chld URL 인자가 없다.

Map pins with an advanced shape

To get the shadow of a map pin with an advanced shape, i.e. a pin with d_map_xpin_letter or d_map_xpin_icon, use an URL like
추가 쉐이프를 가진 맵 핀의 그림자를 얻기 위해서는 , 예를 들어 d_map_xpin_letter 혹은 d_map_xpin_icon,의 URL은 다음과 같다.

http://www.google.com/chart?chst=d_map_xpin_shadow&chld=pin_star

The chld URL argument contains one component:
chld URL 인자는 하나의 컴포넌트를 포함한다.

  1. shape to use for the map pin. The valid shape names are: pin for a normal pin, pin_star for a pin with a star, pin_sleft for a left-leaning pin, and pin_sright for a right-leaning pin.
    맵핀에 사용되어질 shape. 가능한 쉐이프 이름은 pin 기본 핀, pin_star 별모양 핀, pin_sleft 왼쪽으로 기울여진 핀,  pin_sright 오른쪽으로 기울여진 핀. 

Map pins with scaling and rotation

It is not possible to get the shape of a scaled and rotated map pin, i.e. a pin with d_map_spin.

List of valid pin icon names
유효한 핀 아이콘 이름의 목록

These are the icon names that you can use instead of home for the map pins with d_map_pin_icon and d_map_xpin_icon:

WC
WCfemale
WCmale
accomm
airport
baby
bar
bicycle
bus
cafe
camping
car
caution
cinema
computer
corporate
dollar
euro
fire
flag
floral
helicopter
home
info
landslide
legal
location
locomotive
medical
mobile
motorcycle
music
parking
pet
petrol
phone
picnic
postal
pound
repair
restaurant
sail
school
scissors
ship
shoppingbag
shoppingcart
ski
snack
snow
sport
swim
taxi
train
truck
wheelchair
yen

2010/08/25 02:23 2010/08/25 02:23
이 글에는 트랙백을 보낼 수 없습니다
HTML/JAVASCRIPT  2008/03/29 21:19

  1. 스트링을 받아서 로딩하는 방법,
  2. 파일을 로딩하는 방법.

먼저, IE를 살펴봅시다. IE에서 XML 로딩하려면, Microsoft.XMLDOM이라는 ActiveXObject를 사용하면 됩니다. 사용방법은 다음과 같습니다.
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = "false";
xmlDoc.loadXML(xmlString);
   or
xmlDoc.load(xmlFile);

위의 코드를 호출하고나면 xml(파일 또는 스트링)을 document의 object처럼 호출이 가능해집니다. async= false로 주는 이유는 xml파일 또는 스트링이 다 로딩된 후 다음 코드를 실행하기위해서 사용됩니다.
ActiveXObject를 사용하는 방법 외에도 CreateObject등을 사용하는 방법도 존재합니다.


Firefox에서는 document.implementation.createDocument을 통하여 XML로딩이 지원이 됩니다.
var xmlDoc = document.implementation.createDocument("", "", null);
xmlDoc.load(xmlFile);

createDocument의 첫번째 파라미터는 namespace를, 두번째 파라미터는 XML 파일에 있는 XML root element를 세번째 파라미터는 아직 구현이 되어 있지 않기 때문에 null을 넣어주면 됩니다.


※ 여기까지의 내용은 Mozilla의 Develper Center에서 본게 아니라 w3schools.com의 내용에서 가지고 왔습니다. MDC에서는 createDocument에 관한 내용 자체가 없더군요. (XUL section에서는 몇 개 있구요. 코드상에서 호출되는 것 뿐이지만)

그리고, Firefox에서 스트링으로 XML을 로딩하는 방법은 DOMParser를 이용하는 방법입니다. DOMParser는 표준이 아니기 때문에 모질라 플랫폼에서만 사용이 가능합니다.
var parser = new DOMParser();
var xmlDoc = parser.parseFromString(xmlString, "text/xml");

PS.1 위의 결과로 xmlDoc을 생성한 값을 읽는 방법에도 여러가지가 있습니다만 다음의 방법으로 읽을 수 있습니다.
  1. 해당하는 xml 태그를 읽어온 다음에 tag.text(IE) 또는 tag.textContent(IE이외)를 사용하여 읽는 방법
  2. 해당하는 xml태그를 읽어온 다음에 tag로 감싸진 TextNode를 읽어들여서 해당하는 nodeValue로 읽는 방법
코드로 구현한다면 다음과 같이 될 것 같습니다.
// xmlDoc의 xml의 구성 <result>sample</result>
var resultTag = xmlDoc.getElementsByTagName("result")[0];
var resultText = (resultTag.text)? resultTag.text: resultTag.textContent;
   or
var resultText = resultTag.childNodes[0].nodeValue;


2008/03/29 21:19 2008/03/29 21:19
이 글에는 트랙백을 보낼 수 없습니다
http://miniajax.com/  간단간단한 여러 가지 AJAX 응용 데모들이 쭉~

http://www.noupe.com/    이건 꼭  AJAX 응용이라기 보다는 UI..

http://www.hotscripts.com/Ajax/index.html

http://www.ajaxpath.com

http://www.dhtmlgoodies.com

http://ajaxpatterns.org/ 

http://firejune.com/index.php?stag=Prototype
2008/02/28 01:23 2008/02/28 01:23
이 글에는 트랙백을 보낼 수 없습니다

initMouseEvent

void initMouseEvent(String  typeArg,
boolean canBubbleArg,
boolean cancelableArg,
org.w3c.dom.views.AbstractView viewArg,
int detailArg,
int screenXArg,
int screenYArg,
int clientXArg,
int clientYArg,
boolean ctrlKeyArg,
boolean altKeyArg,
boolean shiftKeyArg,
boolean metaKeyArg,
short buttonArg,
EventTarget  relatedTargetArg)

initMouseEvent 메소드는,DocumentEvent 인터페이스에 의해 작성된 MouseEvent
값을 초기화할 경우에 사용합니다. 이 메소드는,MouseEventdispatchEvent 메소드를
개입시켜 디스팟치 되기 전에 한해 불려 갑니다만, 필요한 경우는 초기화할 단계에서 여러
차례 불려 가는 일도 있습니다. 여러 차례 불려 갔을 경우는, 마지막 호출이 우선됩니다.


파라미터:
typeArg - 이벤트의 형태
canBubbleArg - 이벤트를 버블 할 수 있을지 어떨지
cancelableArg - 이벤트의 디폴트 액션을 억제할 수 있을지 어떨지
viewArg - EventAbstractView
detailArg - Event 의 마우스의 클릭수
screenXArg - Event 의 화면상에서의 x 좌표
screenYArg - Event 의 화면상에서의 y 좌표
clientXArg - Event 의 클라이언트의 x 좌표
clientYArg - Event 의 클라이언트의 y 좌표
ctrlKeyArg - Event 의 사이에 Ctrl 키가 밀렸는지 어떠했는지
altKeyArg - Event 의 사이에 Alt 키가 밀렸는지 어떠했는지
shiftKeyArg - Event 의 사이에 Shift 키가 밀렸는지 어떠했는지
metaKeyArg - Event 의 사이에 Meta 키가 밀렸는지 어떠했는지
buttonArg - Event 의 mouse button
relatedTargetArg - Event 에 관련하는 EventTarget



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> Event Fake </TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--
function attachEvent(obj,evtType,handler){
if(typeof obj == 'object' && obj != 'undefined' && obj != '' && obj != null){
obj.addEventListener(evtType,eval(handler),false);
}
}

function initEvt(){
var btn  = document.getElementById('btn');
var btn2 = document.getElementById('btn2');

attachEvent(btn,'click','kk');
attachEvent(btn2,'click','jj');
}

function kk(){
alert(1);

var obj = document.getElementById('btn2');
var evt = document.createEvent('MouseEvents');
evt.initMouseEvent('click',true,true,window,0,0,0,0,0,false,false,false,false,0,null);

obj.dispatchEvent(evt);
}

function jj(){
alert(2);
}
//-->
</SCRIPT>
</HEAD>

<body onload=" initEvt();">
<input type="button" id="btn" value="click" />
<input type="button" id="btn2" value="click2" />
</body>
</html>


이곳 참조 사이트는 == http://developer.mozilla.org/en/docs/DOM:document.createEvent
이다. 사실 위에 글보다 이링크가 훨씬 보기 좋다 ;; 아직 한글화 안됨
2008/01/14 15:26 2008/01/14 15:26
이 글에는 트랙백을 보낼 수 없습니다

날로 웹 어플리케이션의 UI가 복잡해지고 JavaScript를 이용해서 사용자와 웹 어플리케이션 간의 상호작용에 따른 특정 객체에 대한 접근과 조작이 점점 더 유행을 타게 되면서, 웹 브라우저의 창 속에 존재하는 어떤 한 객체의 정확한 크기와 위치 좌표 값을 얻는 일은 무척이나 중요해졌다. 하지만, 객체의 위치를 재는 방법과 그 속성은 헷갈릴 만큼이나 다양하고, 불행히도 웹 브라우저들 마다 같은 속성도 서로 다른 크기를 돌려준다. 그래서 여기에 DOM에 존재하는 한 객체의 크기와 자신의 위치를 나타내는 여러 속성 값들을 정리하고, 그림으로 나타내 보았다.

- Window Properties:

screen.width, screen.height

스크린 영역의 픽셀(pixels) 단위 너비와 높이(읽기 전용). 웹 표준 규약은 아니지만 여러 브라우저들에서 지원하고 있다.

innerHeight, innerWidth

브라우저 창 속 문서가 표시되는 영역의 픽셀 단위 너비와 높이(읽기 전용). 여기에는 메뉴 막대, 도구 막대, 스크롤 바 등이 포함되지 않으나, 예외적으로 Firefox와 Opera에서는 스크롤 바의 영역이 포함된 값을 돌려준다. 이 속성은 IE에서는 지원되지 않고, 버전과 Doctype 선언에 의한 표준 호환 모드냐 아니냐에 따라 document.documentElement 혹은 document.body에 있는 clientWidth와 clientHeight 값을 사용해야 한다.

outerHeight, outerWidth

브라우저 창 전체의 픽셀 단위 너비와 높이(읽기 전용). 여기에는 메뉴 막대, 도구 막대, 스크롤 바 등이 포함된 값이다. IE에서는 해당 값이 존재하지 않고, 대신 MS 전용 속성인 document.documentElement 혹은 document.body의 offsetHeight, offsetWidth를 써야 한다.

pageXOffset, pageYOffset, scrollX, scrollY

문서가 얼마 만큼 스크롤 되었는지를 알려주는 픽셀 단위의 값(읽기 전용). 이것도 역시나 Internet Explorer는 지원하지 않는다. 대신 document.documentElement 혹은 document.body의 비표준 scrollLeft와 scrollTop을 사용.

- Window and Mouse Event Properties:

screenLeft, screenTop, screenX, screenY

스크린 속 창의 왼쪽 위 구석에 있는 모서리의 위치를 나타내는 좌표 값(읽기 전용). IE, Safari, 그리고 Opera는 screenLeft와 screenTop을 지원하지만, Firefox와 Safari는 screenX와 screenY를 지원한다.

- HTML Element Properties:

offsetHeight, offsetWidth

한 객체의 픽셀 단위의 너비와 높이 값으로, margin을 제외한 스크롤 바와 padding, border 값을 포함하고 있다. 웹 표준 규약은 아니지만 여러 브라우저들에서 지원하고 있다.

clientHeight, clientWidth

한 객체의 픽셀 단위의 너비와 높이 값으로 padding 값이 포함되나, 그 외의 스크롤 바와 border, margin 값은 포함되지 않는다. 웹 표준 규약은 아니지만 여러 브라우저들에서 지원하고 있다.

offsetLeft, offsetTop

상위 offsetParent 객체를 기준으로 해서 한 객체의 왼쪽 위 모서리의 X, Y 좌표 값. 웹 표준 규약은 아니지만 여러 브라우저들에서 지원하고 있다.

offsetParent

어떤 특정 객체를 포함하고 있는 상위 객체로서 하위 객체의 offsetLeft 그리고 offsetTop의 기준 좌표 시스템 역할을 한다. 대부분의 경우, offsetParent는 하위 객체를 포함하고 있는 Document object가 되지만, 유동적으로 위치하는(absolute-positioned) 요소의 경우에는 또 이 요소를 포함하고 있는 유동적으로 위치한 상위 요소가 바로 offsetParent가 된다. 복잡한 것은 브라우저들 마다 offsetParent가 되는 요소를 다르게 가르켜서 주의가 요구된다. (예를 들어, Firefox에서는 root node를 가리키지만, Opera에서는 바로 위의 부모 요소를 가리킨다.) 웹 표준 규약은 아니지만 여러 브라우저들에서 지원하고 있다.

scrollHeight, scrollWidth

한 객체의 픽셀 단위의 전체 너비와 높이 값. 이 객체가 스크롤바를 가지고 있을 경우(overflow: auto), 이 값은 객체의 보여지는 부분만의 크기를 나타내는 offsetHeight과 offsetWidth 값과는 다르게 된다. 웹 표준 규약은 아니지만 여러 브라우저들에서 지원하고 있다. 하지만, 스크롤 바를 표시하는 구현 방법이 브라우저들 사이에 차이를 보이는 이유로 저 마다 돌려주는 값도 달라서, Firefox와 IE는 객체의 padding까지 포함한 값을 나타내나 Safari의 경우에는 content의 크기에다 한쪽 padding 값만을 더해서 돌려주며 Opera의 경우에도 content 크기에다 한쪽 padding 값과 함께 한쪽 border 값까지 포함하는 등 브라우저들 마다 심한 편차를 보여주고 있어서 사용에 신중을 기해야 한다.

scrollLeft, scrollTop

객체가 스크롤바를 가지고 있을 경우, 객체가 얼마 만큼 스크롤 되었는지 왼쪽 위 모서리를 기준으로 한 픽셀 단위의 값. 이 속성은 브라우저에 따라 문서의 <body> 혹은 <html> 태그에도 정의되어 있어서, 문서 전체가 얼마나 스크롤 되었는지를 나타낸다. 주의할 것은, <iframe> 태그에서 스크롤 된 값은 무시된다. 웹 표준 규약은 아니지만 여러 브라우저들에서 지원하고 있다.

자, 그럼 위의 내용을 그림으로 정리하면,

HTML elements coordinates

결론적으로, 각 속성들에 대한 브라우저들 끼리의 합의가 이루어지지 않는 한 합리적이고 공통된 값을 얻기란 상당히 골치아파서 커다란 걸림돌로 작용한다. 그나마 UI 관련 JavaScript 라이브러리들이 존재하니 시름을 덜 수 있다. 이렇게 놓고 보니, 정리하려고 해도 현재로선 명확한 정리 자체가 될 수가 없다. :?

2007/12/13 17:18 2007/12/13 17:18
이 글에는 트랙백을 보낼 수 없습니다

JavaScript OOP, Prototype)

1. 객체에 속성이용

man.name="홍길동";

Man["name"] = "홍길동";




2. 함수 추가

1) 익명의 함수 이용

(함수의 이름이 없고 몸체만있는 함수) 

Man.getName = fuction(){

       return this.name;

}






2) 객체 외부 함수 이용

function printName()

{

       alert(this.name);

}

Man.getName = printName; // 괄호를 사용하지 않음




3. 객체 생성


1) new Object(); 방식

 new Object();

 var man = new Object();

 man.name = "홍길동";



2) 생성자이용

function ManObject(name, height){

       this.name = name;

       this.height = height;

}

Var man = new ManObject("홍길동", 170);

Alert(man.name + " / " + man.height);


3) 생성자를 이용한 방식에서 클래스에 메소드 추가

function ManObject(name, height){

 this.name = name;

 this.height = height;


this.getName = function(){

       return this.name

} // 생성자에 직접 함수 정의

}


Prototype 속성은 모든 자바스크립트 객체의 기본속성이다.

--어떤 객체의 prototype에 속성이나 함수를 정의 한다는 것은 앞으로 그 객체에 공통적으로 적용되는 속성이나 함수를 정의한다는 의미





4.Prototype 를 이용

function ManObject(name, height){

       this.name = name;

       this.height = height;      

} // 생성자를 만들고 함수는 생성자 안에 지정하지 않음


ManObject.prototype.getName = function(){

       return this.name;

} // prototype 속성에 새로운 함수를 붙임



생성자에 함수 정의

인스턴스를 여러 개 만들때 인스턴스는 메모리로 상주. 인스턴스마다 함수와 같이 생김

Prototype을 이용

함수가 단한번 만들어지고 모든 인스턴스는 이 프로로타입 함수를 공유한다.


객체안에 내장된 함수가 객체의 지역변수를 자신의 지역변수처럼 사용할 경우 이러한 함수를 클로저라 한다.





5.클로저

1-1) 클로저 발생 하는 경우

function MyObject(){

       var startTime = new Date();

       this.elapsedTime = function(){

              var now = new Date();

              var elapsed = now - startTime;

              return elapsed;

       }

}      // 클로저 : startTime 이 함수 안에 없고, 클래스 변수         //startTime을 참조함

       //클로저발생 => 함수 안에서 사용하는 외부의 지역변수는

       //깨긋이 지워지지 않고 함수에 묶여있어 메모리 누수현상발생.

 





1-2) 참조할수 있는 startTime이 없어 오류발생 하는 경우

function MyObject(){

       var startTime = new Date();

       this.elapsedTime = getElapsed;

}

function getElapsed(){

     var now = new Date();

     var elapsed = now + startTime();        return elapsed;

}




1-3) 클로저 발생안되게 사용하는 방법

function MyObject(){

       this.startTime = new Date();

}

MyObject.prototype.elapsedTime = function(){

      var now = new Date();

      var elapsed = now + this.startTime;     

      return elapsed;

}







6.Prototype 의 성질


1) Prototype 속성 변경 

그 이전에 만들 객체의 속성은 자동으로 변경

 프로토 타입 영역의 속성은 모든 인스턴스간에 공유

function MyObject(){ }


MyObject.prototype.color = "blue";

var obj1 = new MyObject();

alert(obj1.color); // blue

MyObject.prototype.color = "red";

car obj2 = new MyObject();

alert(obj1.color + " / " + obj2.color); // red / red





2) Prototype를 이용한 내장객체 확장


Object.prototype.log = function(){

document.write("this:" + this);

//최상위 객체인 Object의 프로토타입에 log함수 추가 => 모든 자바스크립트 객체, 변수에 대해서 log메소드 사용가능

}

var arr = new Array(0,1,2);

arr.log(); // this : 0, 1, 2

var name = "mike";

name.log(); // this : mike

var sum = 1 + 3;

sum.log();       //this : 4







7. 자바스크립트 객체의 상속

1-1) 상속 - prototype 을 이용한 부모 클래스 지정방법 (부모클래스 생성자 매개변수 없는경우)

function ManObject(){ }


       ManObject.prototype.eyeCnt = 2;

       ManObject.prototype.getEyeCnt = function(){

              return this.eyeCnt;

}

function AsianMan(){

       this.eyeColor = "black";

}

AsianMan.prototype = new ManObject();//AsianMan 의 부모클래스는 ManObject



function WesternMan(){

       this.eyeColor = "blue";

}

WesternMan.prototype = new ManObject();//WesternMan 의 부모클래스는 ManObject



var HongGilDong = new AsianMan();

var smith = new WesternMan();


alert(HongGilDong.eyeCnt); // 2

alert(HongGilDong.eyeColor); // black

alert(HongGilDong.getEyeCnt()); // 2

alert(smith.eyeCnt); //2

alert(smith.eyeColor); // blue

alert(smith.getEyeCnt()); // 2








1-2) 상속 - prototype 을 이용한 부모 클래스 지정방법 (부모클래스 생성자 매개변수 있는경우)

/**

 * 사람 클래스

 * @param {String} name

 * @param {String} age

 */

function Person(name){

       this.name = name;


       this.getName = function(){

              return this.name;

       }

}


var gradeEnum = {

       one        : 1 ,

       two        : 2,

       tree       : 3

}


function Student(name, schoolName){      

       this.schoolName = schoolName;      

       this.getSchoolName = function (){

              return this.schoolName;

       }      

             

       this.grade;

       this.getGrade = function(){

              return this.grade;

       }      

}

Student.prototype = new Person("홍길동"); //순서가 중요.제일 먼저Student.prototype을 지정해야함.


/**

 * prototype을 이용한 setGrade 메소드 확장

 * @param {gradeEnum} grade

 */

Student.prototype.setGrade = function (grade){

       this.grade = grade;

}


var student = new Student("홍길동" ,  "홍길동대학교");

alert(student.getName());                    //홍길동

alert(student.getSchoolName());              //홍길동대학교

student.setGrade(gradeEnum.tree);      

alert(student.getGrade());                   //3








2-1) 상속 - base 속성,메소드를 이용한 방법(부모클래스 생성자 매개변수 없는경우)

function ManObject(){

       this.eyeCnt = 2;

       this.getEyeCnt = function(){

              return this.eyeCnt;

       }

}



// AsianMan 의 부모클래스는 ManObject;

function AsianMan(){

       this.base = ManObject;

       this.base();

       this.eyeColor = "black";

}





 2-2) 상속 - base 속성,메소드를 이용한 방법(부모클래스 생성자 매개변수 있는경우)

/**

 * 사람 클래스

 * @param {String} name

 * @param {String} age

 */

function Person(name){

       this.name = name;


       this.getName = function(){

              return this.name;

       }

}


var gradeEnum = {

       one        : 1 ,

       two        : 2,

       tree       : 3

}

function Student(name, schoolName){      

       this.base = Person;             //부모클래스 지정

       this.base(name);                //부모클래스 생성자호출


       this.schoolName = schoolName;      

       this.getSchoolName = function (){

              return this.schoolName;

       }      

             

       this.grade;

       this.getGrade = function(){

              return this.grade;

       }      

}

 

/**

 * prototype을 이용한 setGrade 메소드 확장

 * @param {gradeEnum} grade

 */

Student.prototype.setGrade = function (grade){

       this.grade = grade;

}



var student = new Student("홍길동" ,  "홍길동대학교");

alert(student.getName());                    //홍길동

alert(student.getSchoolName());              //홍길동대학교

student.setGrade(gradeEnum.tree);      

alert(student.getGrade());                   //3

2007/12/04 13:25 2007/12/04 13:25
이 글에는 트랙백을 보낼 수 없습니다
앞절에서 이미 언급한 부분입니다. Scope에 관한거죠. 못읽어 보신분이라면 언능가서 먼저 읽으시길 바랍니다. 이 강좌를 하면서 Scope의 개념이 없이는 절대 안되는 부분이거든요. 물론 깊게 설명하지는 않았습니다만,
이번 강좌를 이해하는데 많은 도움이 되리라 생각합니다.

//중첩함수
function A(){
var a = "1";
  function B(){
    var b = "2";
  }
}


이러한 함수가 정의되어 있다고 가정합시다. 함수 A는 a라는 지역변수를 가지고 있고 함수 B는 함수 A안에서
존재하고 b라는 지역변수도 가지고 있습니다.
깜짝 질문, 함수 B에서 a라는 변수를 참조할 수 있을까요? 없을까요? 앞장에서 했던 강좌를 유심히 보신분
이라면 쉽게 알 수 있을 겁니다. 답은 "참조할 수 있다" 입니다. 답은 앞장의 강좌를 다시 읽어서 확인하시기 바랍니다.

참고로 위의 구문은 "중첩함수"라고 부르며 Javascript에서의 private을 만들때 사용하는 방법중에 하나입니다. 실제로 해보시면 아시겠지만, 함수 B는 함수 A안에서밖에 호출할 수 없으며 밖에서 함수 A를 가지고 함수 B를 참조하려 해도 안되는걸 아실 수 있습니다. A.B() <- 이런식으로 절대 호출 할 수 없습니다.

그럼 다음 함수를 보시죠.

<html>
<script>
 function OutFunc(){
   var out = "i'm a out"
   function InFunc(){
     var inner = "i'm a in "+"-----"+ out;
     return inner;
   }
   return InFunc;
 }

 var test_1 = OutFunc();
 var test_2 = test_1();
 alert(test_2);
</script>
<body></body>
</html>

이 스크립트의 결과가 어찌 될거라고 예상이 됩니까? 사실 이 함수 자체를 이해 못하시는 분도 있으리라
생각합니다. 절대 무시하는게 아닙니다. 다만 우리는 알게모르게 쉬운 스크립트만을 접하고 이렇게 구조적으로 파헤친적이 없기때문에 어려울 수 밖에 없었던겁니다. 처음부터 Java 나 C#처럼 배웠다면 이렇게 Javascript가 우리를 힘들게 하지 않았을거라고 전 생각합니다. 일단 실행부터 시켜보세요. 어떻습니까? 여러분이 예상했던 답하고 일치합니까? 일치하다면 자신있게 설명을 하실 수 있습니까? 없다면 아래를 봐주세요 ^^ㅋ

먼저 정리부터 해보죠.
1. Javascript에서의 단위는 함수이다.
2. 함수의 지역변수는 함수밖에서는 절대 호출 할 수 없고, 함수내부에서는 전역변수보다 지역변수가 우선한다.
3. 변수는 각각의 Scope를 가지며 자신의 Scope를 벗어날 수 없다.


이제 소스를 해석해보겠습니다. 다들 청심환 하나씩 드세요. ^^
OutFunc는 자신의 지역변수 out을 가지고 있고 중첩함수인 InFunc를 가지고 있습니다. InFunc는 자신의
지역변수인 inner를 가지고 있고 중첩된 함수(nested function이라고 표현합니다) InFunc는 지역변수 inner를 리턴하는군요. OutFunc는 중첩함수인 InFunc를 리턴하구요. 여기까지 이해하셨죠?

그리고 OutFunc를 실행하고 test_1에 담습니다..여기엔 뭐가 담길까요? 그렇습니다. 함수 InFunc가 담깁니다. 그리고 test_2에는 test_1에 담긴 함수를 실행하고 그결과를 담습니다.

그럼 답을 발표하겠습니다. 답은 "i'm a in -------- i'm a out" 입니다.

제가 묻겠습니다. 변수 inner는 어디에 속해이어야 하는 거죠? 네. 함수 InFunc에 속해서 그 Scope안에서만
존재 해야하며 그함수가 종료되었을때, 같이 사라져야할 변수입니다. 그런데 지금의 모습은 어떻습니까?
alert()을 통해서 inner의 값을 찍고 있습니다. 도대체 어떻게 된 것일까요? 위에 정리한 1,2,3은 도대체
어쩌라고 이렇게 결과가 나오는 겁니까?

눈치가 빠르신분은 이미 알고 계셨을 겁니다. 그렇습니다. 이것이 바로 "클로져(Closure)" 입니다.
클로져의 정의는 "다른 함수내에서 내부객체로 생성된 함수 리터럴을 반환하여 호출 프로그램에서 이를 변수로 배정한 것" 이라고 정의하고 있으며 부연설명으로는 "함수가 동작하는데 필요한 데이터 영역 확장"이라고 하고 있습니다.[o'relly - Javascript for web 2.0 5장]

제가 더 덧붙여 설명하면 첫번째  OutFunc()를 실행함으로써 InFunc()함수를 OutFunc()의 안에서 바깥쪽으로
끄집어내어 영역을 변경(확장)하고 두번째 test_1()을 다시 한번 실행함으로써 inner의 값을 직접 호출 할 수 있도록 호출 프로그램으로 영역을 변경(확장)한 것입니다. 이로써 inner라는 변수는 더이상 OutFunc의
InFunc안에 갇혀있지 않고 어디서든지 호출 될 수 있는 전역변수화가 되어버린 것이죠.
여기까지 이해하셨다면 당신은 이미 중급의 문턱까지 온것입니다.
사실 클로져란것을 정확하게 알고 있는 사람은 드물뿐 아니라 "의도하지 않은 클로져의 생성"으로 고통받고
있는 개발자들도 많습니다. 그만큼 어렵고 이해하기 힘든 개념인 것입니다.

결과적으로만 보면 상당히 훌륭해보이고 멋져 보이지만, 사실 내면엔 "메모리 누수"라는 문제점을 안고
있습니다. 메모리 누수에 대해서는 다음 강좌인 "함수-3"에서 자세히 다뤄보도록 합시다.
오늘은 이만 접어야 겠네요..ㅋ 퇴근시간이 가까워 져서리..ㅋㅋ
그럼 다음 강좌까지 다들 건강조심세요.. 더위가 심하네요..


오늘은 저번 강좌에 이어 클로져에 대해서 이어가겠습니다. 클로져에 대해서 개념이 안잡히신 분들을 위해
간략하게 정리하겠습니다.

함수안에 존재하는 지역변수는 지역변수로써 살아야하며, 함수가 죽으면 따라죽을 운명인데, 클로져는 죽어
마땅한 함수의 지역변수를 밖으로 끄집어내어 영역을 변경(확장)하는 것
을 의미합니다. 물론 이한줄이 클로져를 전부 나타낼 수는 없습니다. 하지만 전 이렇게 설명하려 합니다. 다르게 설명해봤자 서로 헛깔릴게 분명
하거든요 ^^ 사람이든 변수이든 자기의 영역에서 벗어나면 안되나 봅니다..ㅎㅎ 왜냐구요? 클로져도 문제가
좀 심각하거든요... 이름하여 "Memory leak(메모리 누수)" 현상 때문입니다.

메모리 누수의 전체적 그림은 중급강좌정도에 보실 수 있겠네요. 여기서는 클로져에 의한 메모리 누수에
대해서만 다루겠습니다. 메모리 누수 모델이 몇가지 있는데 그걸 다 다루자면 제목에서 보듯이 [기초강좌]에서 범위가 벗어납니다. 우리가 좀전에 뭘 배웠습니까? 영역을 벗어나면 문제가 된다고 했지요 ㅎㅎㅎㅎ

자 다시 본론으로 가서, 클로져는 한 내부함수의 지역변수를 함수 리터럴을 통하여 밖으로 꺼내오는 것을
의미한다 했습니다. 그럼 제가 질문을 해보겠습니다. 그 한 내부함수가 종료되면 클로져에 의해 밖으로
튀어나온 변수는 어떻게 될까요? 그렇습니다... 계속 살아 있습니다. 계속 살아있으므로 부모함수가 죽었는데도 불구하고 계속 호출되어 사용됩니다. 나중에 다시 이야기 되겠지만 이것이 "IE에서의 메모리 누수 모델 1"
입니다. 보통 FireFox나 오페라 같은 브라우저는 클로져가 생성되어도 참조값이 0이면 브라우저메모리에서
GC에의해 소멸되게 됩니다. 허나, IE는 그렇지 못하여 문제가 되는거죠. 전 강좌를 열심히 보신분이라면 쉽게 이해하시리라 봅니다. 클로저의 메모리 누수는 이쯤으로 마치겠습니다. 사실 메모리 누수에 대해서는 할말이
무지 많습니다. 허나, 역시 범위를 넘기면 문제가 ㅎㅎㅎㅎ



posted by blankus

--------------------- 펌글 ---------------------


음냥 초보자들이 알기 딱좋네 !!

나두 넘 좋아 나도 초보거등 ~~~ ㅋㅋㅋ
2007/11/21 12:54 2007/11/21 12:54
이 글에는 트랙백을 보낼 수 없습니다
오늘도 무쟈게 덥군요 ^^; 좀전에 회사 사람들하고 잠시 밖에나가 잡담을 하며 바람좀 쐬고왔습니다.
역시 사무실에 일할때보단 밖에서 놀때가 더 좋군여..ㅎ

오늘은 By value와 By reference에 대해서 알아보겠습니다. 날도 덥고하니 조금은 짧게 이야기해봅시다.
사실 이부분은 제가 C를 공부할때 알게되었습니다만, Javascript에서는 크게 신경안쓰고 작업했던 부분입니다. C를 공부하신 분은 아시겠지만, C에는 포인터란 개념이 있습니다. 물론 Javascript에서는 없습니다.
하지만 표면적으로 C처럼 포인터를 핸들링 하지 않는것 뿐이지, 개념은 필요한 부분입니다.

포인터.. 그놈은 이런놈입니다. 보통 우리가 변수를 선언하고 무언가를 그 변수에 담을때, 그때 그 무언가는
메모리에 저장되게 됩니다. 메모리에 저장될때, "나는 메모리의 어디에 위치해있다."라고 알려주는데 그게 바로 "포인터" 입니다. 말그대로 무언가를 가리키는거죠. 그래서 C에선 일반변수와 포인터 변수를 구분해서
사용하는데, Javascript에서 사용하는 변수는 C에서의 일반 변수가 되겠습니다. 포인터 변수는 뭔가 저장된놈의
메모리 주소를 가지고 있는거구요. 일반 변수는 by value가 되고, 포인터 변수는 넓은 의미에서 by reference가 됩니다. 물론 Javascript에 100% 적용되는 설명은 아닙니다.
여기까지는 쉽게 이해가 가실거라 생각됩니다. 아직 부족하다구요? 그럼 더 쉽게 --;

by value의 참조는 변수에 값을 직접할당하는 방식이며 (변수를 박스라고 생각하시면) 박스안에 내용물이
중요한 놈이죠.
by reference의 참조는 변수에 값을 직접 할당하지 않고,(변수를 박스라고 생각하시면) 박스의 위치에
관심이 있는 놈입니다.
내용물에 뭐가 담겨져있고, 그 내용물이 어찌되던간에 그 박스의 위치만 잘 가지고 있으면 되는 놈이죠.
나중에 변수를 call하면 by reference의 참조는 "값을 가져오라고? 그래. 난 박스주소를 알고있으니까, 그박스에 뭐가있는지는 잘모르지만 내용물을 넘겨줄께"라고 행동하게 됩니다.

그럼 Javascript에서는 위의 개념을 어떻게 가지고 있을까요? 이제 소스를 보면서 이야기해보죠.

<html>
<script>
   //첫번째 구문
   var ref_1 = "string...";
   var test_1 = ref_1;
   ref_1 = "none";

   //두번째 구문
   var ref_2 = new String("hello world");
   var test_2 = ref_2;
   ref_2 = new String("world");

   //세번째 구문
   var ref_3 = new Array("one", "two", "three");
   var test_3 = ref_3;
   ref_3[0] = "1";

</script>
<body>
</body>
</html>


우선 '첫번째 구문'에 대해서 살펴보죠. 아주 쉽습니다. 단순히 문자열을 변수에 담고있고, 그것을 다시 다른 변수에 담았습니다.
그리고 원래 변수의 값을 변경했군요.

'두번째 구문'은 결과적으로 '첫번째 구문'과 동일하지만 다른점이 하나 있습니다. 바로 new String이란 것을 사용해서 변수에 담고있습니다.
'첫번째 구문'에서 ref_1의 타입은 Stirng이지만, '두번째 구문'에서 ref_2의 타입은 Object입니다. 역시 마지막에선 다른 String Object로
값을 변경하고 있네요.

'세번째 구문'은 많이 사용하는 배열입니다. 배열은 자체가 Object인건 아시죠? 역시 이것도 test_3이라는 변수를 만들고 ref_3을 담았습니다.

이상 소스설명은 드렸습니다. 여기까지 이해가 가시나요? 혹시 안가신다면 제게 질문을 하시거나, 구글링을통해 학습이 필요합니다.
이제 제가 질문을 드리겠습니다.

1. alert(test_1)를 실행하면 값이 어떻게 나올까요?
2. alert(test_2)를 실행하면 값이 어떻게 나올까요?
3. alert(test_3)를 실행하면 값이 어떻게 나올까요?

3개의 답을 모두 자신있게 말씀하셨다면, 거기에 답까지 맞으셨다면 축하합니다 ^^*

1번의 답은 "String..."이 출력됩니다. 이유는 String타입의 값들은 by value에 의해서 참조가 됩니다.
다시말해서, test_1은 ref_1의 주소값을 가지고 있는게 아니라 "String..." 자체의 값 즉, value를 가지고 있는겁니다. 그러므로 아무리 ref_1의 값을 변경해도 값에의한 참조(by value)를 한 test_1은 영향을 받지
않는거죠.

2번의 답은 3번을 설명하고 다시 이야기하겠습니다.
3번의 답은 "1, two, three"가 되겠습니다. 왜일까요? 그렇습니다. 둘중에 하나니까 그렇습니다 --;
위에서 값에의한 참조였으니, 이번엔 그반대의 경우겠지요 ^^; 물론 맞는 답입니다만, 정확한 설명을 드리면, ref_3은 Object를 담고있습니다. 그리고 test_3는 ref_3을 참조하지요. 그리고 Object는 by reference에 의해서 참조가 됩니다. 위에서 제가 말씀드린게 by reference가 되면 값을 가지고 있는게 아니라 참조되는 놈의 주소를 가진다고 말씀드렸습니다. 이해가 되시는지요?
만약 값에 의한 참조가 되었다면 test_3는 값이 변경되기전의 ref_3을 참조했기때문에 test_3는 ref_3의 값의 변동에 상관없이 동일한 값을 가지고 있어야함에도 불구하고, 결과는 변경된 값을 가지고 있습니다. 바로 by value가 아닌 by reference에 의해 참조가 되기 때문이지요. by reference로 참조된 변수는 그안에 값이 어떻게 바뀌든지 상관없이 주소값만을 가지고 있으므로 나중에 주소안에 들어있는 값만을 내뱉어 줍니다.
위에 설명 드렸던 부분입니다.

그럼 2번은 결과가 어떻게 될까요? 참으로 애매한 부분입니다. 답은 "hello world"가 출력됩니다
new String으로 생성했으므로 분명 Object입니다, 그럼 by reference에 의해서 참조가 일어나야 정상이지만
결과적으로 그렇지 못합니다 --;
왜그럴까요? 여기에도 무언가가 있기 때문입니다.

바로 Wrapper Object가 범인입니다. Wrapper를 잘모르시는 분을 위해서 잠깐 설명을 드리겠습니다.
Wrapper는 보통 타입을 변경하기위해 사용합니다. String으로 사용하지만 나중의 변환을 위해 new String으로 생성하여 Object로 만들어 내는것입니다. 물론 Javascript에서는 자동 형변환에 의해 크게 사용되지는
않습니다.
다시 본론으로 돌아가서, Wrapper Object는 Object이지만서도 by value에 의해 작동됩니다.
[O'reilly의 Javascript The Definitive Guide 5/E 3장 참고]
(Javascript에서의 Wrapper Object는 String, Number, Boolen이 있습니다. )
그러므로 예상대로 "world"가 출력되지 않고 "hello world"가 출력되는 것입니다.

오늘은 조금 짧게 써보려고 했는데, 말이 길어졌군요 ㅎㅎ 오늘의 주제는 "참조"였는데 만족할 만한
주제였는지 모르겠습니다.
기초강좌라서 약간은 부담이 되는게 사실입니다 ^^; 최대한  쉽게 풀어서 설명하고 싶은데 생각처럼 그렇게
쉽지만은 않군요ㅋ 포스팅을 하다보니 벌써 저녁먹을 시간이네요.. 오늘도 야근모드인
개발자의 비애ㅋ

자 기초강좌가 언제까지 연재 될지 모르겠지만 가끔은 중급강좌도 쓰도록 하겠습니다.
즐거운 저녁식사 되세요~~

posted by blankus


---------------- 트래백 http://www.blankus.net/trackback/5 ----------

위글을 봐서도 알겠지만 ㅡㅡ 뻔히 아는애기 왜하냐고 하면 ㅡㅡ

답이 없지만 서도 ;; 초보자들이 개념만충 하기엔 딱좋은 글이다.

그래서 퍼왔다 !
2007/11/21 12:51 2007/11/21 12:51
이 글에는 트랙백을 보낼 수 없습니다
http://mckoss.com/jscript/object.htm

위의곳을 참조하여보아라

JS 의 참맛을 알게 될것이니 ....

난 지금 js _ abstruct 를 만드는 중인데 .. 참고할만 하다.
2007/11/20 00:57 2007/11/20 00:57
이 글에는 트랙백을 보낼 수 없습니다
그동안 Prototype 자바스크립트 프레임웍의 사용법을 익히느라 필요이상으로 무리하게 사용해 왔습니다. 간단하게 크로스 브라우징이 보장되며 코드를 아름답게(?) 만들 수 있다는 장점 때문이였는데요. 개발하기 편하여 생산성 높은 환경을 제공하는 반면 원시코드에 비해 9배이상의 시스템 성능저하가 나타나기도 합니다. 아래와 같은 테스트용 루프 함수를 만들고 결과는 동일하면서 모든 브라우저에서 통용되며 상습적으로 사용되는 Prototype함수와 자바스크립트 메서드를 벤치마킹해 보았습니다. 테스트에 사용된 Prototype 프레임웍 라이브러리의 버전은 Scriptaculous1.6.1에 포함된 1.5.0_rc0이며, 브라우저는 파이어폭스2.0b, 시스템사양은 Pentium4, 3.00GHz입니다.

// 타임체크 함수
function timeChecker() {
    var befor, loops, after, tpo, tet, result
    before = new Date()
    loops = 500 //루프 수
    for (var i=0; i < loops; i++) {
        Element.update('element', '내용')// 태스트함수
    }
    after = new Date()
    tpo = Math.round(1000*(after-before)/loops)
    tet = (after-before)/1000
    result = 'Time per operation: '+tpo+', Total excuted time: '+tet; //결과값
    throw(result)
    //return result
}
timeChecker();


1. DOM 엘리먼트 스타일 설정:
프로토 타입에서는 여러가지 형태로 DOM을 주무를수 있게 해 주는데요. 1만회에 걸쳐 객체를  width:'300px', height:'100px'으로 변경하는 테스트입니다. 아래의 결과를 살펴봅시다.

1. document.getElementById('엘리먼트').style.스타일 = '값' // (원시코드, 2라인) -->  1.14초
2. $('엘리먼트').style.스타일 = '값' // (2라인) -->  1.656초
3. Element.setStyle('엘리먼트', {'스타일:값의 배열x2'})  // --> 1.985초 
4. $('엘리먼트').setStyle({'스타일:값의 배열x2'}) // --> 3.047초

동일한 결과값을 가지는 위 4가지 코드는 처리에 필요한 시간이 서로 다릅니다. 4번은 원시코드와 2배이상 차이가 벌어지는 재미있는 결과를 보여줍니다. 반복성이 짙은 경우, 즉 엘리먼트를 실시간으로 업데이트하거나 모션에 사용할 코드는 4번의 형태는 가급적 피하는 것이 좋습니다. 당연히 1.번이나 2번의 형태가 좋겠죠?

2. DOM 엘리먼트 스타일 값 구하기:
DOM의 위치또는 모양을 확인하기 위해 prototype은 getStyle, getDimensions 메서드를 제공하고 있으며, 엘리먼트의 높이 값만을 구하기 위한 getHeight와 같은 메서드도 있습니다.(그나저나 getWidht는 왜 없는걸까요?) 엘리먼트의 높이값(height)을 알기위한 가장 빠른 방법은 무엇인지 살펴 봅시다.

1. document.getElementById('엘리먼트').offsetHeight  // (원시코드) -->  Number 0.391초
2. $('엘리먼트').offsetHeight //Number --> 0.625초
3. Element.getHeight('엘리먼트') //Number --> 0.641초
4. document.getElementById('엘리먼트').getHeight() //Number --> 1.328초
5. $('엘리먼트').getHeight() //Number --> 1.563초
6. Element.getStyle('엘리먼트', '스타일')  //String  --> 2.812초 
7. $('엘리먼트').getStyle('스타일') //String  --> 3.843초

높이 값이 '123px'와 같은 스트링으로 반환된 6, 7번은 'px' 문자열을 없애기 위해 parseInt()하거나 '스트링.substring(0,스트링.length-2)'을 사용해야 합니다. 6, 7번은 쓸일이 없을 것 같은데 왜 집어넣었냐구요? 하지만 아래와 같은 경우(다중 이미지 비율계산)에는 벤치마크 결과와는 정 반대로 6, 7번이 훨씬 빠른 성능을 내기도 합니다.(슬라이드를 움직여 프레임을 비교해보세요.)

// Realtime image Ratio
function setRatio(v) {
    var x,y,h
    var w=Math.round(v)
    $$('array').each(function(e){
        x=Element.getStyle(e, 'width'); y=Element.getStyle(e, 'height')
        h=Math.round(v*y.substring(0,y.length-2)/x.substring(0,x.length-2));
        e.style.width=w+'px'
        e.style.height=h+'px'
        e.style.margin=(w-h)/10+'px'
    })
}


Element.getHeight('엘리먼트')
Width: 75px

Element.getStylet('엘리먼트', 'height')
Width: 75px

3. DOM 엘리먼트.Show/Hide:
1. document.getElementById('엘리먼트').style.display = 'block' // -->  0.547초
2. $('엘리먼트').style.display = 'block' // -->  0.812초
3. Element.show('엘리먼트')  // --> 1.312초
4. $('엘리먼트').show()  // --> 2.609초

또한 가장 많이 사용하는 것 중의 하나인 엘리먼트 Show/Hide를 봅시다. 1만회를 루프로 돌린 결과입니다. 스타일의 결과와 비슷하지요? 역시 원시코드가 가장빠릅니다. 하지만 이것은 결과값이 브라우저에 따라 서로 다르게 나타나기도 합니다. IE에서는 $('element').style.display = 'block', 파이어폭스에서는 Element.show('element')가 잘 돌아간다는 느낌입니다.

4. DOM 엘리먼트.InnerHTML:
1. document.getElementById('엘리먼트').innerHTML // -->  0.672초
2. $('엘리먼트').innerHTML = '내용' // -->  0.766초
3. Element.update('엘리먼트', '내용') // -->  2.39초

이것은 3천회 루프의 결과입니다. 이 또한  원시코드를 사용하는 것이 3배 빠르군요. 눈치 채셨겠지만 "오브젝트.메서드"의 결합과 "메서드(오브젝트)"에도 결과는 같지만 소요시간이 다릅니다. DOM 스타일링에는 메서드(오브젝트)와 같은 형태가 좋습니다. 뭐 결과적으로는 원시코드를 적절히 혼용하면 시스템 퍼포먼스를 크게 끌어올릴 수 있다는 것이지만요.

5. 정수 구하기:
1. Math.round(넘버) // -->  1.453초
2. (넘버).toFixed(0) // -->  3.859초

소수점 이하의 수를 반올림하는 경우 100만회 루프 결과 toFixed(0) 보다 Math.round()가 2배이상 빠릅니다.

6. 브라우저별 색상처리:
좀 다른 얘기지만, getStyle로 색상 값에 따른 이벤트를 처리하는 경우 브라우저 마다 가져오는 색상 값이 틀립니다. 스타일스트(CSS)에 '#f80'으로 설정되었을 경우 브라우저별로 가지고 온 결과는 아래와 같습니다.
오페라 = '#ff8800'
파이어폭스 = 'rgb(255, 136, 0)'
익스플로러 = '#f80'


7. 홀수 짝수 구하기:
홀수나 짝수를 루프에서 처리할 때 'n%2'를 쓰거나 'n&1'을 쓰는 두가지 방법이 있습니다. 이럴땐 'n&1'이 미약하게 나마 약간 더 빠릅니다.
for (var n=0; n < 100;n++) if(n%2==1)$('element').innerHTML = 'test';
for (var n=0; n < 100;n++) if(n&1==1)$('element').innerHTML = 'test';


추가. 문자열비교 : match 보다 test가 빠르고 indexOf가 두배 빠름(50만회)
var testing = 'test test test';
testing.match(/test/); // -->  0.702초
/test/.test(testing); // -->  0.643초
testing .indexOf('test ') != -1; // -->  0.395초


추가. if문과 단순 조건문 속도차이 없음.(500만회)
var boo = true; 
boo = boo? 'true' : 'false'; // -->  0.736초
if(boo){ boo = 'true'; } else { boo = 'false'; } // -->  0.726초


추가. DOM Selecter(500회)
$$('#taglist .row');// -->  1.496초
$$('.row');// -->  tset failed
document.getElementsByClassName('row', 'taglist');// -->  0.193초
document.getElementsByClassName('row');// -->  3.321초

2007/11/09 12:29 2007/11/09 12:29
이 글에는 트랙백을 보낼 수 없습니다
웅쓰:웅자의 상상플러스
웅자의 상상플러스
전체 (379)
게임 (5)
영화 (2)
기타 (23)
맛집 (5)
영어 (2)
대수학 (3)
형태소 (5)
Hacking (9)
Linux (112)
HTML (48)
Application_developing (48)
Web_developing (102)
Window (11)
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
  1. 2016/01 (1)
  2. 2015/12 (3)
  3. 2015/10 (3)
  4. 2015/03 (2)
  5. 2015/01 (4)