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

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 31
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 초딩입맛제주아재
2007. 1. 3. 12:44 Programing/JSP/ASP
PHP에는 exit 라는 함수를 써서 프로그램으 실행을 강제적으로 중단시킨다.
ASP에도 exit 가 있다는 검색 결과를 보고 해봤는데 안된다 -_-;

ASP에서는 Response.end 를 써서 프로그램의 실행을 중단시킨다.

Response 객체는 입/출력을 총괄하는 객체이다.


[Response 객체]

Collection
  Cookies             : 쿠키 값을 지정하고 쿠키 값을 설정할 수 있다.

Property
  Buffer                : 페이지를 버퍼에 저장할 것인지를 결정한다.
  CacheControl      : 프록시 서버가 ASP에 의해 작성된 결과를 캐시할 수 있는지 결정
  Charset              : content-type 헤더에 문자 집합 이름을 추가
 Expires              : 브라우저에 캐시된 페이지가 만료될 때까지의 시간을 설정(분)
  ExpiresAbsolute   : 브라우저에 캐시된 페이지가 만료되는 날짜와 시간을 지정
  IsClientConnected: 클라이언트가 서버와 연결을 해제했는지 나타낸다.
  Pics                  : Pics 컨텐츠 등급을 나타내는 pics-lable 응답 헤더에 대한 값을 설정
  Status                : 서버에서 반환한 값을 웹 브라우저의 상태 표시 줄에 나타낸다.

Method

  Addheader          : HTML 헤어 NAME을 Value로 설정한다.
  AppentToLog       : 요청에 대한 웹서버 로그 항목 끝에 문자열을 추가한다.
  BinaryWrite         : 문자 집합을 변환하지 않고 현재 HTTP 출력에 정보를 작성한다.
  Clear                 : 버퍼된 모든 HTML 출력을 반환한다.
  End                   : *.ASP 파일 처리를 멈추고 출력한다.
  Flush                 : 버퍼에 저장된 값을 출력한다.
  Redirect             : 다른 URL에 연결
  Write                 : 현재의 HTTP 출력에 변수를 문자열 형태로 대입

'Programing > JSP/ASP' 카테고리의 다른 글

웹 프린터  (0) 2007.05.23
ASP: 동적 include  (1) 2007.05.22
ASP의 가변변수  (1) 2007.04.19
[펌]톰캣과 아파치,IIS연동에 관하여  (0) 2007.01.12
posted by 초딩입맛제주아재
2006. 12. 28. 11:07 Programing/Smalltalk
TDD(Test Driven Development)는 테스트가 개발을 주도하는 방법으로서, 테스트가 코딩의 방향을 이끌게 된다. 테스트를 실패하는 코드가 없으면 코딩을 하지 않고, 코드 상에 중복이 있으면 제거하는 간단한 규칙을 적용하여 자연스럽게 코드를 만들어 간다.

- 켄트 백의 저서 "테스트주도개발"에 대한 "NAVER 책" 소개글 중 -

'Programing > Smalltalk' 카테고리의 다른 글

문자열조작  (0) 2007.05.22
Smalltalk의 편리함과 백업의 중요성  (1) 2006.12.28
가계부 만들기 - 짧은숙제  (0) 2006.11.16
가계부 만들기 - 08  (0) 2006.11.16
가계부 만들기 - 07  (0) 2006.11.16
posted by 초딩입맛제주아재
2006. 12. 28. 11:06 Programing/Smalltalk
어제 달룟님과 메신져로 "가계부" 프로그램을 작성하면서 새삼 Smalltalk 의 편리함을 실감했다.
C,Java,PHP 등 지금껏 접한 언어들은 한 프로젝트에 딸리는 파일들이 수십개에서 많게는 수백개이어서
소스 공유가 여간 번거롭지않다.
하지만 Smalltalk는 파일 세개, workspace가 필요하다면 workspace파일도 추가가 되어 4개로 끝이다.
.chg, .img, .sml 그리고 workspace 확장자인 .st 가 그것들이다.

chg파일은 이름에서 풍기는 이미지처럼 변경기록이다.
이미지의 변경 내역을 담고 있다.

img파일은 가장 중요한 이미지파일.

sml파일은 소스코드이다.
classbrowser나 workspace에서 컴파일된 코드들이 그대로 담겨있다.


이 세개의 파일은 수시로 백업을 하는 습관이 필요하다는것을 어제 절실히 깨닳았다.

실수로 Object  클래스의 name: 메서드를 호출하여 이미지가 깨졌는데
다행히도 작업전 달룟님께 보냈던 위 파일들이 있었고 그 후로 달룟님도 내가 보낸 이미지로 작업을 하셨던터라
난 깨진 이미지를 과감히 삭제하고 다시 달룟님으로부터 이미지를 전송받아 무슨일이 있었냐는듯 코딩을 계속할 수 있었다.

'Programing > Smalltalk' 카테고리의 다른 글

문자열조작  (0) 2007.05.22
Smalltalk의 TDD  (0) 2006.12.28
가계부 만들기 - 짧은숙제  (0) 2006.11.16
가계부 만들기 - 08  (0) 2006.11.16
가계부 만들기 - 07  (0) 2006.11.16
posted by 초딩입맛제주아재
2006. 12. 23. 01:27 Programing/Java
내 컴퓨터 -> 속성 -> 고급 -> 환경변수 -> 시스템 변수

1.JAVA_HOME 새로만들기클릭
      변수이름 : JAVA_HOME
      변수값 : 자바 jdk 를 설치한 위치를 지정 예) C:\Program Files\Java\jdk1.5.0_09

2.CLASSPATH 새로만들기클릭
      변수이름 : CLASSPATH
     변수값 : .;%JAVA_HOME%\lib\tools.jar


3.PATH 기존변수수정
      변수이름 : Path
     변수값 : java 가 설치된 디렉토리 밑의 bin 디렉토리 예) C:\Program Files\Java\jdk1.5.0_09\bin;

다 했으면 확인을 누르고 창을 닫자.

이제 설정이 잘 되었는지 확인할 차례

윈도우키+ R 을 누르면 "실행" 다이얼로그가 뜬다.
cmd를 타이핑 하고 엔터.
까만바탕의 커멘드 콘솔이 뜬다.

path를 입력해보자.
조금전에 수정한 path가 뜨면 일단 제대로 설정은 된것.
java를 입력해보자.
뭐라고 주루룩 뜨면 성공.

이제 준비는 끝났다.

'Programing > Java' 카테고리의 다른 글

JavaOne2007 Wrap-up 세미나  (0) 2007.09.03
제8회 한국 자바 개발자 컨퍼런스  (0) 2007.02.24
에디트플러스 자바 컴파일/실행 설정  (0) 2006.10.16
SWT 연습 - FileTreeContentProvider  (0) 2006.10.13
SWT Study  (0) 2006.10.13
posted by 초딩입맛제주아재
2006. 12. 12. 15:05 Programing/아뜰리에
친구의 부탁으로 간단하게 만들어보았다.
실행권한을 주고 CLI모드에서 실행하면 된다.

간단하게 인자 두개를 입력 받는데
첫번째 인자값은 찾을 확장자,
두번째 인자값은 바꿀 확장자이다.

./file_rename.php php php4
이렇게 하면 현재 디렉토리 내의 확장자가 php인 모든 파일의 확장자가 php4로 바뀐다.


코드는 무척 간단하다...

#!/usr/local/php/bin/php -q
<?php
/**
* filename : file_rename.php
* author   : asrada2001@hotmail.com
* date     : 2006-12-12
* desc     : 현재 디렉토리에 존재하는 파일의 확장자 일괄 변경
**/

if(sizeof($argv) < 3 || $argv[1] == Null || $argv[2] == Null){
  echo "require two arguments...\n\n";
  exit;
}

$dir = '.';

$searchExt = '.'.$argv[1];
$replaceExt = '.'.$argv[2];

if($handle = opendir($dir)){
  while (false !== ($file = readdir($handle))){
       if($file != '.' && $file != '..' && strpos($file,$searchExt) > 0){

           $fname   = substr($file,0,strrpos($file,$searchExt));
           $newName = $fname.$replaceExt;

           if(rename($file,$newName) == true){
               echo $file.' -> '.$newName." [OK]\n";
           }else{
               echo $file.' -> '.$newName." [FALSE]\n";
           }
       }
  }

  closedir($handle);
}
?>


주의 할 것은 소스파일의 맨 윗줄을 공백으로 두면 안된다는것이다.
친구놈이 소스코드를 메신져로 던져줬더니 붙여넣기 하면서 한줄을 공백으로 비워두고는
안된다고 타박을 해댔다 -_-;;

필요에 의한 개발은 언제나 재밌다.
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 초딩입맛제주아재