HTML/CSS2010. 6. 22. 19:09

이번에 다룰 내용은 브라우저와 DOCTYPE에 따른 width와 height 그리고 padding, border등의 관계에 대해서 다루겠습니다. 단순하게 말하자면 브라우저와 DOCTYPE에 따른 박스모델 구현 정도로 알아 두시면 되겠습니다.

일단 이미지를 보여드리겠습니다.

Strict(W3C박스 모델)

Quirks


내용 적고, 소스 만드는 시간보다 저 이미지 만드는 시간이 훨씬 오래 걸렸답니다.

잡설은 집어치우고 계속 내용을 이어 가겠습니다. 한쪽은 승인된 DOCTYPE이 포함된 페이지이며, 한쪽은 DOCTYPE없는 페이지 입니다. IE에서 이처럼 차이를 나타내난 이유는 브라우저의 렌더링 차이 때문입니다.

IE는 기본적으로 렌더링 모드가 strict인지 quirks인지에 따라 렌더링 방식을 결정합니다. 즉 페이지에 선언한 DOCTYPE이나 혹은 DOCTYPE의 생략 여부에 따라 사용되는 렌더링 모드가 결정 된다는 말입니다.

IE는 quirks모드일 경우 width와 height안에서 엘리먼트를 구성합니다. padding과 border또한 처음 설정한 widht와 height안에서 결정 된다는 말이죠. 반면에 strict인 경우는 width와 height크기에 영향을 주지 않은 채로 padding과 border가 추가가 된다는 말이죠. (표현되는 엘리먼트의 크기는 이미지를 참고 하시기 바랍니다. 고생한 결과물은 봐줘야 합니다. ㅡㅡ;)

즉 박스모델은 padding및 border와 결합하여 엘리먼트의 컨텐츠 크기를 결정하게 됩니다. 참고로 margin또한 박스 모델의 일부분이지만 컨텐츠 크기를 결정하는 부분은 아닙니다. 사실 대부분의 브라우저가 W3C박스 모델을 지원하지만, 인터넷 익스플로러만 페이지의 렌더링 모드가 strict인지 quirks인지에 따라서 박스 모델을 결정하다 보니 엘리먼트의 크기가 달라진다고 할 수 있습니다.

사실 두 방법 중 어떤 방법이 더 좋다, 나쁘다 말할 수 없습니다. 서로 자신이 지지하는 방식에 따른 quirks방식이 좋다 strict방식이 좋다고 말할 뿐이죠.

마지막으로 글을 쓰다 보니 단순히 IE의 strict과 quirks에 대해서만 다루게 되었네요.
다음에 기회가 된다면 DOCTYPE에 대해서 다루겠지만, 본 내용을 잘 이해하시려면 DOCTYPE에 대해서 꼭 아셔야 합니다. 내용에 DOCTYPE부분이 많이 빠진 관계로 해당 내용은 링크로 대신합니다.

http://www.w3schools.com/tags/tag_doctype.asp
http://ko.wikipedia.org/wiki/XHTML

그리고 혹시 DOCTYPE 이슈에 관한 내용을 좀더 알고 싶다면(http://www.quirksmode.org/css/quirksmode.html) URL을 참고 하시기 바랍니다.

Posted by Jake Kim
JavaScript/Default2010. 6. 8. 14:15
2010.06.08 처음 작성 후, 리터럴 설명이 필요 할 듯 하여 내용 수정합니다.
2010.06.15 리터럴 내용 약간 추가함....

제목 그대로 함수의 값을 넘길 때 객체를 만들어 넘긴다는 말입니다.
이런 방법은 이미 많은 Javascript의 Framework에서 사용되고 있는 방법입니다. 사실 특이할 것도 없습니다.
그리고 파라메터 변수를 객체로 넘긴다고 했는데... 정확히는 리터럴 형식으로 사용한다는 표현이 더 정확 할 것입니다.

일단 예제를 보면 아래와 같습니다.

function tTest1(param1,options){
	var print = "param1 : " + param1;
	print += "ZIP1 : " + options.zip1;
	print += "ZIP2 : " + options.zip2;
	print += "ADDRESS : " + options.address;
	print += "CNT : " + options.cnt;
    alert(print);
}
함수는 이렇게 만들고 이 함수에 값을 넘길 때 options에 객체를 넘기면 됩니다. 물론 options에 들어갈 properties는 알려 줘야 겠죠.(참고로 일반적인 Framework의 함수에 값을 넘길 때 이런 방법을 사용합니다. 그리고 저 options에 해당되는 명을 API로 알려줍니다.)

위와 같이 함수를 만들었다면 함수 호출을 아래와 같이 합니다.
fTest1(“값”,{
    zip1:’100’,
    zip2:’200’,
    address:’우리집’,
    cnt:3
});

어디서 많이 보던 방법이죠? var val = {x:1, x:2}; 바로 리터럴 형식입니다.
리터럴에 관해서는 간단히 언급 하고 넘어 가려고 했는데.... 이왕 언급이 되었으니 한번 집고 넘어가도록 하겠습니다.
2010.06.15 원래 여기 까지 언급 안하려고 했는데 ㅠ.ㅠ 쓰다보니 점점 늘어나네요.

http://www.terms.co.kr/literal.htmliteral ;

리터럴

리터럴이란, 컴파일시 프로그램 내에 정의되어 있는 그대로 정확히 해석되어야 할 값을 의미한다. 이에 비해, 변수란 프로그램의 실행 중에 상황에 따라 다른 값들을 표현할 수 있으며, 상수는 프로그램 실행 중 늘 같은 값을 표현한다. 그러나 리터럴은 명칭이 아니라, 값 그 자체이다. 예를 들어 아래의 수식에서 "x"는 변수이며 "7"은 리터럴이다.

x = 7

리터럴은 숫자 뿐 아니라, 문자 또는 문자열일 수 있다.

용어상으론 이렇습니다.
일단 현재 작성하고 있는 내용이 자바스크립트이니 자바스크립트의 리터럴 형식에 대해 몇자 언급 하겠습니다. 사실 리터럴 형식에 대해 작성 하자면 그 내용 자체가 이 글과 성격이 맞지 않기 때문에 간단히 자바스크립의 리터럴 형식으로 설명하겠습니다.

자바스크립트에서 일반적으로 통용되고 있는 형식은 총 3가지 입니다.
배열 리터럴, 객체 리터럴, 혼합 리터럴 입니다.

소스 예제를 보여드리자면....
1. 배열 리터럴 형식

// 자바스크립트 배열 Array 생성자 이용
var aValues = new Array("string" , 24 , true , null);
// JSON 배열 표현식
var aNames = ["Benjamin" , "Michael" , "Scott"];

alert(aNames[0]); // Benjamin 출력
alert(aNames[1]); // Michael 출력
alert(aNames[2]); // Scott 출력

// 여러 가지 데이터 형식 저장
var aValues = ["string" , 24 , true , null ];
2. 객체 리터럴
// 자바스크립트 객체 Object 생성자 이용
var oCar = new Object();
oCar.color = "red";
oCar.doors = 4;
oCar.paidFor = true;

// JSON 객체 표현식
var oCar = {
  "color" : "red",
  "doors" : 4,
  "paidFor" : true
};

alert(oCar.color); // "red" 출력
alert(oCar.doors); // "4" 출력
alert(oCar.paidFor); // "true" 출력

// 또는

alert(oCar["color"]);
alert(oCar["doors"]);
alert(oCar["paidFor"]);
3. 혼합 리터럴
var aCars = [
  {
    "color" : "red",
    "doors" : 2,
    "paidFor" : true
  },
  {
    "color" : "blue",
    "doors" : 4,
    "paidFor" : true
  },
  {
    "color" : "white",
    "doors" : 2,
    "paidFor" : false
  }
];

일단 리터럴 형식까지 보여드렸고 다시 원점으로 돌아와서 이와같은 리터럴형식으로 값을 넘겼을때 좋은 점은 매개변수 활용성이 높아집니다. 뿐만 아니라 사람이 읽기도 편해지죠.... 그리고 함수 값의 변경시 사용하고 있는 함수에서 변경이 용이 하다는 점입니다.

예를 들어 위와 같이 리터럴형식으로 넘기지 않는다면 함수의 매개변수는 총 5개가 되고 만약 중간에 필요 없는 값이 있을 경우 null처리를 해서 값을 보내야 한다는 점입니다.

객체가 아닌 값을 넘겼다면 함수는 이렇게 만들어야 합니다.
function fTest1(param1, zip1,zip2,address,cnt){
//code...
}
fTest1(“값”,”100”,”200”,”우리집”,3)

뿐만 아니라 만약 함수의 매개변수 순서가 바뀐다면 그 함수를 부른 모든 값을 변경해야 합니다. 즉 함수를 선언한 매개변수 순서를 꼭 지켜야 한다는 말이죠. 하지만 리터럴 형식으로 값을 넘기면 그럴 필요도 없고 값이 빠지면 빠진 값만 undefined가 나옵니다.

만약 Jquery를 사용하면 extend라는 util을 통해서 객체로 넘어온 값을 합병해서 사용할 수도 있습니다.

Jquery를 사용한 객체 합병은 다음 포스트에서 다루도록 하겠습니다.

Posted by Jake Kim
JavaScript/Default2010. 5. 31. 09:37

문자열로 넘어오는 값을 Date형태로 바꿔야 할 때 참조 하기 바람...

//[IE only]
//Variable with Date Format as MM-dd-yyyy:
var dateString = "03-20-2008"	//MM-dd-yyyy

//[IE, FF]
//Variable with Date Format as yyyy/MM/dd:
var dateString = "2008/03/20";  // yyyy/MM/dd

//[IE, FF]
//Variable with Date Format as MM/dd/yyyy:
var dateString = "03/20/2008";  // MM/dd/yyyy

//[IE, FF]
//Variable with Date Format as MMMM dd, yyyy:
var dateString = "March 20, 2008";  // MMMM dd, yyyy

//[IE, FF]
//Variable with Date Format as MMM dd, yyyy:
var dateString = "Mar 20, 2008";  // MMM dd, yyyy

var myDate = new Date(dateString);
document.write("Date :" + myDate.getDate());
document.write("Month : " + (myDate.getMonth()+1));
document.write("Year : " + myDate.getFullYear());
물론 날짜형식을 바로 비교하는것도 가능함...
var date1 = new Date();
var sDate1 = date1.setFullYear(2010,4,31);
var sDate2 = date1.setFullYear(2010,5,31);
if(sDate1>sDate2){
	document.write("sDate1 더크다.");
}else{
	document.write("sDate2 더크다.");
}
Posted by Jake Kim