블로그 이미지
초딩입맛제주아재
하고 싶은 것만 하며 살고 싶다

calendar

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
2007. 3. 14. 23:10 Programing/HTML/JavaScript/CSS

AJAX가 무엇인지는 검색을 통해 쉽게 찾을 수 있으니 생략하기로 한다.
다만 한가지 당부의 말을 하고 싶어 몇자 적는다.

당신이 AJAX에 대하여 무엇을 상상했건 당신이 상상한 그 이상도 그 이하도 아닐것이다.
AJAX는 혜성처럼 등장한 새로운 언어도 아니고 무언가 획기적인 방법으로 화려한 어플리케이션을 개발하게 해주는 기술도 아니다.

꼭 위의 말을 기억하길 바란다.
기대가 크면 실망도 크니까....

내가 이 포스팅을 하게 된 이유는 아직 AJAX를 잘 모르는 친구놈에게 AJAX를 가르치기 위함이다.
때문에 글 내용은 차분하면서도 세세하게 예제를 통해 AJAX에 대해 설명할 것이다.


준비

앞으로 AJAX를 설명하면서 만들 어볼 예제는 주소록이다.

본 내용과는 관련이 없지만 혹시 Ruby on Rails 를 모르지만 해보고 싶은 분은
여기를 클릭해서 주소록 예제를 해보시길 :)

주소록의 구조는 간단하다.
빈 주소록에 새 레코드를 작성하고 작성된 레코드를 수정하거나 삭제하는 기능이 전부다.
물론 이 모든 작업은 AJAX를 사용하여 페이지 이동 없이 하나의 열려진 페이지 내에서 이루어질것이다.

그럼 본격적으로 시작....



시작

우선 AJAX의 핵심(나는 이것이 핵심이라고 생각한다.)인 XMLHttpRequest 객체에 대해 알아보자.


XMLHttpRequest

property:

onreadystatechange Sets or retrieves the event handler for asynchronous requests.
readyState Retrieves the current state of the request operation.
responseBody Retrieves the response body as an array of unsigned bytes.
responseText Retrieves the response body as a string.
responseXML Retrieves the response body as an XML Document Object Model (DOM) object.
status Retrieves the HTTP status code of the request.
statusText Retrieves the friendly HTTP status of the request.

method:
abort Cancels the current HTTP request.
getAllResponseHeaders Returns the complete list of response headers.
getResponseHeader Returns the specified response header.
open Assigns method, destination URL, and other optional attributes of a pending request.
send Sends an HTTP request to the server and receives a response.
setRequestHeader Adds custom HTTP headers to the request.


각각의 속성과 메서드들은 MSDN에서 자세하게 설명하고 있다.

XMLHttpRequest 객체는 브라우져마다 생성방법이 조금씩 다르다.

IE 6이하의 버전에서는 다음과 같다.

new ActiveXObject('Msxml2.XMLHTTP')
new ActiveXObject('Microsoft.XMLHTTP')


IE 7부터 XMLHttpRequest을 지원하며 파이어폭스,사파리등에서는 이미 지원하고 있다.
따라서 이들의 브라우져에서의 생성 방법은 다음과 같다.

  new XMLHttpRequest();


이걸 한데 묶어보면 다음과 같다.
var request = false;

try {
request = new XMLHttpRequest();
} catch (trymicrosoft) {
try {
request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (othermicrosoft) {
try {
request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (failed) {
request = false;
}
}
}
XMLHttpRequst 객체가 만들어졌다.
서버와 클라이언트가 데이터를 주고 받을 수 있는 길이 열린것이다.
앞으로 저 길 위에서 주소록에 사용될 데이터들이 왔다리 갔다리 할 것이다.
이번 순서는 길을 연것으로 만족하자.
그리고 XMLHttpRequest 객체의 속성과 메서드들을 꼼꼼히 살펴보기 바란다.
인터넷에서 흔하게 찾을 수 있는 누군가에의해 만들어진 함수를 쓰는 것도 나쁘지는 않으나 적어도 XMLHttpRequest 객체의 각 속성과 메서드의 역할은 제대로 알고 있어야 할 것이다.

다음 순서에서는 주소록을 위한 서버 프로그램(PHP)과 클라이언트 프로그램(HTML)을 만들어 볼 것이다.
posted by 초딩입맛제주아재
2007. 2. 15. 15:36 Programing/HTML/JavaScript/CSS
<STYLE type=text/css>
#mydiv {
   position:absolute;
   top: 50%;
   left: 50%;
   width: 200px;
   height: 100px;
   margin-top: -50px; /*set to a negative number 1/2 of your height*/
   margin-left: -100px; /*set to a negative number 1/2 of your width*/
   border: 1px solid #ccc;
   background-color: #f3f3f3;
}

</STYLE>

<DIV id=mydiv>
       **************
</DIV>

'Programing > HTML/JavaScript/CSS' 카테고리의 다른 글

Array.remove()  (3) 2007.03.28
AJAX 실전 #1 - XMLHttpRequest  (0) 2007.03.14
[HTML] LABEL과 사용자 중심의 프로그래밍-UI  (3) 2007.01.05
[HTML] FIELDSET과 LEGEND  (0) 2007.01.05
[CSS] onMouseOver,onMouseOut은 그만!!  (17) 2007.01.03
posted by 초딩입맛제주아재
2007. 1. 5. 16:28 Programing/HTML/JavaScript/CSS

프로그램의 UI(User Interface)는 코드 못지 않게 중요하며
최근에는 오히려 코드보다 더 무거운 비중을 차지하고 있다.
UI의 성공이 곧 프로그램의 성공으로 이어지며 그 반대의 경우도 동일하다.
전문적으로 UI만 개발해 주는 업체도 있고, UI개발자도 있다.
인기있는 프로그램은 UI에서 다른 프로그램을 압도하며
사용자들은 편안하고 거부감 없는 UI를 가지고 있는 프로그램을 선호하게 되는데
특히, 접근성이 중요한 웹의 경우 UI의 비중은 더 크다.
대형 사이트들은 '아이트래킹'이라는 시스템을 사용해 사용자 시선의 흐름을 분석하고
그 결과를 토대로 메뉴 위치를 구성하기도 한다.

프로그램은 사람을 좀더 편하게 하기 위한 것이다.
프로그램을 쓰면서 사람이 더 피곤해지거나 스트레스를 받는다면
그 프로그램은 실패작이다.
프로그래머는 어떤 프로그램을 만들때 사용자 입장에서 많은 생각을 해야 한다.

"이 버튼이 여기에 있는것이 누르기 편할까?"
"메뉴를 오른쪽에 두는것이 보기에 편할까?"
"날짜를 수기로 입력하게 하는것이 좋을까 달력콤포넌트에서 선택을 하게 하는것이 좋을까?"
"이 부분은 직접 해보니까 불편하잖아! 당장 고쳐야겠다 -_-"

서론이 쓸데 없이 길었다.
자 이제 본론이다.

여러 사이트들 중에 다음과 같은 추가 정보를 입력 받는 곳들이 있다.

앞에 있는 체크박스에 정확히 마우스를 갔다 대고 클릭해야 영광의 상처같은 "v"가 표시된다.
나이드신 분들이나 장애우,어린이들의 경우 어려운 일이 될 수 있다.
위에서 괜히 길게 서론을 열변했던것이 아니다.
바로 이런 UI를 프로그래머는 지양해야 하는 것이다.

그렇다고 저 페이지를 없애버리면 안되지 않겠는가?
뭔가 근사한 해결책은 없는것인가...

있다 -_-

오늘의 주인공 LABEL을 쓰자.

<FORM action="..." method="post">
<LABEL for="fname">First Name</LABEL>
<INPUT type="text" name="firstname" id="fname"><br />
<LABEL for="lname">Last Name</LABEL>
<INPUT type="text" name="lastname" id="lname"><br />

<LABEL><INPUT type="radio" name="sex" value="M" />Male</LABEL>
<LABEL><INPUT type="radio" name="sex" value="F" />Female</LABEL><br />

<LABEL><INPUT type="checkbox" name="book" value="book" />Book</LABEL>
<LABEL><INPUT type="checkbox" name="game" value="game" />Game</LABEL>
<LABEL><INPUT type="checkbox" name="sport" value="sport" />Sport</LABEL>

</FORM>

위 코드를 브라우져에서 열어보자.
<LABEL>이 무슨 역할을 하는지 보는것만으로는 알 수 없다.
하지만 눈으로 보이는것이 다가 아니라는 유명한 말이 있지 않던가??
각 콤포넌트들의 옆에 있는 텍스트를 클릭해보자.
어떤가?
지금쯤 당신의 입가에 살며시 번지는 미소를 나는 알 수 있다.
바로 그것이다.
말로 설명하지 않겠다.
해봐라.
해본자와 안해본자의 차이는 하늘과 땅차이보다 클것이니.....


-----------------------------------------------------------------------------------------
2007-01-10 추가
위의 밑줄친 코드는 IE에서 제대로 작동하지 않습니다.
다음과 같이 수정하면 IE와 FF모두 정상 작동합니다.

<input id="sex1" type="radio" value="M" name="sex"><label for="sex1">Male</label>
<input id="sex2" type="radio" value="F" name="sex"><label for="sex2">Female</label>

<input id="chk1" type="checkbox" value="book" name="book"><label for="chk1">Book</label>
<input id="chk2" type="checkbox" value="game" name="game"><label for="chk2">Game</label>
<input id="chk3" type="checkbox" value="sport" name="sport"><label for="chk3">Sport</label>


posted by 초딩입맛제주아재
2007. 1. 5. 15:12 Programing/HTML/JavaScript/CSS

FIELDSETLEGEND는 우리나라의 사이트에서는 흔히 사용하지 않는 태그이다.
하지만 이 포스트를 읽고 나면 아마도 당신은 이 두 태그를 사랑하지 않을 수 없을 것이라 장담한다.

다음 캡쳐이미지를 보자.

Firefox/2.0.0.1 의 화면

언뜻 보면 레이어를 사용한 레이아웃 같다.
하지만 이어지는 코드를 보면 동공이 놀랄것이다.

<FORM action="..." method="post">
<P>
<FIELDSET>
  <LEGEND>Personal Information</LEGEND>
  Last Name: <INPUT name="personal_lastname" type="text" tabindex="1">
  First Name: <INPUT name="personal_firstname" type="text" tabindex="2">
  Address: <INPUT name="personal_address" type="text" tabindex="3">
  ...more personal information...
</FIELDSET>
<FIELDSET>
  <LEGEND>Medical History</LEGEND>
  <INPUT name="history_illness"
        type="checkbox"
        value="Smallpox" tabindex="20"> Smallpox
  <INPUT name="history_illness"
        type="checkbox"
        value="Mumps" tabindex="21"> Mumps
  <INPUT name="history_illness"
        type="checkbox"
        value="Dizziness" tabindex="22"> Dizziness
  <INPUT name="history_illness"
        type="checkbox"
        value="Sneezing" tabindex="23"> Sneezing
  ...more medical history...
</FIELDSET>
<FIELDSET>
  <LEGEND>Current Medication</LEGEND>
  Are you currently taking any medication?
  <INPUT name="medication_now"
        type="radio"
        value="Yes" tabindex="35">Yes
  <INPUT name="medication_now"
        type="radio"
        value="No" tabindex="35">No

  If you are currently taking medication, please indicate
  it in the space below:
  <TEXTAREA name="current_medication"
           rows="20" cols="50"
           tabindex="40">
  </TEXTAREA>
</FIELDSET>
</FORM>


- 이 코드는 w3c.org에서 발췌한 것임
- 원문 URL : http://www.w3.org/TR/html4/interact/forms.html#idx-label-2


예상한것과는 전혀 다르다.
레이어도 없고 테이블도 없다.

오로지 순수한 HTML 태그만을 써서 저런 레이아웃을 만들었다.
저 태그들은 IE전용 태그도 아니며 w3c에 나와있는 표준 태그이다.
어떤가, 아름답지 아니한가???
posted by 초딩입맛제주아재
2007. 1. 3. 16:18 Programing/HTML/JavaScript/CSS

CSS를 알면 손가락이 편해진다

여기는 THEAD
여기는 TBODY-1
여기는 TBODY-2
여기는 TBODY-3
여기는 TBODY-4
여기는 TBODY-5
여기는 TFOOT-1
여기는 TFOOT-2

위와 같은 모양의 테이블은 각종 리포트나 통계 페이지, 회원 목록, 가계부, 쇼핑몰의 상품 목록 등 어렵지 않게
볼 수 있다.
그리고 우리는 테이블의 각 row에 마우스를 올렸을때 배경색이 변하거나 폰트가 바뀐다거나 하는등의 이펙트를
경험 할 수 있다.

이런 효과들은 각 ROW(TR)에 onMouseOver onMouseOut 이벤트 핸들러를 통해서 마우스가 올려졌을 때와 벗어났을 때 취해야 할 행동들을 기술함으로써 구현하는 방식이 널리 통용되고 있다.

나 또한 지금껏 저와 같은 이벤트 핸들링을 통해서 구현을 해 왔으나, CSS에 관심이 증폭 되는 요즈음 심플하면서도 표준에 걸맞기 까지 한 CSS를 통한 구현방법을 찾게 되었으니 이자리에서 소개한다.



A:hover

오늘의 주인공이다.
이 CSS의 의미를 설명하자면 "<A>태그로 둘러싸인 블럭에 마우스가 올려졌을때" 라고 해석 할 수 있겠다.

<a href="#">여기를 클릭하세요</a>

이 코드를 브라우져에서 보면 "여기를 클릭하세요" 라는 밑줄이 그어진 텍스트가 보이고
이때 마우스를 텍트르 위로 가져가면 텍스트의 색이 변한다.
클릭하면 href="" 에 지정된 URL로 페이지를 이동시킨다는 설명은 굳이 하지 말것을....-_-;;

이제 저 코드위에 살짝 CSS를 입혀보자
<style>
a:hover{
  color: #FF0000;
  font-weight: 600;
}
</style>
<a href="#">여기를 클릭하세요</a>

브라우져로 이 코드를 열어보고 아까처럼 마우스를 가져가 보자....
어떤가...

분명 글자색은 red로 바뀌고 폰트가 두껍게 바뀔것이다.
a:hover{} 에서 그리 하라고 지정을 했기 때문이다.

이제 뭔가 보이는가??

이제부터가 중요하다.

우리는 겨우 <a>태그에 마우스가 올려졌을때 뭔가를 하고 싶은게 아니다. 바로 테이블의 ROW에서 뭔가를 보여주고 싶은거다!!

다시 한번 보자 a:hover

모냥 참....
하지만 뚫어져라 봐라. 보인다...보인다...
분명 ":"의 좌우로 a와 hover가 등지고 있는 모습이 보인다.
안보이는가??  그렇다면 당신의 이글아이에 축배를....

":"를 기준으로 왼쪽의 a는 태그이름이고 hover는 뭐라고 해야 좋을까나....상황? 그래 상황이라고 해두자...
이 두가지의 element가 ":"를 사이에 두고 무슨짓을 꾸미는 것이다.

음...a는 태그이름...그러면 다른 태그도 가능하겠지??
당근!!
"a"대신 "div"를 넣어보자.
div:hover

스타일을 바꿨으니 HTML코드도 살짝 바꿔보자
<style>
div:hover{
  color: #FF0000;
}
</style>
<div>여기에 마우스를 올려보아요~</div>

브라우져로 페이지를 열고 마우스를 올려보라는 곳으로 가져가보자.
역시나 글자색이 빨갛게 변할것이다.

아차차차...
여기서 한가지 짚고 넘어갈것이 있으니, IE 6.0 이하의 버전에서는 위 CSS를 인식하지 못한다는 것이다.
IE가 이상한것이니 CSS를 탓하지는 말자.


애니튼....
이제 "A" 태그뿐만 아니라 "DIV" 태그도 위의 CSS가 먹힌다는것을 알았다.
이제 남은건 우리의 목적 TR에 CSS를 적용시키는것!

단순히 TR에 마우스를 올렸을때 뭔가 변화를 주고자 한다면
<style>
tr:hover{
}
</style>
이걸로 끝이다.

하지만 곰곰히 생각을 해보자...
회원목록의 테이블의 맨 위 ROW에는 "이름,나이,직업" 등과 같은 각 필드의 설명이 자리잡고 있고
실제 데이터로의 의미는 없는 경우가 대부분이다.
그런 설명 부분의 ROW에 마우스를 올렸을때 뭔가 이펙트가 일어난다면 좀.....

자 스크롤을 위로 쭉 올려보자.
맨 처음의 테이블을 보면 thead,tbody,tfoot 이렇게 총 3개-머리,가슴,배??- 의 부분으로 나뉘어있는것을 볼 수 있다.
이것은 테이블을 만드는 방법에 대한 W3C의 표준 권고사항이니 테이블을 만들때는 이와 같은 구조로 만들기로 하자.

이렇게 테이블을 구성했다면 thead에는 "이름,나이,직업" 같은 필드의 설명을 넣고
tbody부분에는 각 회원들의 정보, 즉 실제 데이터들을 보여주고, tfoot에는 뭔가 "계(total)" 같은 것을 보여주면 좋지 않겠는가?
막상 tfoot는 꼭 필요 하지 않을 수도 있다...해서 W3C의 표준 권고안에도 tfoot은 옵션이다.. :)

정리를 해보면....
tbody에 있는 ROW에 마우스가 올려졌을때 뭔가를 해주면 된다는것으로 요약이 된다.

흠...
tbody에 있는 tr이라...
아까와는 딴판이다...tbody도 아니고 tr 도 아니고 tbody 에 있는 tr이라니...

이럴때 쓰라고 ">"가 있다.



">"의 발견

CSS에서 ">"는 포함 관계를 뜻한다.
a > b{
}
"a에 포함되어있는 객체들중 b" 라고 해석 하면 된다.

빙고!!
감이 오지 않는가?

tbody에 포함되어 있는 객체들중 tr

tbody > tr:hover

휴...
이제 끝났다.

이제 우리는 테이블 row에 마우스가 올려진 후의 일들을 걱정 할 필요가 없어졌다.
그 무지막지하게 길고도 길었던 onMouseOver=""와 onMouseOut=""은 bye~~bye~~하자.



못다한 이야기

포함 관계 이외에도 "class"라는 그룹형 속성이 있다.
class는 다음과 같이 태그에 class="클래스이름" 으로 지정한다.

<div class="mydiv">A</div>
<div class="mydiv">B</div>
<div class="mydiv">C</div>

이렇게 하면 A,B,C모두 동일한 스타일을 갖게 된다.
바로 그룹핑이 가능하다는 것이다.


mydiv라는 클래스에 마우스가 올려졌을때 뭔가를 하고 싶다면

div.mydiv:hover{}

이제 설명이 필요 없을줄로 안다.

그리고 마지막.
그룹핑도 필요 없고 오직 하나뿐인 너....
페이지내에 유일한 누군가에게 그만의 특별한 스타일을 주고 싶다면
"id"를 써라.

<div id="mydiv">A</div>
<div class="mydiv">B</div>
<div class="mydiv">C</div>

B,C는 동일한 스타일을 갖지만
A는 유일한 스타일을 갖게 된다.
단, 페이지내에서 ID는 유일해야 한다. 중복 되는 ID는 절대 불가!!

id로 스타일을 주고자 할때는
"#"을 쓴다.
#mydiv:hover{
}

'Programing > HTML/JavaScript/CSS' 카테고리의 다른 글

[HTML] LABEL과 사용자 중심의 프로그래밍-UI  (3) 2007.01.05
[HTML] FIELDSET과 LEGEND  (0) 2007.01.05
이벤트 Fake!!!  (0) 2006.12.12
키입력 이벤트처리  (2) 2006.12.06
테이블(Table) 그리기  (0) 2006.11.30
posted by 초딩입맛제주아재
2006. 12. 12. 11:03 Programing/HTML/JavaScript/CSS

Fake : 1 위조하다(counterfeit);(되는 대로) 꾸며내다, 날조하다(fabricate) 《up》
2 속이다(deceive);좀도둑질하다, 훔치다;윤색하다
3 …인 체하다, 가장하다(pretend)
4【스포츠】 페인트하다 《out》
5【재즈】 즉흥 연주하다(improvise)

여기서는 '가장하다' 또는 '속이다'의 뜻이 어울릴것같다.




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>


위 코드를 복사해서 실행해 보자.

버튼을 번갈아 눌러보자
어떤 일이 일어나는가?

'Programing > HTML/JavaScript/CSS' 카테고리의 다른 글

[HTML] FIELDSET과 LEGEND  (0) 2007.01.05
[CSS] onMouseOver,onMouseOut은 그만!!  (17) 2007.01.03
키입력 이벤트처리  (2) 2006.12.06
테이블(Table) 그리기  (0) 2006.11.30
CSS Box Model  (0) 2006.11.30
posted by 초딩입맛제주아재
2006. 12. 6. 13:37 Programing/HTML/JavaScript/CSS
키 입력 이벤트는 다양한 곳에 쓰이고 있다.
은행사이트의 계좌 입력 폼이라던지, 금액 입력 폼,
기타 이메일 입력 폼이나 키입력에 따른 처리가 필요한 어떠한 경우라도
키입력 이벤트는 쓰여진다.

금액:<input type="text" name="price" value="" onKeydown=" keyDownCheck(this);" />

위 코드를 예를 들어보면,
금액을 입력 하는 폼이므로 숫자 이외의 값이 들어가선 안된다.(경우에 따라서는 콤마도 출력 할 수 있겠지만 숫자만 입력으로 받아들이고 콤마는 내부적으로 처리해주는것이 좋겠다)

keydown 이벤트를 걸어준 이유는 사용자로부터 입력 받은 값을 체크해서
숫자가 아니면 키입력을 흘려버려야 하기때문이다.
만약 keyup 이벤트를 걸면 입력한 문자 or 숫자가 폼에 먼저 찍힌다음 이벤트 핸들러를 통해서
걸러주게 되므로 keydown이 좋은 선택이 되겠다.

keypress의 경우 firefox같은 모질라 계열의 브라우져에서 지원하지 않으므로 크로스 브라우징이
필요한 페이지에서는 사용 할 수 없다.

한가지 주의 해야 할 점은 키입력 이벤트 발생 시점이 IE와 모질라가 서로 조금씩 다르다는 것이다.
이 부분의 처리는 코드를 직접 보자.

우선 위 코드를 크로스브라우징이 가능하도록 수정하자.
인라인 스크립트는 지양해야 하므로 이벤트 핸들러를 따로 지정해주자.


금액: <input type="text" id="price" name="price" value="" />

스크립트
<script language="JavaScript">
<!--
var priceObj = document.getElementById('price');

if(window.event){
  priceObj.attacheEvent('onkeydown',priceEvtHandler);
}else{
  priceObj.addEventListener('keydown',priceEvtHandler,false);
}

function priceEvtHandler(e){
  var keyValue;

  if(window.event){
       keyValue = window.event,keyCode;
  }else{
       keyValue = e.keyCode;
  }

  if(keyValue == 13){      //enter
       return false;
  }else if(keyValue == 8){ //backspace
       return false;
  }else if((keyValue > 57 || keyValue < 48) && (keyValue > 105 || keyValue < 96)){
       if(window.event){
           window.event.returnValue = false;
       }else{
           e.preventDefault();
       }
  }
}
-->
</script>

다듬어지지 않은 코드이지만 그리 길지 않은 코드이다.
이벤트핸들러 priceEvtHandler를 살펴보면
keyValue 값으로 분기를 한다.
백스페이스는 입력된 숫자의 삭제를 위해 필요하므로 꼭 넣어 줘야 하며
엔터키의 경우는 필요에 따라 코드를 작성해주면 된다.
여기서는 아래쪽 분기문이 중요하다.
키코드 48~57은 기본키 0에서 9까지의 아스키코드값이고
96~105는 숫자패드 0에서 9까지의 아스키코드값이다.
사용자 입력이 이 범위를 벗어나면 이벤트를 그냥 흘려보내야 한다.
이때 이벤트를 흘려보내는 방식이 IE와 Mozila가 서로 다르다.
IE는 property값을 변경하고 Mozila는 메서드를 호출함으로써 이벤트를 흘려보낸다.


var reg_exp = /[0-9]/;

if(String.fromCharCode(keyValue).match(reg_exp) == null){
   if(window.event){
       window.event.returnValue = false;
   }else{
       e.preventDefault();
   }
}

위 코드를 조금 바꿔보았다.
아스키값으로 비교하는 대신에 정규식을 사용하였다.
훨씬 깔끔(?)해 보이나??

'Programing > HTML/JavaScript/CSS' 카테고리의 다른 글

[CSS] onMouseOver,onMouseOut은 그만!!  (17) 2007.01.03
이벤트 Fake!!!  (0) 2006.12.12
테이블(Table) 그리기  (0) 2006.11.30
CSS Box Model  (0) 2006.11.30
Ajax + Drag&Drop 활용 사이트  (0) 2006.11.10
posted by 초딩입맛제주아재
2006. 11. 30. 14:57 Programing/HTML/JavaScript/CSS
<table width="500" cellpadding="3" cellspacing="0" border="1" rules="none">
  <thead>
       <tr>
           <th>id</th>
           <th>name</th>
           <th>birth</th>
       </tr>
  </thead>
  <tbody>
       <tr>
           <td>1</td>
           <td>Asrada</td>
           <td>79.06.15</td>
       </tr>
       <tr>
           <td>2</td>
           <td>Wave</td>
           <td>79.06.15</td>
       </tr>
  </tbody>
  <tfoot>
       <tr>
           <td colspan="3" align="center">hello world</td>
       </tr>
  </tfoot>
</table>

HTML에서 가장 많이 쓰이는 태그는 아무래도  <table>이 아닐까 한다.
표를 그리기 위한 table태그지만 레이아웃을 잡을때도 그 역할을 톡톡히 해내는
만능 태그이다. 물론 레이아웃용으로 쓰이는건 지양해야 하지만 말이다.

<table> 알맞게 쓰기

테이블을 그리기에앞서 테이블의 용도를 먼저 생각해야 한다.
<table>태그의 존재이유는 바로 '표'를 표시하기 위함이다.
표란 말 그대로 엑셀의 시트처럼 가로세로 칸이 나뉘어진 틀을 의미한다.
학급의 학생 목록이나 은행 계좌 거래 내역같은 일정한 형식의 내용들이 반복되는 경우
표를 써서 알아보기 쉽게 표현할 수 있다.
하지만 HTML에서 표를 그리는 역할을 맡은 <table>태그는 본래의 임무보다 과도한 일을 묵묵히
수행하고 있다.
페이지의 레이아웃을 잡기 위해 쓰이기도 하고 간격을 맞추기 힘든 부분에 <table>을 써서
꼼수로 간격을 맞추기도 한다.
이것은 코드와 디자인의 분리를 더욱 어렵게 만들고 나아가 필요 없는 부하를 유발한다.
실제로 <table>태그는 <div>태그에 비해 처리 속도가 늦다고 한다.
학생은 학생답게, 남자는 남자답게, <table>은 테이블답게....??


또한 가장 많이 쓰이는 태그이다보니 가장 많은 잘못된 습관을 야기시키기도 한다.
대표적으로 form태그와의 혼용문제이다.

흔히 form태그가 들어가면 공백이 생긴다는 이유로 form태그를 table 태그 안에 넣는 경우가 있다.
<table>
<form>
</form>
</table>

하지만 위는 아주 잘못된 태깅이다.
폼태그의 공백은 css에서 form{margin: 0}을 설정해 주는 것만으로 깔끔하게 처리가 된다.
다음과 같이 폼태그가 테이블 태그를 감싸는 것이 올바른 태깅이다.
<form>
<table>
</table>
</form>

또 <tr></tr>과 <tr></tr> 사이에는 폼태그가 들어가면 안된다.
단, <td></td>사이에는 허용이 된다.
<tr><td></td></tr>
<input type="text" />               >> 잘못된 사용
<tr><td></td></tr>

<tr><td><input type="text" /></td></tr>


다음으로 흔히 접하게 되는 잘못된 사용예는 테이블에 그룹핑을 하지 않는 것이다.
표준 테이블의 모양은 다음과 같다.
<table>
  <thead>
       <tr><td></tr></td>
  </thead>
  <tbody>
       <tr><td></tr></td>
  </tbody>
  <tfoot>
       <tr><td></tr></td>
  </tfoot>
</table>

단, tfoot는 필요에 따라 빼도 상관 없다.

이렇게 그룹핑을 함으로써 얻어지는 잇점은 다음에 살펴볼 테이블의 속성에 있다.


속성(Attribute)


1.rules

rules는 셀의 경계선을 나타내는 방법을 지정하는 속성이다.
위의 테이블에 border="1" 속성을 추가해 보자.
테이블의 모든 셀들이 작은 박스로 나뉘어 구분되어진다.
이제 rules="cols" 속성을 추가해 보자.
외곽선을 제외한 가로줄이 모두 없어졌다.
rules의 값을 rows로 바꿔보자.
이번엔 세로줄이 모두 사라지고 안보였던 가로줄이 나타난다.
만약 이 속성값을 모르고 있다면 각 셀마다 일일이 css로 border 값을 설정해주느라 태그가
엉망진창이 되버릴것이다.

rules 의 속성 값에는 cols,rows,all,groups,none 가 있다.


2.frame

frame는 테이블의 외각선을 나타내는 방법을 지정하는 속성이다.
rules와 더불어 css노가다를 획기적으로 줄여주는 속성이다.

frame의 속성 값에는 void,above,below,lhs,rhs,hsides,vsides,box,border 가 있다.



스타일(CSS)

3.border-collapse

border-collapse는 css이다.
보통 테이블에 border속성을 주면 값이 1이라도 선이 굵게 나와 보기 좋지 않다.
이떼 style="border-collapse: collapse;" 라고 스타일을 지정해주면
얇은 선으로 표시가 되어 한결 깔끔해진다.
테이블에 border속성을 주지 않고 style로 border: solid 1px #000000; 과 같이 border를 만들었다면
이 문서를 프린터로 인쇄 하면 선이 보이지 않는 문제가 있다.
하지만 테이블에 border값을 주고 스타일로 collapse를 지정함으로써 위와 같은 문제를
해결 할 수가 있다.

border-collapse 속성 값에는 collapse,separate 가 있다.

4.table-layout

테이블의 각 셀에 width,height값을 주지 않으면 브라우져가 자동으로 셀의 내용에 맞게
크기를 계산하여 그리게 된다. 하지만 셀에 width,height 값을 주어도 셀의 내용이 커지면
셀의 모양이 흐트러지게 된다.
이럴때 table-layout css를 사용하면 셀의 넓이를 정확히 고정시킬수 있다.
style="table-layout: fixed;" 이렇게 스타일을 지정하면 셀 내용에 상관없이 지정한 크기로 그려진다.

table-layout 속성 값에는 fixed,auto가 있다.



위의 테이블의 속성,css는 테이블을 그리는데 있어 가장 기본적인 것들이다.
더 세세한 내용은 http://www.w3c.org 홈페이지에서 HTML의 Table 명세를 보거나 테이블관련 CSS를 보면 쉽게 정보를 얻을 수 있다.
다시한번 강조하지만 테이블로써 레이아웃을 잡는건 아주 잘못된 습관이다.
테이블의 탄생 목적은 표를그리기 위함 이라는것을 명심하자.




"Markup Language 인 HTML에서 올바른 태그는
선택이 아닌 필수이며 코더의 의무이다."

'Programing > HTML/JavaScript/CSS' 카테고리의 다른 글

이벤트 Fake!!!  (0) 2006.12.12
키입력 이벤트처리  (2) 2006.12.06
CSS Box Model  (0) 2006.11.30
Ajax + Drag&Drop 활용 사이트  (0) 2006.11.10
자동으로 Sorting 이 되는 SELECTBOX에 항목추가하기  (0) 2006.11.08
posted by 초딩입맛제주아재
2006. 11. 30. 14:22 Programing/HTML/JavaScript/CSS

렌더링 계산 방식의 차이

DIV로 레이어를 잡을때 가장 골치 아픈 문제가 레이어의 위치를 잡기가 어렵다는것이다.
테이블처럼 마음대로 위치를 잡는 일이 여간 힘든게 아니다.
이리 해도 안되고 저리 해도 안되서 결국엔 그냥 테이블로 짜는 경우가 허다하다.
하지만 테이블 본연의 임무는 표(grid)를 표시하는 일이니 억지로 다른일을 시키면 안되겠다.

아직까지는 모질라와 IE양대 진영의 브라우져간 렌더링 방식의 차이로 인해
코드 하나로 두 버전의 브라우져에서 동일한 표현을 하기는 쉽지 않다.
표준을 지키지 않는 IE때문에 개발자들만 이리저리 피곤하다.

W3C의 제안은 width값에 Border+Padding+Margin 값을 합산하는걸 표준으로 정하고 있다.
하지만 IE는 반대다.
width 값에서 Border+Padding+Margin을 뺀다.


firefox에서 가로 100px, border: 1px,padding: 10px; margin: 10px;의 박스를 그리려면
1*2 + 10*2 + 10*2 = 42
42 + 100 = 142
즉 내용이 들어갈 공간(content)의 크기는 100px이 지만 실제 표시되는 박스의 크기는 142px이 된다.

ie에서는 100-42 = 58 이므로 박스 사이즈는 100이지만
내용이 들어갈 공간의 크기는 58px이 되는것이다.



자리잡기

float,clear 두개의 속성만 이해하면 레이어의 자리잡기는 끝난다.

<div style="overflow: auto; border: solid 1px #D9D9D9;">
  <div style="border: solid 1px #D9D9D9; margin: 1px; width: 100px; height: 100px; float: left;">1</div>
  <div style="border: solid 1px #D9D9D9; margin: 1px; width: 100px; height: 100px; float: left;">2</div>
  <div style="border: solid 1px #D9D9D9; margin: 1px; width: 100px; height: 100px; clear: left; float: left;">3</div>
  <div style="border: solid 1px #D9D9D9; margin: 1px; width: 100px; height: 100px; float: left;">4</div>
  <div style="border: solid 1px #D9D9D9; margin: 1px; width: 100px; height: 100px; clear: left; float: left;">5</div>
  <div style="border: solid 1px #D9D9D9; margin: 1px; width: 100px; height: 100px; float: left;">6</div>
</div>

위 코드를 FireFox 에서 실행해 보자.

가로로 두개씩 세 줄에 걸쳐 박스 6개가 출력된다.

flat: 속성을 주면 div는 왼쪽 또는 오른쪽으로 정렬이 된다.

<div style="border: solid 1px #D9D9D9; margin: 1px; width: 100px; height: 100px; float: left;">1</div>
  <div style="border: solid 1px #D9D9D9; margin: 1px; width: 100px; height: 100px; float: left;">2</div>

clear: 속성은 float: 속성을 끝내는 속성이다.

위 코드에서 바스 하나를 추가 하면 2번 옆으로 가서 붙는다.
아래쪽에 새로운 박스를 추가 하려면 다음과 같이 clear: 속성을 추가 한다.

<div style="border: solid 1px #D9D9D9; margin: 1px; width: 100px; height: 100px; float: left; clear: left;">3</div>

2번 박스에서 float: 속성 값이 left 였기 때문에 clear: left 로 left로 지정된 floating을 끝내는 것이다.
float: right 였다면 clear: right 로 속성 값을 주면 된다.
단, clear: both 는 left와 right 를 모두 포함한다.

이 코드를 IE에서 실행해 보자.

1,2,4,6번 박스가 첫줄에 모두 표시가 되고
3,5번에 아래로 이어진다.

이것은 IE가 CSS를 올바로 해석하지 못하기 때문이다.
http://positioniseverything.net/ 이곳에 가면 IE의 버그를 확인할 수 있다.
posted by 초딩입맛제주아재
2006. 11. 10. 17:45 Programing/HTML/JavaScript/CSS
posted by 초딩입맛제주아재
prev 1 2 3 4 next