'82.웹접근성을고려한웹개발'에 해당되는 글 41건

  1. 2011.07.05 Open User Interface Framework
  2. 2011.06.03 우리은행 웹접근성 가이드라인
  3. 2011.01.18 웹접근성 웹개발시 쓰고 파이어폭스 플러그인 1
  4. 2011.01.18 XHTML Strict에서 target="_blank" 속성 사용법
  5. 2011.01.18 웹 표준, 추천도서
  6. 2011.01.05 IE inerText -> EE innerHTML
  7. 2011.01.04 웹 접근성 도구 모음
  8. 2010.12.21 w3c img tag 에 onclick="javascript:self.close();" 문제점
  9. 2010.12.16 잘못된 웹표준, 웹접근성 상식
  10. 2010.12.16 웹 접근성을 위한 자바스크립트 적용 방법 (Graceful Degradation vs. Progressive Enhancement) 1
  11. 2010.12.16 웹 접근성 고려한 “관련사이트 바로가기” 구현 방법
  12. 2010.12.16 웹 표준, 웹 접근성 고려한 플래시 사용
  13. 2010.11.25 웹표준 기본부터 시작하기
  14. 2010.11.22 How to use entities for special characters
  15. 2010.11.22 Images as submit buttons
  16. 2010.11.22 웹접근성을 고려한 Form URIs
  17. 2010.11.22 웹접근성을 고려한 javascript: URIs 사용예
  18. 2010.11.22 innerHTML 을 쓰지 말고 createElement 로 사용해라.
  19. 2010.11.22 form 안에 input 태그 타입이 image 일경우 폼을 서브밋함.
  20. 2010.11.22 [펌] 접근성을 해치지 않는 자바스크립트의 사용
  21. 2010.11.22 [펌] UI 개발자를 위한 북마크
  22. 2010.11.22 [펌] 웹표준 가이드라인 모음
  23. 2009.12.03 20091203 ajax 모듈화
  24. 2009.12.03 httpRequest 객체 모듈화 하기
  25. 2009.12.03 httpRequest 객체화 하기...
  26. 2009.12.03 xml xsl 적용한 예제..ajax
  27. 2009.12.03 ajax 교육내용
  28. 2009.12.03 AJAX!! httpRequest...
  29. 2009.12.02 prototype 메소드 오버라이딩
  30. 2009.12.02 prototype 상속
반응형


Browser Compatibility

  • Internet Explorer 6~8
  • Firefox Latest Version
  • Safari Latest Version
  • Chrome Latest Version
  • Opera Latest Version

OUIF SVN Checkout

OUIF Map

  1. Default Set
    1. HTML 4.01 Transitional
    2. XHTML 1.0 Transitional
    3. HTML5 | HTML5 enable script
    4. CSS
    5. jQuery
  2. CSS Selector Rules
    1. Naming Guide
    2. Logical Usage
  3. CSS Framework For Layout
    1. XE CSS Framework For Layout | Manual
  4. CSS3 References
  5. Icon Library
    1. Fugue (Preview) - 2,627 icons 16x16, 24x24 (Creative Commons Attribution 3.0 License)
    2. FAMFAMFAM (Preview)- 700 icons 16x16 (Creative Commons Attribution 3.0 License)
    3. Icon Finder - Free Icons
    4. Find Icons - Free Icons
    5. Icon Pedia - Free Icons
  6. User Interface Object
    1. Box
      1. Regular - quirks | html | xhtml | html5
    2. Button
      1. Button Area - quirks | html | xhtml | html5
      2. Single - quirks | html | xhtml | html5
      3. Package - quirks | html | xhtml | html5
    3. Calendar
      1. jQuery Datepicker - quiks | html | xhtml | html5
    4. Editor
      1. SmartEditor Basic - Demo | Skin | Download
    5. Form
      1. Form Table - quirks | html | xhtml | html5
      2. Log-in
        1. Modal Windowed Login - quirks | html | xhtml | html5
      3. Registration - quirks | html | xhtml | html5
      4. Search
        1. Regular - quirks | html | xhtml | html5
    6. Graph & Progress & Loading
      1. Horizontal - quirks | html | xhtml | html5
      2. Inline - quirks | html | xhtml | html5
      3. Vertical - quirks | html | xhtml | html5
      4. Loading Icon - quirks | html | xhtml | html5
      5. Modal Windowed Loading - quirks | html | xhtml | html5
      6. Modal Windowed Progress - quirks | html | xhtml | html5
    7. Layer
      1. Modal Windowed Layer - quirks | html | xhtml | html5
    8. List
      1. Text
        1. UL(Unordered List) - quirks | html | xhtml | html5
        2. OL(Ordered List) - quirks | html | xhtml | html5
      2. Image
        1. Fixed Image Col - quirks | html | xhtml | html5
        2. Flexible Image Col - quirks | html | xhtml | html5
        3. Fixed Image Row - quirks | html | xhtml | html5
        4. Flexible Image Row - quirks | html | xhtml | html5
      3. FAQ - quirks | html | xhtml | html5
    9. Navigation
      1. Skip Navigation - quirks | html | xhtml | html5
      2. Horizontal
        1. Bar - quirks | html | xhtml | html5
        2. Lined Tab - quirks | html | xhtml | html5
        3. Faced Tab - quirks | html | xhtml | html5
        4. List Tab - quirks | html | xhtml | html5
      3. Pagination
        1. Regular - quirks | html | xhtml | html5
        2. Simple - quirks | html | xhtml | html5
        3. Complex - quirks | html | xhtml | html5
      4. Vertical
        1. Bar - quirks | html | xhtml | html5
        2. Tree - quirks | html | xhtml | html5
    10. Select - quirks | html | xhtml | html5
    11. Star Rating
      1. Regular - quirks | html | xhtml | html5
    12. Table
      1. Multiple Header - quirks | html | xhtml | html5
    13. Tag Cloud - quirks | html | xhtml | html5

Posted by 1010
반응형
Posted by 1010
반응형
사용자 삽입 이미지
Posted by 1010
반응형

XHTML Strict부터는 target속성이 폐기되었습니다. (이용자의 이동 선택권 침해 때문)

따라서 xhtml strict를 준수하기 위해서는 아래의 방법을 사용해 새로운 창을 띄워야 합니다.


<a href="http://www.aaa.com" onclick="window.open(this.href,'_blank');return false;">[이동]</a>

원칙대로 생각해보자면 위의 방법도 사용하지 않는것이 옳습니다만, 불가피하게 사용할때는 유용한 방법입니다.

 

단, 위의 방법 사용시에는 레퍼러가 남지 않습니다.


출처 : http://ajax.textcube.com/2

Posted by 1010
반응형
 

첫째, ‘실전 웹 표준 가이드’(무료배포, PDF형식)로 웹 표준 개념잡기

아직 ‘실전 웹 표준 가이드(모질라 커뮤니티 배포)’ 라는 문서를 접해보지 못한 분이 계시다면 우선 읽어보실 것을 권합니다. ‘실전 웹 표준 가이드’ 는 국내에서 웹 표준으로 잘 알려진 분들(윤석찬, 신현석, 이성노, 신정식)께서 저작하고 ‘KIPA(한국소프트웨어진흥원)‘ 와 ‘IABF(정보통신 접근성 향상 표준화 포럼)‘ 에서 무료로 배포하는 PDF 형식의 자료 입니다. 목차는 아래와 같으며 다른 어떤 서적보다 먼저 읽어볼 것을 권해드립니다. 표준 XHTML/CSS/DOM 구현 기법과 웹 표준 방식의 개발 프로세스에 대한 개념을 전반적으로 다루고 있습니다.

  1. 실전 XHTML 가이드
  2. 실전 CSS 레이아웃
  3. 실전 DOM/Script 가이드
  4. 실전 표준 웹 프로그래밍
  5. 실전 웹 표준 개발 프로세스
  6. 웹 표준 브라우저 호환표

PDF 형식의 ‘실전 웹 표준 가이드’ 직접 다운로드: 모질라 방문

둘째, ‘웹 접근성을 고려한 콘텐츠 제작기법’(무료배포, PDF)으로 HTML 다시배우기

‘실전 웹 표준 가이드’ 가 웹 표준과 관련하여 다양한 실무분야를 다룬것에 비하여 KADO(한국정보문화진흥원) 에서 발간한 연구보고서 ‘웹 접근성을 고려한 콘텐츠 제작기법‘ 은 (X)HTML의 바른 바크업(Valid Markup & Semantic Markup)에 대하여 보다 집중적으로 세세하게 다루고 있습니다. 웹 표준을 처음 접하는 개발자들은 당장의 필요(현실)에 의하여 바른 Markup 보다 CSS 관련기법을 먼저 학습하는 경우가 많은것 같은데 이는 다소간의 조율이 필요합니다. Markup 이 잘못되면 아무리 유능한 CSS 기법이라 할지라도 ‘그 의미가 없다’ 할 수 있습니다. ‘실전 웹 표준 가이드’ 다음으로 읽어볼 것을 추천합니다. 이 문서에는 ‘한국형 웹 콘텐츠 접근성 지침(KWCAG) 1.0‘ 이 함께 첨부되어 있습니다. 참여(최두진 센터장, 김석일 교수, 홍경순 팀장, 조웅희 대표, 신승식 과장, 현준호 전임연구원).

  1. 웹 접근성이란?
  2. 대체 텍스트
  3. 동영상
  4. 색상
  5. 이미지 맵
  6. 프레임
  7. 깜박임, 움직임
  8. 장치 독립성
  9. 링크를 통한 이동
  10. 시간 제한
  11. 데이터 테이블
  12. 콘텐츠의 배치
  13. 온라인 양식(form)
  14. 스크립트, 애플릿
  15. 별도(대체) 페이지
  16. 첨부 : 한국형 웹 콘텐츠 접근성 지침 1.0

PDF 형식의 ‘웹 접근성을 고려한 콘텐츠 제작기법’ 직접 다운로드 : 모질라 제공

셋째, 예제중심의 ‘웹 표준 완전정복 세트’(3권 1셋)로 CSS 스킬 향상

아래 소개하는 책보다 지금은 미투데이 서비스로 더욱 유명해지신 박수만님께서 번역하신 책입니다. 아래 책은 가장 많은 분들에게 알려져 있어서 굳이 설명이 필요없을것 같습니다. 최근에는 3권을 하나의 셋트로 묶어 ‘웹 표준 완전정복‘ 이라는 패키지로 판매(정가 66,000, 할인가 59,400)하고 있군요. 예제중심이므로 CSS에 대한 기본지식이 있다면 아래 세권은 모두 빠르게 읽어내려가실 수 있습니다.

  1. 실용예제로 배우는 웹표준
    1. 리스트
    2. 머리글
    3. 테이블을 쓰면 안된다?
    4. 인용문
    5. 구문표현 엘리먼트
    6. 앵커
    7. 리스트의 고급 기능
    8. 마크업 용량 줄이기
    9. CSS적용하기
    10. 인쇄를 위한 스타일
    11. CSS로 레이아웃 잡기
    12. 텍스트 스타일
    13. 이미지 바꿔치기
    14. <body>를 위한 스타일
    15. 새로운 도약
    16. 부록1 – 웹 표준 블로그 만들기
    17. 부록2 – 국내외 웹 접근성 소개 및 현황
  2. 웹 2.0을 이끄는 방탄웹
    1. 글꼴 크기를 내 마음대로
    2. 자유롭게 크기가 조절되는 네비게이션 메뉴바
    3. 자유자재로 높낮이가 조절되는 행 만들기
    4. 나만의 Float 활용 비법
    5. 깨지지 않는 상자 만들기
    6. 이미지나 CSS가 없이도 볼 수 있게 하기
    7. 쉽게 변환할 수 있는 테이블 만들기
    8. 유동적인 레이아웃 만들기
    9. 방탄웹 구축 완결 종합편
  3. CSS 마스터 전략
    1. 기초 다지기
    2. 화면 표시를 위한 모델 완벽 정리
    3. 배경 이미지와 이미지 대치 기법
    4. 링크 모양 꾸미기
    5. 리스트 스타일과 네비게이션 바 만들기
    6. 접근성 높은 폼과 테이블 만들기
    7. 레이아웃
    8. 핵과 필터
    9. 브라우저 버그 해결하기
    10. 부록1 – 동호회 사이트 만들기
    11. 부록2 – 투스카니 럭셔리 리조트

YES24에서 ‘웹 표준 완전정복’ 구매하기

넷째, ‘웹 표준 교과서’로 W3C의 방대한 표준 스펙 이해하기

저는 지금도 (X)HTML/CSS 스펙을 확인하기 위하여 일주일에 2~3번은 W3C 웹사이트에 방문합니다. 하지만 W3C에 방문해도 원하는 목적을 달성하지 못하는 경우가 있는데, 그 의미가 명확하지 않거나 원문으로 되어 있어서 이해하기 힘들기 때문입니다. 처음 ‘웹 표준 교과서‘라는 책을 받았을 때에는 마치 사전 같다는 생각을 했는데 정말 사전 같습니다.(ㅡㅡ;) 그리고 마치 W3C의 스팩 해설서 같습니다. 이런 책을 보면 안읽고는 배겨내기 어렵기 때문에 앞에서부터 보려고 시도하였지만 이러한 방식 보다는 가까운 곳에 두고 필요할 때마다 필요한 페이지를 펼쳐보는 방식으로 접근해야 겠다고 생각을 바꿨습니다. 지금까지 소개한 책들 가운데 가장 빈틈없는 웹 표준 서적이라고 소개드리고 싶습니다. NmindPlus라는 블로그로 잘 알려져 있고 NHN Japan에 근무하시는 김대석님께서 번역해 주셨습니다.

  1. 소개 – 웹표준은 무엇인가
  2. 문서구조 – XHTML 웹페이지 구축 시작
  3. 시각표현 – CSS 웹페이지를 자유롭게 디자인 하기
  4. 상호작용 – 웹 사이트를 장식하는 다양한 콘텐츠
  5. 리디자인 – 웹표준으로 매끄러운 전환
  6. 크로스 브라우저 레이아웃 – 브라우저를 차별하지 않는 레이아웃 기법
  7. 접근성 – 다양한 사용자를 배려하는 설계
  8. 메타데이터 – 효율적인 정보 수집을 지원하는 웹 기술

YES24에서 ‘웹 표준 교과서’ 구매하기

다섯째, ‘DOM 스크립트’로 Javascript 다시 배우기

DOM 스크립트‘는 기존의 자바스크립트 서적과는 확실히 다릅니다. 자바스크립트 문법을 알려주기 전에 ‘지금 구현하려고 하는 기능이 정말 사용자에게 유용한 것인가? 오히려 웹의 가치를 훼손하고 있지는 않은가?’ 라는 질문을 던져주고 사용성과 접근성을 해치지 않으면서도 웹 표준에 근거한 겸손한 코드를 작성할 수 있도록 개념을 새롭게 환기시켜 주는 책입니다. 웹의 접근성을 떨어뜨리지 않으면서 사용자 경험을 확장할 수 있는 방법으로 고민하고 있다면 이 책이 좋은 입문서가 될 것 같습니다. 특히, 이 책에서 소개하고 있는 ‘단계적 기능축소, 스크립트 분리’와 같은 개념들은 매우 중요하게 생각되는군요. 한국의 대표적인 웹 표준 전도사로 잘 알려진 다음 커뮤니케이션의 윤석찬님께서 번역하셨습니다.

  1. 간단히 살펴보는 자바스크립트 역사
  2. 자바스크립트 문법 익히기
  3. 문서 객체 모델(DOM)이란?
  4. 자바스크립트로 만드는 온라인 사진첩
  5. 꼭 알아야 할 핵심 기본기
  6. 사진첩 기능 개선하기
  7. 실행 시에 마크업 코드 생성하기
  8. 의미가 살도록 컨텐츠 개선하기
  9. CSS와 DOM 연동하기
  10. 애니메이션 슬라이드쇼 만들기
  11. 총정리 : 더블트랙 밴드 웹사이트 제작
  12. DOM 스크립트의 미래
  13. 부록1 – 유용한 DOM 메소드와 프로퍼티
  14. 부록2 – 웹 표준 기반의 멋진 DOM 스크립트 예제
  15. 부록3 – 다이내믹한 웹사이트를 위한 고려 사항


출처 : http://web.dicnote.com/bbs/board.php?bo_table=web_tip&wr_id=718

Posted by 1010
반응형
ie 에서 사용한걸
f.txtEstopn.value = eval("document.all."+estopn+".innerText");
 


ee 에서도 사용하게..
 f.txtEstopn.value = document.getElementById(estopn).innerHTML;
Posted by 1010
반응형
1. W3C html Validator : Xhtml 1.0 Transitional 표준 문법 준수 판단
http://validator.w3.org

2. W3C CSS Validator : CSS2.1표준 문법 준수 판단
http://jigsaw.w3.org/css-validator

3. Kado-Wah : 웹접근성 자동 검증툴
http://www.wah.or.kr/Achive/Kadowah.asp

4. AIS : IE에서 작동하는 웹접근성 툴바
http://www.visionaustralia.org.au/ais/toolbar

5. Firefox Webdeveloper Toolbar : 파이어폭스 웹접근성 툴바
https://addons.mozilla.org/ko/firefox/addon/60
Posted by 1010
반응형
img tag 에 onclick="javascript:self.close();" 을 사용하면 w3c에 잘못된 형식이라고 나온다


이때는


<img src="/image/biz/s_close.gif" width="42" height="25" onclick="self.close();" style="cursor:hand" alt="현재창을 닫습니다.">


이런식으로...img 안에 self 내장객체를 인식하지 못해서 그런거 같기도 하고...

여튼..대충 보면 알듯...
Posted by 1010
반응형

잘못된 웹표준, 웹접근성 상식

웹표준을 준수하기 위해서는 XHTML을 써야 한다?

HTML 4.01을 잘 준수해도 웹표준을 준수한 것이다. 웹표준에서 중요한 것은 어떤 종류의 마크업 언어를 사용했는냐 보다 요소와 속성의 의미를 얼마나 잘 이해하고 적절히 문법에 맞게 사용했는지이다.

Strict DTD에서는 CSS 핵을 사용할 수 없고 Transitional DTD에서는 사용할 수 있다?

DTD와 CSS 핵 사용 가능 여부는 전혀 관련이 없다. CSS 핵을 쓰는 것은 표준에 위배되는 것을 감수하고 사용하는 것이고 특정 DTD라고 해서 핵의 사용이 허용되는 것은 아니다. Transitional DTD를 썼다고 해서 CSS 핵을 마구 사용해도 되는 것은 아니다.

CSS 핵은 특정 브라우저를 겨냥한 방법이기 때문에 되도록 사용을 피해야 하고 사용할 때에도 제한적으로, 다른 대안이 없을 경우에만 사용해야 한다.

Transitional DTD나 Frameset DTD를 사용하면 쿽스모드(quirks mode)로 랜더링 된다?

쿽스 모드로 랜더링 될 것인가 표준 모드로 랜더링 될 것인가는 DTD의 종류보다는 DTD의 선언 방법에 의해서 결정된다. Transitional DTD를 선언하더라도 표준모드로 랜더링되는 경우가 있다.

DIV 요소의 사용을 되도록 피해야 한다?

DIV 요소가 너무 남용되는 것은 문제이지만 그렇다고 DIV 요소의 사용을 너무 배척할 필요는 없다. DIV 요소는 내용을 그루핑하는 목적도 있기 때문에 표현하는 콘텐츠에 따라서 디자인적인 용도와 무관하게 사용할 수 있다. DIV를 사용하지 않은 코드보다는 DIV 요소와 적절한 id, class를 사용한 코드가 가독성도 훨씬 높다.

물론 <div class="round-button"><div><div><a href="list.html">목록</a></div></div></div> 이런 경우는 DIV 과용으로 피해야 하는 경우이다.

FRAME, IFRAME은 접근성을 해치므로 사용해서는 안된다?

과도하게 많은 프레임을 사용하는 것은 페이지 구성상도 좋지 않고 접근성을 해치게 된다. 하지만 프레임을 사용해야 하는 이유가 충분하고 접근성있게 프레임을 사용했다면 어떤 경우에는 프레임을 사용하는 것이 더 접근성이 좋을 수도 있다.

접근성을 높인다고 표준에 정의되어 있는 특정 요소나 기능을 배제할 필요는 없다. 접근성을 높이는 방법은 다양한 선택권을 사용자에게 주는 것이지 특정 형태만 강요하는 것이 아니다.

title 속성은 툴팁이나 스크린리더에서 읽혀질 내용을 제공할 때 사용된다?

title 속성은 추가적인 정보를 제공하기 위해서 사용된다. 대부분의 브라우저는 이를 툴팁으로 보여주고 있지만 브라우저에 따라서는 이를 이렇게 처리하지 않을 수도 있다. 스크린리더 역시 이 정보를 활용하지만 스크린리더를 위해서 이 정보를 제공하는 것은 아니다.

HTML 태그와 속성의 의미를 잘 이해하고 사용하는 것이 중요하다. 브라우저나 특정 사용자 기기에서 구현된 모습을 보고 원래의 의미를 혼동해서는 안된다.

summary, CAPTION을 사용하여 스크린리더에 정보를 제공한다?

summary, CAPTION, scope, header 등을 사용할 경우 이를 스크린리더가 참조할 수는 있다. 하지만 이러한 속성과 요소가 스크린리더만을 위한 것은 아니다. HTML의 의미를 이해하고 이에 맞게 사용해야지 특정 브라우저나 사용자 기기만을 염두에 두고 HTML을 구성해서는 안된다.

내부(internal) 스타일 시트가 외부(external) 스타일 시트보다 우선순위가 높다?

내부 스타일 시트 선언은 문서 안에서 STYLE 요소를 이용해서 선언하는 것을 말하고 외부 스타일 시트 선언은 LINK 요소를 이용해 외부의 .css 파일을 링크하는 것을 말한다. 이 두가지 방법의 우선순위는 같고 전적으로 선언한 순서에 따라서 적용 순위가 달라진다. 내부 스타일 시트를 먼저 선언하고 그 아래에 외부 스타일 시트를 불러온다면 내부가 아닌 외부 선언이 적용되게 된다.

반면에 style 속성을 이용한 인라인(inline) 스타일 선언은 위의 두가지 보다 우선순위가 높다.

시각 장애인을 위해서는 TTS를 사용한 음성 서비스와 글자 확대, 축소를 제공해야 한다?

특정 장애 유형을 위한 서비스를 제공할 때에는 사용자 환경을 잘 고려해서 제공해야 한다. 전맹인 시각 장애인은 스크린리더기 운영체제에 설치하거나 운영체제에서 제공하는 스크린리더를 사용하고 있기 때문에 웹사이트에서 제공하는 음성 서비스는 쓸 수 없다. 오히려 웹사이트에서 나오는 소리로 인해 스크린리더 사용을 방해 받을 수 있다.

글자 확대, 축소기능은 운영체제나 브라우저와 같은 소프트웨어에서 이미 제공이 되고 있는 기능이다. 웹사이트에서 별도의 서비스로 이러한 기능들을 제공하기 보다는 사용자가 이러한 기능들을 사용했을 때 글자 크기가 자유롭게 변경이 되도록 제작하는 것이 중요하다. 또한 텍스트를 이미지로 제공하지 않는 것도 이러한 기능들이 잘 작동할 수 있게 해주는 방법이다.

운영체제 수준에서 제공되는 접근성 기능을 잘 파악하여 이러한 기능을 사용자가 사용할 때 불편함이 없도록하는 것이 더욱 중요하다.

청각 장애인을 위해서 음성이나 소리로 내용을 전달하지 않아야 한다?

음성이나 소리'만'으로 내용을 전달하게 되면 문제가 되지만 음성, 음악 등을 텍스트와 같은 다른 수단과 함께 내용 전달 수단으로 활용하는 것은 사용자에게 다양한 선택권을 보장해 주는 것이기 때문에 오히려 정보 전달력을 높이게 된다.

색각 장애인을 위해서 이미지에 대체 텍스트를 제공하고 되도록 이미지로 내용을 전달하지 않아야 한다?

색각 장애인은 색상을 잘 구별하지 못하지만 이미지를 충분히 판독하고 이해할 수 있다. 이미지에 대한 대체 텍스트는 이미지를 활용하지 못하는 경우에 제공되는 정보이기 때문에 색각 장애인은 이 대체 텍스트에 접근을 하지 않는다. 색상'만'으로 정보를 제공하는 것은 문제가 되지만 대체 텍스트와 같은 텍스트 정보와 이미지를 같이 활용하는 것은 오히려 도움이 된다. 색각 장애인을 위해서는 색상외에 대체 텍스트가 아닌 이미지와 함께 판독이 가능한 텍스트 정보, 색상 외에도 구분할 수 있는 패턴이나 아이콘을 같이 제공하면 된다. 이렇게 색상에 비의존적으로 정보를 제공하게되면 색각 장애인 뿐만 아니라 흑백 인쇄와 같이 색상을 사용할 수 없는 환경에서도 도움이 된다.


출처 : http://hyeonseok.com/soojung/webstandards/2010/06/19/586.html

Posted by 1010
반응형

두서에서 밝힙니다. 이글은 웹 페이지에서 javascript 를 사용함에 있어 “Graceful Degradation” 과 “Progressive Enhancement” 에 대해서 말하고 있습니다. 이렇게 운을 떼는건 이 두가지가 오래전부터 회자되어 온 새로운게 아니란겁니다. 관련해서 잘 아시는 분은 읽지 않으셔도 됩니다 :)

Graceful Degradation

Graceful Degradation 은 “우아한 낮춤”, “적절한 퇴보”, “성능 저하” 등 여러가지로 번역되고 있습니다.

의미는, 먼저  최신의 기술 기반 혹은 최신의 기기에서 동작하는 기능을 만들고 나서 오래된 기술 기반 혹은 오래된 기기에서도 유사하게 (성능을 낮춰서라도) 동작하도록 조치하는것을 말합니다. 이런 의미에서 위의 번역들은 모두 틀리지 않다고 할 수 있겠습니다. (광의적으로 “성능 저하”도 틀리지는 않지만 웹 개발의 관점에서 보면 사용자 경험을 낮춰서라도 기능을 지원하는 것이기 때문에 “성능 저하”는 맞지 않을 것 같네요.)

※ 컴퓨터 시스템에서의 허용 오차 시스템(Fault tolerant system) 과 유사하다고 할 수 있습니다. 허용 오차 시스템은 프로그램 구동 환경에 문제가 생겨도 프로그램이 정지하지 않고 성능을 낮추면서 프로그램 구동을 지속하도록 하는 시스템을 말합니다.

우리가 잘 알고 있는 예를 들자면 IMG 태그에 alt 속성을 지정하는걸 들 수 있겠네요. 이미지를 표시하는 브라우저에서는 이쁘게 이미지를 표시하지만 텍스트 브라우저라든지 이미지를 렌더링하지 못하는 브라우저에서는 alt 속성에 부여한 대체 텍스트를 표시하도록 구성 합니다. (이 예에서는 성능을 낮춘다기보다 사용자 경험을 낮춰서라도 … 의 표현이 어울리겠네요. )

javascript 관점에서 Graceful Degradation 을 보자면 NOSCRIPT 라는 태그를 들 수 있습니다. 보통 NOSCRIPT 는 두가지 방식으로 사용됩니다.

NOSCRIPT (대체 콘텐츠 제공)

1.<script type="text/javascript" src="slide.js"></script>
2.<noscript>
3.<ul>
4.<li><a href="some url"><img src="1.jpg" alt="image 1"/></a></li>
5.<li><a href="some url"><img src="2.jpg" alt="image 2"/></a></li>
6.<li><a href="some url"><img src="3.jpg" alt="image 3"/></a></li>
7.</ul>
8.</noscript>

위의 예제에서 slide.js 는 서버로부터 이미지 3개를 받아 사용자 경험이 풍부한 스라이드 쇼를 만드는 스크립트입니다. (있다고 칩시다 –;) 바로뒤에 NOSCRIPT 태그를 사용해 스크립트가 동작하지 않는 브라우저에게 대신할 수 있는 콘텐츠를 제공하고 있습니다.

꽤 괜찮은 방법이라고 생각합니다. 자바스크립트가 구동되지 않는 환경에서도 콘텐츠에 접근할 수 있으며 IMG에 alt 를 제공하고 링크까지 걸려 있어 검색엔진도 좋아하는 형태입니다.

이 예에서의 문제는 NOSCRIPT 태그의 근본적인 문제입니다. 브라우저는 자바스크립트를 지원하지만 자바스크립트 파일을 통제하는 네트웍 환경 (보안상의 이유로?)에 있거나 자바스크립트를 다운로드 하지 못한 경우 사용자는 아무것도 볼 수 없게 됩니다.

NOSCRIPT (자바스크립트를 켜세요 ?)

1.<script type="text/javascript"  src="slide.js"></script>
2.<noscript>
3.<p>자바스크립트를 지원하는 브라우저를 사용하거나, 자바스크립트를 활성화 시켜 주세요</p>
4.</noscript>

우리는 사용자가 왜 자바스크립트가 동작하지 않는 브라우저를 사용하는지, 자바스크립트를 비활성화 시켰는지 알지 못합니다. 그런 상황에 사용자에게 “이래라, 저래라” 하는것은 좋은 방법이 아닙니다. 그리고 위 지시 문은 사용자가 자바스크립트가 뭔지 알고 있고, 자바스크립트를 활성화 시킬 수 있다고 가정하고 있습니다. 하지만, 태반의 사용자가 이런 사항 잘 알지 못합니다. 순전히 개발자의 관점에서 작성된 겁니다.

반성합니다 !! 저도 두번째 예제 코드를 무수히 만들었습니다. 변명을 하자면 KADO-WAH 초기 버전에서 (지금은 안 그렇죠?) SCRIPT 태그 이후에 NOSCRIPT 가 없는 경우 오류 (경고?)로 잡았었습니다. 그래서 기계적으로 SCRIPT 태그가 있는 곳에 NOSCRIPT (자바스크립트를 켜세요) 를 넣었고, 이게 또 HEAD 안에서는 P 태그 등이 올 수 없기 때문에 모든 SCRIPT/NOSCRIPT 태그를 BODY 밑으로 내리는 작업을 했습니다.  반성합니다.

Graceful Degradation 접근 방법

위의 두가지 예제를 보면 구현 모양은 다르지만 동일한  Graceful Degradation 접근 방법을 사용하고 있습니다.

자바스크립트로 slide.js 라는 사용자 경험 풍부한 기능을 먼저 만들고 자바스크립가 지원되지 않는 환경을 위해 NOSCRIPT를 이용해 추가(개선) 작업을 하고 있습니다. 이것이 뒤에서 말하려는 Progressive Enhancement 과 대조되는 부분입니다.

Progressive Enhancement

“점진적 향상” 이라고 번역할 수 있겠습니다.

말 그대로 기능을 점진적으로 향상시키는것을 말합니다. 바로 웹과 결부해서 말하자면

  1. HTML 로만 콘텐츠를 구성합니다. (CSS 를 지원하지 않는 브라우저에서도 접근 가능합니다.)
  2. CSS 로 시각적인 향상을 꾀합니다. (HTML은 이미 구성되었으므로 외부 CSS파일이 적당하겠네요.)
  3. Javascript 를 적용해 사용자 경험을 향상 시킵니다. (역시 외부 js 파일을 두고 이벤트를 가로채는 방법으로 사용해야겠네요)

1.2.3 의 순서로 점차적으로 향상 시키고 있습니다. 이렇게 구현했을 때 나중에 나온 기술(css, javascript)들이 지원되지 않더라도 콘텐츠에 접근하는데 무리가 없습니다. 추가로 얻을 수 있는 장점은 이 방법을 사용하면 밑에 예제를 봐도 알겠지만 구조, 표현, 동작이 자연스럽게 분리된다는 점입니다. 단계적으로 html, css, js 가 추가되기 때문입니다. (솔깃하네요.)

직접 Progressive Enhancement 방법을 사용해 구현을 해 보겟습니다. 예제로는 어느 사이트에나 있는 FAQ를 사용합니다.

1. HTML 구성

01.<h1>자주답변하는 질문들</h1>
02.<dl id="faq-list">
03.<dt>백업파일(*.bak)을 생성하지 않는 방법은?</dt>
04.<dd>'기본설정'->'파일' 에서 '저장시 백업 파일 생성' 옵션을 제거하시면 됩니다.</dd>
05.<dt>업그레이드 후 이전 설정이 없어진 경우.</dt>
06.<dd>이전 버전을 올바르게 설치하지 않은 경우 일어나는 현상입니다. 이런 경우에는 '도구'->'INI 파일 디렉토리' 메뉴 옵션을 실행해서 이전 설정 (*.ini 파일)이 있는 디렉토리를 지정해 주십시오.</dd>
07.<dt>사용자 정의 stx, acp, ctl 파일을 추가하는 방법은?</dt>
08.<dd>
09.<p>*.STX 파일과 *.ACP 파일을 설정하는 방법</p>
10.<ol>
11.<li>'기본설정' 대화상자에서 '설정 및 구문강조' 페이지를 선택합니다.</li>
12.<li>원하는 파일 종류를 선택하거나 원하는 파일 종류가 없는 경우 '추가' 버튼을 누른 후 '파일 확장자' 란에 파일 확장자를 지정합니다.</li>
13.<li>STX 와 ACP 파일의 완전한 경로를 '구문 파일' 과 '자동 완성' 란에 지정합니다.</li>
14.</ol>
15.</dd>
16.</dl>

위의 FAQ는 에디트플러스 사이트에서 가져왔습니다. :) FAQ 목록에 DL 을 사용하는게 적절한지는 논외로 하겠습니다. HTML 만 사용했을 때 질문과 답변을 구분할 수 있도록 하는 목록 태그로는 적절하다고 생각해서 사용했습니다.

HTML 적용된 화면

HTML만 적용된 화면

1단계에서 중용한 건 의미 있는 마크업을 논리적인 순서에 따라 구축하는게 중요하겠습니다. 물론, 이를 만족하기 위해서는 웹 표준을 준수하는게 우선되어야 할거고요.

하지만, 기획팀 으로부터 넘어온 스토리보드, 화면설계와 디자인팀으로 부터 잘려 넘어온 이미지들을 보고 있으면 당최 논리적으로 짜보기가 두려워 집니다. 뭐, 이런걸 잘 하는것도 우리의 능력중의 하나라고 봐야겠습니다. (전 멀었습니다.;;)

2. CSS 적용

1.body,dl,dt,dd {margin:0; padding:0;}
2.html {font-size:78%;}
3.html body {font-size: 1em;}
4.h1 {border:1px dotted #ccc; background:#eee; margin: 0 0 5px 0; padding:5px; font-size:1.4em;}
5.dt,dd {border-bottom:1px solid #ccc;line-height:1.5em;}
6.dt {background:black url(images/q.png) no-repeat left center; color:white; padding:7px 0 7px 25px; cursor:pointer;}
7.dd {background: #eee; padding:10px;}
CSS 까지 적용된 화면

CSS 까지 적용된 화면

네, 이쁘지 않은거 압니다. 제 미적감각이 이정도입니다. (사실, 최선을 다하지 않았다고 변명을 … ㅠㅠ)

3. javascript 적용

01.window.onload = function() {
02.var selectedQ = 0;
03.var dts = document.getElementsByTagName('dt');
04.var dds = document.getElementById('faq-list').getElementsByTagName('dd');
05.for(var i = 0, n = dts.length; i < n; i++) {
06.dds[i].style.display = (i == 0) ? 'block' : 'none';
07.dts[i].idx = i;
08.dts[i].onclick = function() {
09.if (selectedQ != this.idx) {
10.dds[selectedQ].style.display = 'none';
11.dds[this.idx].style.display = 'block';
12.selectedQ = this.idx;
13.}
14.};
15.}
16.};
javascript 까지 적용된 화면

javascript 까지 적용된 화면

네, 썩 좋지 않은거 압니다. (사실, 돌아가게 만드는게 우선이엇다는 변명을 … ㅠㅠ 정말 오랜만에 mootools 없이 javascript 만들어봤네요;;)

좋지 않은 예이긴 하지만, HTML → CSS → javascript 수순으로 점진적으로 향상시키고 있음을 주목해주세요.

위의 예는 faq.htm 에서 보실 수 있습니다. (ie8, firefox 에서만 테스트 되었습니다.)

정리

구현할 때 “누가 요새 javascript 안되는 브라우저를 쓰겠어?” 라는 생각이 들 정도로 자바스크립트는 대부분의 브라우저에서 지원하고 있는게 사실입니다. 사실, 그냥 막 써도 이로인한 불평(자바스크립트가 안되는 환경에서의 불평)도 들어본적이 없습니다. 아마, 사용자들 스스로가 감내하고 있겠지요. 하지만, 웹 접근성을 생각하고 이를 보장하고자 한다면 자바스크립트에 의존하는 코드를 사용해서는 안되겠습니다. href=”javascript:…” , href=”#” onclick=”" 이러 코드 때문에 얼마나 많은 시간을 웹 접근성 개선을 위해 허비했는지 … Progressive Enhancement  방법을 수행하는게 쉬운것만은 아닙니다. 아마 Graceful Degradation 과 비교해서 시간, 노력 등의 자원을 더 필요로 할겁니다. 기 구축된 사이트를 개선하는 작업에 있어서는 Progressive Enhancement 보다 Graceful Degradation 을 선택하는게 더 현명한 방법일지도 모르겠습니다. 하지만 잊지말아야 할 원칙 하나는 “Web for All”. 팀 버너스 리의

웹의 힘은 그것의 보편성에 있다. 장애에 구애없이 모든 사람이 접근할 수 있는 것이 필수적인 요소이다.
(The power of the Web is in its universality, Access by everyone regardless of disability is an essential aspect.)

라는 것이겠지요.


출처 : http://www.yangkun.pe.kr/post/874

Posted by 1010
반응형

제목에서는 “관련사이트 바로가기”라고 했지만 정확히 이를 뭐라고 부르고 있는지 모르겠습니다. “백문이불여일견” !! 바로 보시는게 낫겠습니다.

관련 사이트 바로가기

이런겁니다. 콤보박스가 나오고 목록에서 항목을 선택하면 새창으로 해당 사이트가 열립니다. 코드는 아래와 같습니다.

01.<!-- 코드 #1 -->
02.<p>
03.관련 사이트 바로가기
04.<select onchange="if(this.value != '') window.open(this.value);">
05.<option value="">관련사이트 목록</option>
06.<option value="http://twitter.com/yangkun7">양군의 트위터</option>
07.<option value="http://picasaweb.google.com/yangkun7">건이네 웹앨범</option>
08.<option value="http://www.greenfarm.pe.kr/">푸른농장 (준혁,서영이네)</option>
09.</select>
10.</p>

#1. 문제점

#1. 개선

  1. SELECT 양식에 대한 LABEL 추가
  2. onchange 이벤트 제거
  3. [이동] 버튼 추가
  4. [이동] 버튼 클릭 시 해당 사이트로 이동하도록 변경.

개선된 코드는 다음과 같습니다.

01.<!-- 코드 #2 -->
02.<p>
03.<label for="relSites">관련사이트 바로가기<label>
04.<select id="relSites">
05.<option value="">관련사이트목록</option>
06.<option value="http://twitter.com/yangkun7">양군의 트위터</option>
07.<option value="http://picasaweb.google.com/yangkun7">건이네 웹앨범</option>
08.<option value="http://www.greenfarm.pe.kr/">푸른농장 (준혁,서영이네)</option>
09.</select>
10.<input type="button" value="이동" onclick="window.open(document.getElementById('relSites').value);"/>
11.</p>

#2. 문제점

여전히 문제가 남아 있습니다.

#2. 개선

  1. SELECT 양식 값을 전달할 수 있도록 FORM 삽입
  2. SELECT 양식에 name 설정
  3. SELECT 양식 값을 전달할 수 있도록 일반 버튼을 submi 버튼으로 변경
  4. 전달받은 URL로 이동할 수 있는 서버측 로직 구성

개선된 코드

01.<!-- 코드 #3 -->
02.<p>
03.<form action="redirect.php" method="post" target="_blank">
04.<label for="relSites">관련사이트 바로가기<label>
05.<select id="relSites" name="url">
06.<option value="http://twitter.com/yangkun7">양군의 트위터</option>
07.<option value="http://picasaweb.google.com/yangkun7">건이네 웹앨범</option>
08.<option value="http://www.greenfarm.pe.kr/">푸른농장 (준혁,서영이네)</option>
09.</select>
10.<input type="submit" value="이동"/>
11.</form>
12.</p>

서버측 코드

1.<?php
2.// redirect.php
3.// 필요하면 카운팅 로직 추가
4.header('Location: ' . $_POST['url']);
5.?>

개선점

#3의 코드는 그대로 완벽한 것 같지만 개선의 여지가 남아 있습니다.

  • 코드대로 실행하면 선택한 사이트가 새창으로 열리게 되는데 이에 대해 알리는 부분이 없습니다. (KWCAG 1.0 항목 2.6 반응시간의 조절기능)
  • 자바스크립트가 사용 가능한 환경에서는 굳이 서버 로직을 거치지 않고 선택한 사이트로 이동하게 하고 싶을 수도 있습니다.

최종 개선 코드

01.<!-- 코드 #4 -->
02.<script type="text/javascript">
03.function gotoUrl(id) {
04.window.open(document.getElementById(id).value);
05.return false;
06.}
07.</script>
08.<p>
09.<form action="redirect.php" method="post" target="_blank" onsubmit="return gotoUrl('relSites');">
10.<label for="relSites">관련사이트 바로가기<label>
11.<select id="relSites" name="url">
12.<option value="http://twitter.com/yangkun7">양군의 트위터</option>
13.<option value="http://picasaweb.google.com/yangkun7">건이네 웹앨범</option>
14.<option value="http://www.greenfarm.pe.kr/">푸른농장 (준혁,서영이네)</option>
15.</select>
16.<input type="image" src="btn_move.gif" alt="이동 (새창)"/>
17.</form>
18.</p>

관련 지침

Posted by 1010
반응형

바로 이전 포스트(원숭이 엉덩이는…)에서 유트브 동영상을 삽입했는데.

HTML Validator 를 통과하지 못했습니다. (본 블로그는 xhtml, css 2.1 을 준수하고 있습니다. -_-a)

워드프레스에 유트브 영상 삽입시 HTML Validator 에러

유트브영상 삽입 하나로 9개의 HTML Validator 오류가 ...

유트브에서 제공한 코드는 다음과 같습니다.

1.<object width="425" height="344">
2.<param name="movie" value="http://www.youtube.com/v/39a1jzuqGGQ&;amp;amp;hl=ko_KR&amp;amp;fs=1&amp;amp;rel=0"></param>
3.<param name="allowFullScreen" value="true"></param>
4.<param name="allowscriptaccess" value="always"></param>
5.<embed src="http://www.youtube.com/v/39a1jzuqGGQ&;amp;amp;hl=ko_KR&amp;amp;fs=1&amp;amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed>
6.</object>

웹 표준

위의 코드는 HTML4에서 폐기된 EMBED 태그를 사용하기 때문에 오류로 인식되며, 더불어 태그에 포함된 type, width, height 등의 모든 속성이 오류로 인식됩니다.

그렇다고 EMBED 태그를 제거하면 OBJECT 태그의 classid 와 몇몇 이유 때문에 파이어폭스에서는 재생되지 않는 문제가 생깁니다.

아래와 같은 태그를 사용하면 모든 브라우저에서 동일한 플래시 영상을 표시할 수 있습니다.

1.<object type="application/x-shockwave-flash" width="425" data="플래시 url" height="344">
2.<param name="movie" value="플래시 url" />
3.</object>

ie6,ie7,ie8,chrominum 4,firefox 3.5,opera 10,safai 4 에서 테스트했습니다.

웹 접근성

플래시는 웹 접근성 관련해서 아래와 같은 제약이 존재합니다.

  • 플래시 요소에 대체 텍스트 제공이 녹녹치 않습니다. accessibility 패널을 이용해 대체 텍스트와 탭 순서 제공이 가능하지만 이는 스테이지에 보이는 요소에 한정되며, 대부분의 네비게이션이 액션스크립트에의해 생성 되는걸 고려하면 좀 … 복잡해집니다.
  • IE외의 브라우저에서 키보드로 접근이 힘듭니다. (tabindex=”0″ 을 주는 편법이 있다고 하지만, 꽁수는 꽁수.)
  • 키보드 접근을 허용하려면 플래시의 윈도우 모드를 window로 설정해햐 합니다.
  • 플래시 플러그인이 없는 환경을 고려해 플래시 외부에 대체 텍스트를 제공해야 합니다.
  • 미래에는 어떨지 모르지만, 현재는 검색엔진이 플래시의 텍스트를 인덱싱 하지 못합니다. (혹시 있나요 ?)
  • 페이지가 확~ 무거워져요.

반드시, 플래시 사용을 해야 한다면 위의 사항들을 고려해야 합니다. (쉽지 않아요. ㅠㅠ)

그래서, 웹 접근성 까지 고려 한다면 플래시 자체의 접근성을 확보한 후 아래의 태그를 사용합니다.

1.<object type="application/x-shockwave-flash" width="425" data="플래시 url" height="344">
2.<param name="movie" value="플래시 url" />
3.<p>대체 텍스트... <a href="플래시 플레이어 얻기 링크"><img src="플래시 플레이어 얻기" width="" height="" alt=""/></a></p>
4.</object>

(워드 프레스에서는 위와 같이 작성한 경우 P 태그를 임의로 조정해 <p></object></p> 와 같은 코드를 만들어버리네요 ㅠㅠ)

하지만,  위의 경우 IE에서 플래시 무비가 모두 다운로드 되기 전까지 플래시 플레이어가 보이지 않습니다. 이러한 문제를 피하기 위해서는 힉시 메소드를 사용하거나 A List Apart 에서 제안하는 Flash Satay 방법을 사용합니다.

힉시 메소드 (IE 의 condition comment 를 이용합니다.)

01.<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" width="160" height="75" id="a" align="middle">
02.<param name="movie" value="플래시 url" />
03.<!-- Hixie method -->
04.<!--[if !IE]> < -->
05.</object><object type="application/x-shockwave-flash" data="플래시 url" width="160" height="75">
06.<param name="movie" value="플래시 url" />
07.<p>대체 텍스트</p>
08.</object>
09.<!--> < ![endif]-->

이 방법은 정보화진흥원에 접근성 교육 받으면서 성민장군님에게서 들었습니다. (꾸벅 ^^)

Flash Satay (container.swf 에서 원래의 플래시 무비를 loadMovie를 이용해 로드 합니다.)

1.<object type="application/x-shockwave-flash data="container.swf?path=플래시 url"  width="400" height="300">
2.<param name="movie" value="container.swf?path=플래시 url" />
3.<p>대체 텍스트</p>
4.</object>

Flash Satay 방법의 경우 URL이 꼬이는 수가 있습니다. 결국, 가장 쉬운 방법은 코드를 더 적어야 하긴 하지만 힉시 메소드가 아직은 제일 낫네요.

생각해보세요 위의 플래시가 사이트의 주요 네비게이션 용도로 사용된다면 플래시 자체 접근성도 확보해야 하고 “대체 텍스트”부분에 ul, li 등을 이용해 동일한 네비게이션을 제공해야 합니다. 것 보세요, 쉽지 않죠. 플래시는 자제, 자제…


출처 : http://www.yangkun.pe.kr/post/773

Posted by 1010
반응형

1. 태그이름은 소문자로

예)

<HTML> → <html>

<BODY> → <body>


.. 속성은 괜찮은건가?


2. Empty 태그 끝에는 공백/>


<area> <base> <basefont> <br> <col> <frame> <hr> <img> <input> <param> <isindex> <link> <meta> 등등


3. img 태그에는 alt="" 를 반드시 넣자

 

4. 속성값은 "" 따옴표 안에 넣자.


예)

<img src="b.gif" width="84" height="18" border="0" alt=" " />


5. DOCTYPE 과 ENCODING 을 적어주자.


<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=euc-kr" />

<title>homepage</title>

..


6. 스타일에 사용하는 숫자값에는 단위를 넣어주세요.


웹표준 준수

 

XHTML 1.x 나 HTML 4.x 표준에 맞춘 문서는 99% 접근성이 좋은 사이트들이다.

table 레이아웃 --> div

font, b --> CSS

html 코드는 반으로 코딩과 유지보수 효율성은 2배로~

 

구조/표현/동작(양식)을 분리

 

구조 (Structure) - HTML, XHTML

표현 (Presentation) - CSS

동작 (Behavior) - DOM, ECMAScript, 서버 측 개발

 

최소한의 디버깅


구조 (Structure) - HTML, XHTML - http://validator.w3.org

표현 (Presentation) - CSS - http://jigsaw.w3.org/css-validator/

동작 (Behavior) - DOM, ECMAScript - Mozilla Firefox 의 자바스크립트 디버거


효율적인 웹 개발 방법론


기획 -> 디자인 -> 개발

컨베이어 벨트에 놓인 물건 같이 완성품을 만들어가는 것이 아니라

구조, 표현, 양식을 나누어 공동으로 작업



출처 : http://cafe.naver.com/w3design.cafe
출처 : http://cafe.naver.com/w3design.cafe

Posted by 1010
반응형

How to use entities for special characters

For copyright notices, or trademarks it is customary to include the appropriate signs:

Symbol Entity Example
Copyright sign &copy; Copyright © 1999 W3C
Registered trademark &reg; MagiCo ®
Trademark &#8482; Webfarer™

Note HTML 4.0 defines &trade; for the trademark sign but this is not yet as widely supported as &#8482;

There are a number of other entities you may find useful:

Symbol Entity Example
Less than &lt; <
Greater than &gt; >
Ampersand &amp; &
nonbreaking space &nbsp;  
em dash &#8212;
quotation mark &quot; "

And then, there are entities for accented characters and miscellaneous symbols in the Latin-1 character set:

  &nbsp; &#160; Ð &ETH; &#208;
¡ &iexcl; &#161; Ñ &Ntilde; &#209;
¢ &cent; &#162; Ò &Ograve; &#210;
£ &pound; &#163; Ó &Oacute; &#211;
¤ &curren; &#164; Ô &Ocirc; &#212;
¥ &yen; &#165; Õ &Otilde; &#213;
¦ &brvbar; &#166; Ö &Ouml; &#214;
§ &sect; &#167; × &times; &#215;
¨ &uml; &#168; Ø &Oslash; &#216;
© &copy; &#169; Ù &Ugrave; &#217;
ª &ordf; &#170; Ú &Uacute; &#218;
« &laquo; &#171; Û &Ucirc; &#219;
¬ &not; &#172; Ü &Uuml; &#220;
­ &shy; &#173; Ý &Yacute; &#221;
® &reg; &#174; Þ &THORN; &#222;
¯ &macr; &#175; ß &szlig; &#223;
° &deg; &#176; à &agrave; &#224;
± &plusmn; &#177; á &aacute; &#225;
² &sup2; &#178; â &acirc; &#226;
³ &sup3; &#179; ã &atilde; &#227;
´ &acute; &#180; ä &auml; &#228;
µ &micro; &#181; å &aring; &#229;
&para; &#182; æ &aelig; &#230;
· &middot; &#183; ç &ccedil; &#231;
¸ &cedil; &#184; è &egrave; &#232;
¹ &sup1; &#185; é &eacute; &#233;
º &ordm; &#186; ê &ecirc; &#234;
» &raquo; &#187; ë &euml; &#235;
¼ &frac14; &#188; ì &igrave; &#236;
½ &frac12; &#189; í &iacute; &#237;
¾ &frac34; &#190; î &icirc; &#238;
¿ &iquest; &#191; ï &iuml; &#239;
À &Agrave; &#192; ð &eth; &#240;
Á &Aacute; &#193; ñ &ntilde; &#241;
 &Acirc; &#194; ò &ograve; &#242;
à &Atilde; &#195; ó &oacute; &#243;
Ä &Auml; &#196; ô &ocirc; &#244;
Å &Aring; &#197; õ &otilde; &#245;
Æ &AElig; &#198; ö &ouml; &#246;
Ç &Ccedil; &#199; ÷ &divide; &#247;
È &Egrave; &#200; ø &oslash; &#248;
É &Eacute; &#201; ù &ugrave; &#249;
Ê &Ecirc; &#202; ú &uacute; &#250;
Ë &Euml; &#203; û &ucirc; &#251;
Ì &Igrave; &#204; ü &uuml; &#252;
Í &Iacute; &#205; ý &yacute; &#253;
Î &Icirc; &#206; þ &thorn; &#254;
Ï &Iuml; &#207; ÿ &yuml; &#255;

You can also use numeric character entities for the greek letters and mathematical symbols defined in Unicode. For more details, take a look at the list specified in the HTML 4 specification. Note that the entity names for these characters aren't recognized in Navigator 4, so you are recommended to stick to the numeric entities instead.

Posted by 1010
반응형
Images as submit buttons

This technique relates to the following sections of the guidelines:

Task:

Avoid using images with onclick="form.submit()" as submit buttons.

A submit button is a submit button, and an image is an image. There is no need to mix the two. However, it is very common to see the following code, which leaves users of screen readers and people who can't use a mouse completely unable to submit their form:

Deprecated Example:

 
<form>
<img src="submit.gif" alt="Submit this form" onclick="submitmyform()">
</form>

Example:

The example below shows how to create an image-based submit button that is compatible with assistive technology:

 
<form>
<input type="image" name="submit" src="submit.gif" alt="Submit this form">
</form>
Posted by 1010
반응형
Form URIs

This technique relates to the following sections of the guidelines:

Task:

Avoid javascript: URIs for form actions.

Setting the action attribute in a form to a javascript: URI causes non-script-capable browsers to fail silently.

Deprecated Example:

This example code shows a problematic use of the javascript: URI:

 
<form action="javascript:submitmyform()">
...
</form>

Deprecated Example:

Another common error is to point the form's action to "#" (the top of the current document), while using the onsubmit event. This causes users of non-script-capable browsers to become confused, as their repeated activation of the submit button does nothing.

 
<form action="#" onsubmit="submitmyform()">
...
</form>

Example:

The correct method for firing an ECMAScript function when a form is submitted is to use the onsubmit event. The checkFormFields() function would return true if there are form errors, stopping the submission of the form:

 
<form action="submit.php" onsubmit="return checkFormFields();">
...
</form>
Posted by 1010
반응형
 javascript: URIs

This technique relates to the following sections of the guidelines:

Task:

Avoid javascript: URIs. Attach events using DOM event attributes.

The javascript: URI space should not be used. All ECMAScript should be designed to degrade gracefully when script is not supported, and javascript: URIs necessarily break that graceful degradation.

Editorial Note: This is being discussed in the WG presently. One issue is whether, if JavaScript is assumed to exist in the client, it is necessary to restrict javascript: URIs. On the other hand, the javascript: namespace has referentiality problems, and in many cases, users can enjoy backward-compatibility without any undue burden on the author. (See bug 1073 for more detail.)

Deprecated Example:

Code such as the example below locks many users out of important portions of the site:

 
<a href="javascript:window.open('register.php')">click here</a> to register.

Example:

It is better in general to use the DOM events (onactivate, onclick, onkeypress, etc.) to call script functions, but leave a real http: URI in the link for non-script-capable browsers. In rare cases, it may be necessary to create a second page that duplicates the functionality of the page called by the script, but most of the time it is sufficient to point users to the same target page that is called by the script.

 
<a href="register.php" target="registerwindow"
 onclick="window.open('',this.target);">register here</a>
 
Posted by 1010
반응형

2.2 Dynamic content generation

This technique relates to the following sections of the guidelines:

Task:

Avoid document.write() and innerHTML().

Assistive technologies such as screen readers rely on the Document Object Model (DOM) to interpret the semantics in HTML for a different modality. Given this, the document.write() and innerHTML() methods can render content invalid (and inaccessible via DOM) after the fact.

Deprecated Example:

This deprecated example shows a script that inserts a header, a paragraph (which is unterminated, and thus invalid), and a list (again, invalid) into a given document.

 
function fillContent() {
	document.write("<h1>Welcome to my site</h1>");
	document.write("<p>Lorem ipsum dolor sit amet");
	document.menu.innerHTML = "<ul><li><a href="foo.html">foo</a>";
}

Example:

The following code sample does the same as the example above, but produces valid code which appears in the HTML document's DOM tree:

 
function fillContent() {
	// parentelem is a specified element in the DOM
	var header = document.createElement("h1");
	header.insertText("Welcome to my site");
	var para = document.createElement("p");
	para.insertText("Lorem ipsum dolor sit amet");
	var list = document.createElement("ul");
	itemone = document.createElement("li");
	itemonelink = document.createElement("a");
	itemonelink.setAttribute("href","foo.html");
	itemonelink.insertText("foo");
	list.appendChild(itemone);
	parentelem.appendChild(header);
	parentelem.appendChild(para);
	parentelem.appendChild(list);
}

Editorial Note: Two issues have been raised with this example what happens to XSL on server-side and how does this effect XPointers (and RDF-based accessibility).

Posted by 1010
반응형
<form name="frmLinkInfo" action="/foahome/jsp/site_link.jsp" method="post" target="_blank" onsubmit="return linkSite(this.selSite);">
  <select id="jump_02" name="selSite">
    <option value="">산림행정정보사이트</option>
    <option value="http://www.meari.go.kr">대국민업무포털메아리</option>
    <option value="http://www.nature.go.kr">국가생물종지식정보</option>
    <option value="http://www.nature.go.kr/kpni">국가표준식물목록</option>
    <option value="http://carbon.forest.go.kr">기후변화와산림</option>
    <option value="http://www.forestland.go.kr/">산지정보시스템</option>
    <option value="http://www.forestlove.or.kr/">숲사랑커뮤니티</option>
    <option value="http://kfep.forest.go.kr">숲사랑지도원관리시스템</option>
    <option value="http://fec.forest.go.kr/legal">산림사업법인</option>
    <option value="http://fgis.forest.go.kr">산림공간정보</option>
    <option value="http://forestfire.kfri.go.kr">산불위험예보시스템</option>
    <option value="http://sanfire.forest.go.kr">산불정보시스템</option>
    <option value="http://sansatai.forest.go.kr/welcome.do">산사태관리</option>
    <option value="http://www.foreston.go.kr">숲에ON</option>
    <option value="http://soft.forest.go.kr">임산물수출입통계</option>
    <option value="http://www.forestinfo.or.kr/index2.html">임산물유통정보</option>
    <option value="http://www.huyang.go.kr">자연휴양림예약정보</option>
    <option value="http://photo.forest.go.kr">포토갤러리</option>
  </select>
  <!--a href="#jump_02"><img src="/html/common/_images/jump_btn.gif" alt="go 새창" /></a-->
  <input type="image"  src="/html/common/_images/jump_btn.gif" alt="산림행정정보사이트로 이동합니다.-새창 " align="middle" />
  </form>

form 안에 input 태그 타입이 image 일경우 폼을 서브밋함.
Posted by 1010
반응형

접근성을 해치지 않는 자바스크립트의 사용

신현석

2006년 5월

자바스크립트에 대한 잘못된 생각

자바스크립트 없이는 개발을 할 수 없다?

많은 개발자들이 자바스크립트가 없이는 개발을 할 수 없다고 생각한다. 그만큼 자바스크립트를 일상적으로 많이 사용하고, 자바스크립트에 대해서 잘못 오해하고 있는 부분이 많다는 것이다. 자바스크립트는 클라이언트 환경에서 작동하기 때문에 핵심로직에 사용해서는 안된다. 핵심적인 로직은 서버사이드 언어로 처리를 하고 자바스크립트는 그 옆에서 UI구성을 위해서 도와주기만 해야 한다. 바꿔 말하면 자바스크립트가 없어도 핵심 로직은 작동을 해야 한다. 먼저 자바스크립트없이 HTML과 서버사이드 언어만으로 완벽하게 작동 할 수 있게 개발을 끝낸 후 자바스크립트를 이용해서 좋은 UI나 유효성 검사 등을 하는 부분을 추가 하는 순서로 만들어야 한다. 만약 이를 어기고 자바스크립트를 기능의 일부로 사용하면 접근성이 떨어지는 것 뿐만 아니라 보안도 떨어지고 데이터의 무결성도 보장되지 않는다.

자바스크립트가 작동하지 않는 환경도 고려를 해 줘야 하는가?

자바스크립트가 작동하지 않는 환경이 일반적인 상황은 아니지만 스크립트를 사용할 수 없는 환경에 대한 고려는 반드시 필요하다. 실제로 브라우져에 따라서는 자바스크립트 버젼이 다를 수 있고 개발 환경에서는 잘 작동하던 기능이 어떤 사용자 환경에서는 작동하지 않을 수도 있다. 그리고 사용자 중에서도 여러 이유로 스스로 자바스크립트 사용을 중지하고 사용하는 경우도 있다. 자바스크립트를 사용하지 않아도 핵심 기능을 구현할 수 있음에도 불구하고 불필요한 자바스크립트를 사용하여 접근성을 떨어뜨리는 것이 올바른 페이지 제작 방법은 아니다.

서버 부하를 줄이기 위해서 자바스크립트로만 유효성 검사를 한다?

자바스크립트를 이용해서 서버의 부하를 줄일 수 있다는 것은 많은 사람들이 알고 있을 것이다. 자바스크립트로 선처리를 행함으로서 네트웍이나 서버의 처리를 감소시킨다는 것인데 이것을 잘못 이해하여 자바스크립트만으로 유효성을 체크하는 것이 좋다고 생각하는 사람들이 있다. 자바스크립트로 선처리를 한결과물을 그대로 믿으면 안된다. 사용자측으로 부터 넘오온 모든 값은 그 값의 유효성을 완전히 보장할 수 없기 때문에 서버측에서도 유효성 체크를 해 줘야만 한다. 이것은 서버의 부하를 높이는 것 이전에 자료의 무결성을 보장하는 중요한 과정이다. 자바스크립트를 거치지 않고 서버에 임의로 변조된 값을 보내는 일은 아주 쉬운 일이다.

자바스크립트를 사용하지 않으면 UI가 불편해 진다?

자바스크립트를 이용해서 RIA나 좋은 UI를 만들 수 있는 것은 사실이지만 웹환경을 이해하고 일반적인 웹 인터페이스를 이용해서 만드는 것이 더 좋은 UI를 제공할 수 있다. 사용자 친화적인 UI에 대한 고민을 해야지 자바스크립트를 사용했다고 좋은 UI가 나오는 것은 아니다. 실제적으로 가장 사용자가 이해하기 쉬운 UI는 사용자 OS나 브라우저에서 기본적으로 제공하는 컨트롤 인터페이스를 그대로 사용하는 것이고 이는 자바스크립트 없이도 충분히 가능하다.

자바스크립트는 사용자 환경에 내려보내지고 사용자의 브라우져에서 실행이 되기 때문에 이에 의존해서 프로그램을 만들게 되면 보안, 접근성에 문제가 생기기 쉽다. 이러한 자바스크립트의 특징을 정확히 이해하지 못한 잘못된 개발 방법이나 상식들 때문에 자바스크립트가 오용되고 있는 경우가 많다. 자바스크립트는 어디까지나 보조적인 수단이라는 것을 이해하고 핵심적인 기능을 해치지 않는 한도에서 사용하는 것이 무엇보다 중요하다.

자바스크립트 선언

<script language="Javascript">
//code
</script>

자바스크립트는 <script> 엘리먼트로 선언을 한다. 모든 <script>엘리먼트는 type을 명시해 주어야 하고 자바스크립트의 type은 "text/javascript" 이다. 많은 경우 language 만을 선언해서 자바스크립트버젼을 명시하는데 반드시 type도 같이 명시를 해 주어야 한다.

<script type="text/javascript">
//code
</script>

<a>의 href 속성과 자바스크립트의 사용

href는 Hypertext REFerence의 약자이다. 다시 말해서 hypertext의 위치를 나타내는 uri를 그 값으로 갖는다. 하지만 많은 경우 이 href안에 "javascript:myFunction()"과 같이 잘못된 구문을 이용하는 것을 볼 수 있다. 이와 같이 href안에 잘못된 값이 들어가게 될 경우, 북마크나 새창, 새탭으로 열기 등의 href 관련된 브라우저의 기능들이 정상적으로 작동하지 않게 된다. 따라서 href안에는 항상 uri가 들어가도록 하고 자바스크립트 적용은 onclick과 같은 이벤트 속성을 이용해야 한다.

의미 없는 href 값을 사용한 경우

사용자의 링크 클릭이 링크와 관련이 있고 이를 자바스크립트를 이용해서 처리를 하야 하는 경우가 있다면 우선은 자바스크립트를 빼고도 페이지의 이동을 할 수 있게 href에 적절한 값을 넣어 주어야 한다. 이와 같은 경우로 탭메뉴를 들 수 있다. 탭메뉴의 경우 탭을 누르면 해당 탭과 관련있는 컨텐츠를 보여주는 식으로 작동하게 된다. javasript가 없다면 탭을 클릭했을 때 해당 컨텐츠로 이동을 하는 식으로 구현 되면 된다. href 안의 값으로 페이지 안에서의 해당 컨텐츠 앵커 주소를 넣는 것으로 간단히 구현 된다.

<a href="#notice-list"><img src="notice-tab.gif" alt="Notice" /></a>

그리고 이 마크업을 기본으로 하여 이벤트 속성으로 원하는 기능을 넣어주면 된다.

<a href="#notice-list" onclick="showNoticeTab(); return false;"><img src="notice-tab.gif" alt="Notice" /></a>

onclick으로 탭을 보여준 후 false를 리턴하여 해당 앵커로 이동하지 않도록 처리 한다. 자바스크립트가 작동을 할 때에는 클릭하면 정상적으로 탭으로 작동을 할 것이고, 그렇지 않을 경우에는 해당 컨텐츠로 이동을 하여 높은 접근성을 유지할 수 있다.

만약 자바스크립트가 링크와 관련이 없는 경우에는 <a>태그를 사용해서 스크립트를 적용하면 안된다. 보통 특정 효과를 주는 것이 이러한 것에 해다하게 되는데 이 경우 자바스크립트가 작동을 하지 않아도 컨텐츠 이해에 크게 문제가 되지 않는 경우이다.

<img src="button.gif" style="cursor: pointer;" onclick="myAction()" />

효과를 위한 자바스크립트는 단순히 onclick을 이용해서 적용을 하고 <a>를 사용하지 않는다. 그리고 사용자가 마우스 포인터를 올렸을 때 손모양으로 나오는 것은 스타일로 처리하면 된다.

팝업창을 열 때(window.open)

<img src="openWindow.gif" onclick="window.open('popup.html', '', 'widht=300,height=200')">
<a href="#"><img src="openWindow.gif" onclick="window.open('popup.html', '', 'widht=300,height=200')"></a>

href에 #과 같은 의미 없는 값을 넣거나 onclick 안에 경로를 처리하는 경우가 있는데 팝업창은 링크이고 페이지가 별도로 존재 하기 때문에 <a>를 이용해서 기능을 구현하고 href엔느 해당 팝업의 경로를 넣어야 한다.

<a href="popup.html" onclick="window.open(this.href, 'popupName', 'width=300,height=200'); return false;"><img src="openWindow.gif"></a>

이럴 경우 사용자가 자신의 의도 대로 팝업창을 새창, 새탭 등으로 열 수 있고 심지어 즐겨 찾기도 할 수 있다.

자바스크립트를 이용한 페이지 이동

웹사이트를 이용하다 보면 폼에서 값을 입력하고 서밋을 하는 순간 "따다다닥" 하는 식으로 클릭을 여러번 한 것과 같은 소리가 나는 경우를 접하게 된다. 프로세스가 여러페이지에 걸쳐서 일어나게 되는데 이 처리를 자바스크립트로 처리를 해서 이러한 현상이 발생을 하게 된다.

<script type="text/javascript">document.location.href="redirection.html";</script>

위와 같이 페이지를 이동 하거나 아래와 같이 <form>을 이용해서 값을 넘기는 경우가 이러한 경우이다.

<form name="login_form">
	<input type="hidden" name="user_id" value="myid" />
	<input type="hidden" name="user_pwd" value="mypassword" />
	<input type="hidden" name="redirect_url" value="http://mysite.com/login/" />
	<input type="hidden" name="somevalue" value="blahblah" />
	...
</form>
<script type="text/javascript">
f = document.forms.login_form;
f.action = "http://login.oursite.com/login/";
...
f.submit();
</script>

심한 경우 아래와 같이 전혀 의미 없는 폼을 이용하기도 한다.

<form method="post" name="sg_form" action="http://www.qubi.com/" target="_top">
</form>
<script> sg_form.submit(); //3</script>

위와 같은 페이지들은 html 문법상 오류가 있는 페이지 들이고 이 때문에 작동이 안 될 수도 있다. <form>엘리먼트나 <script>엘리먼트는 상위에 <body>나 <head>엘리먼트가 있어야 하는데 위와 같은 경우 이러한 엘리먼트가 없기 때문에 html로 해석이 안되어 스크립트가 작동 되지 않거나 값이 넘어가지 않을 수도 있다. 그리고 <form>에 submit <input>이 없기 때문에 자바스크립트로 submit이 일어나지 않을 수도 있다.

이와 같이 페이지를 이동하거나 값을 넘길 필요가 있을 때 자바스크립트에 의존해서 이를 처리하게 되면 클라이언트의 환경에 따라서 동작이 실패할 수 있다. 따라서 이러한 처리는 자바스크립트에서 처리 하지 말고 서버 측에서 http헤더 정보를 이용해서 처리해야 한다.

이러한 중간과정에서의 처리를 서버측에서 모두 처리 하는 것이 가장 바람직 하지만 어쩔 수 없이 사용을 해야할 경우에는 - 그럴 경우가 많지는 않겠지만 기존의 호환성을 위해서 - DTD선언이나 <html> 루트 엘리먼트, <head>, <body>와 같이 필수 엘리먼트들이 존재하는 완결된 페이지를 사용 하도록 하고, 자바스크립트가 작동하지 않는 경우를 위해서 <form>에 submit버튼도 제공을 하고, 결과 메세지도 alert외에 일반 text와 <a>를 이용한 링크를 제공하도록 해야 한다.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr" />
<title>Redirect</title>
</head>
<body>
<script type="text/javascript">
/*
 some processes...
*/
alert('이래저래한 이유로 다시 돌아 갑니다.');
document.location.href="redirection.html";
</script>
<p><a href="redirection.html">이래저래한 이유로 다시 돌아 갑니다.</a></p>
</body>
</html>

charset이 없는 경우 브라우져의 기본 설정으로 alert이 작동하기 때문에 브라우져의 기본 설정이 ko-kr이 아닌 경우 한글이 깨지게 된다. 문서의 mime-type도 text/html인지 확인해야 한다.

<form>에서의 자바스크립트 사용

일반적으로 <form>은 사용자가 입력한 값을 서버측에 전달하는 역할을 하고 그 전달은 <form>의 submit 기능을 통해서 이루어 진다. 이러한 폼을 구현 할 때에 일반적으로 자바스크립트를 사용하는 경우가 많다.

submit

폼은 그 자체적으로 값을 보내는 서밋기능을 제공하고 있다. <input type="submit" />이나 <input type="image" />이 서밋기능을 하는 컨트롤인데 폼의 값 유효성 체크를 하는 과정에서 이러한 폼의 자체적인 서밋기능을 이용하지 않고 자바스크립트로 폼 서밋을 하는 경우가 있다.

<script type="text/javascript">
function submitForm() {
	loginForm.submit();
}
</script>
<form id="loginForm" name="loginForm" action="">
	User Id <input type="text" name="loginId">
	User Password <input type="password" name="loginPassword"><br>
	<img src="login.gif" onclick="submitForm()">
</form>

위와 같은 경우 폼에 서밋기능이 없기 때문에 브라우져에 따라서 script로 서밋이 안되는 경우도 있고 서밋 대신에 이미지가 들어가 있기 때문에 의미적으로도 맞지 않게 된다. 따라서 폼을 제작할 때에는 반드시 서밋기능을 <input>을 이용해서 제공해야 한다.

<form id="loginForm" name="loginForm" action="">
	<p>
		<label for="loginId">User Id</label>
		<input type="text" id="loginId" name="loginId" /><br />
		<label for="loginPassword">User Password</label>
		<input type="password" id="loginPassword" name="loginPassword" />
	</p>
	<p>
		<input type="image" src="login.gif" alt="Login" />
	</p>
</form>

많은 경우 <html>제작 과정에서 서밋을 <img>로 넣는 경우가 있는데 이 경우 이를 그냥 사용하면 안되고 적절한 <input>으로 바꾸어서 사용해야 한다.

validation

클라이언트 측에서 자바스크립트를 이용한 유효성 검증은 <form>의 서밋 이벤트를 캐치하는 방식으로 구현해야 하고 자바스크립트가 폼을 서밋하는 방식을 사용하면 안된다.

<script type="text/javascript">
function submitForm() {
	if (!loginForm.loginId.value) {
		alert("아이디를 넣어주세요.");
		loginForm.loginId.focus();
	} else if (!loginForm.loginPassword.value) {
		alert("비밀번호를 넣어주세요.");
		loginForm.loginPassword.focus();
	} else {
		loginForm.submit();
	}
}
</script>
<form id="loginForm" name="loginForm" action="">
	아이디 <input type="text" name="loginId">
	비밀번호 <input type="password" name="loginPassword"><br>
	<img src="login.gif" onclick="submitForm()">
</form>

위와 같은 경우 자바스크립트만을 이용해서 폼을 서밋하고 있기 때문에 자바스크립트가 없이 HTML만으로는 기능이 작동하지 않는다.

<script type="text/javascript">
function submitForm(formEl) {
	//TrimAll(formEl);

	var errorMessage = null;
	var objFocus = null;

	if (formEl.loginId.value.length == 0) {
		errorMessage = "아이디를 넣어주세요.";
		objFocus = formEl.loginId;
	} else if (formEl.loginPassword.value.length == 0) {
		errorMessage = "비밀번호를 넣어주세요.";
		objFocus = formEl.loginPassword;
	}

	if(errorMessage != null) {
		alert(errorMessage);
		objFocus.focus();
		return false;
	}
	return true;
}
</script>

<form id="loginForm" name="loginForm" action="" onsubmit="return submitForm(this)">
	<label for="loginId">아이디</label> <input type="text" id="loginId" name="loginId" />
	<label for="loginPassword">비밀번호</label> <input type="password" id="loginPassword" name="loginPassword" /><br />
	<input type="image" src="login.gif" alt="Login" />
</form>

이와 같이 onsubmit 이벤트를 이용해서 폼의 유효성을 체크하고 그 결과를 true나 false로 보내줌으로써 폼이 스크립트에 따라서 서밋을 진행하거나 멈출 수 있고, onsubmit 이벤트가 발생하지 않아도 사용자는 폼을 사용할 수 있기 때문에 접근성이 높아지게 된다.

게시판 등에서 기능을 모두 자바스크립트로 하는 경우

게시판에서 페이지의 이동을 자바스크립트만으로 하는 것을 많이 볼 수 있다. 아래와 같이 사용자 인풋이 없는 빈 <form>을 하나 만들고 이것과 자바스크립트를 이용해서 글을 읽거나 페이지를 이동하는 것이다.

<form method="post" name="vars">
	<input type="hidden" name="articleId" value="23" />
	<input type="hidden" name="page" value="3" />
	<input type="hidden" name="keysord" value="" />
	<input type="hidden" name="searchType" value="" />
	<!-- 등등 -->
</form>

...

<a href="javascript:ArticleRead()">글읽기</a>
<a href="javascript:GoList()">리스트 보기</a>

url이 간단해 지고 다루기 쉽다는 이유로 이러한 방식으로 개발을 하는 경우가 많은 것 같은데 절대로 사용해서는 안되는 방식이다.

우선 위와 같이 모든 기능을 자바스크립트를 이용해서 구현을 하게 되면 자바스크립트 오류가 있거나 핸드폰과 같이 자바스크립트가 정상적으로 작동 하지 않는 상황에서는 접근을 할 수 없게 된다. 또한 모든 변수를 post를 통해서 전달하기 때문에 url에 표시가 되지 않고 해당 페이지를 따로 북마크 한다든지 저장을 할 수가 없게된다. 게시판의 경우 해당 게시물로의 접근을 쉽게 해 주어야 하는데 사용자가 url을 알 수 없게 함으로써 접근을 원천적으로 막게 된다.

자바스크립트를 이용하지 않고도 <a>와 url만으로도 작동 가능한 페이지를 만들고 QueryString을 효율적으로 다루는 방법을 모색하여 개발을 진행하는 것이 가장 좋은 방법이다.

마치며

본인이 웹사이트 개발을 하면서 접할 수 있었던 몇몇 잘못된 자바스크립트 사용 예를 적어 보았다. 그런데 놀라운 것은 이러한 개발 방식을 초보부터 어느정도 경력이 된 개발자들 까지 아무런 고민 없이 사용하고 있다는 것이다. 책이 잘못된 것인지 교육이 잘못 된 것인지 정확히 근원을 알 수는 없지만 많은 개발자들이 웹이 가지고 있는 기본적은 특성을 무시한채 잘못된 방법을 이용하여 개발을 하고 있는 것이 사실이다. 그리고 또 초보 개발자들은 HTML을 잘 모르기 때문에 이러한 개발 방식을 아무 고민 없이 그냥 받아들이고 있는 것이 사실이다.

브라우저 접근성을 가장 크게 낮추고 있는 것이 바로 이 잘못된 자바스크립트의 사용이다. 부디 조금이라도 많은 개발자들이 링크에 기초한 웹의 특성을 이해하고 접근성 높은 웹사이트, 웹 어플리케이션을 구축 하기를 바라는 바이다.

다운로드 : accessible-javascript.pdf(pdf 225KB)

Posted by 1010
반응형
출처 : http://naradesign.net/wiki/UI_개발자를_위한_북마크
출처 : http://naradesign.net/wiki/UI_개발자를_위한_북마크

뉴스

드림위버

모바일

블로그

웹 표준

웹 접근성

자바스크립트

IT Trends

User Experience


블로그 허브

사용자 맞춤형 웹 서비스

사전

웹 디자인

사진

아이콘

웹 브라우저

웹 브라우저들

웹 브라우저 에뮬레이터

모바일 웹 브라우저 에뮬레이터

웹 브라우저 테스트

웹 브라우저 호환성 문제

웹 브라우저 확장

웹 사용성

웹 성능 분석

웹 어플리케이션

웹 접근성

지침

기법


웹 표준

유니버설 디자인

통계

CSS

CSS Framework

CSS Reference

CSS Standards

CSS Vendor Extensions

CSS3

Flash

Fonts

HTML/XHTML

HTML5

Javascript

jQuery

User Interface 개발

Posted by 1010
반응형
근래 들어 NHN 웹표준화팀의 NULI 사이트가 여기저기서 소개가 되고 있네요. 좋든 싫든 NHN이라는 기업이 갖고 있는 폐쇄적인 이미지와 달리 자신들의 지식과 정보를 '널리' 알리고 공유하고 싶다는 박태준 팀장님과 팀원들의 의지가 담겨 있는 멋진 UI 가이드라인 사이트라고 생각합니다. NULI 외에도 다음 다음의 UI개발팀이 운영하고 있는 가이드라인과 모질라, 오페라 등이 운영하고 있는 사이트들이 있어서 간단히 소개해 드립니다.

NULI - 널리 공유하는 웹 표준화 가이드

최근에 가장 많이 알려진 곳이며, 네이버를 중심으로 NHN의 웹서비스 UI관련 가이드를 꼼꼼히 정리하고 있는 곳입니다. HTML, CSS를 비롯한 기본적인 가이드에서부터 웹접근성에 대한 연구 결과 등을 공개하고 있어 별도의 연구나 분석이 쉽지 않은 회사 또는 개인에게 좋은 정보를 제공하고 있습니다. 최근에 스크린리더(센스리더)에 대한 리뷰는 정말 도움이 되더군요.

Daum UIDev Guideline

NULI만큼 알려지지는 않았지만 다음에도 UI개발팀에서 운영되고 있는 가이드라인이 있습니다. NULI처럼 NHN 웹서비스를 위해 조사하고 연구된 내용을 공유하기 위한 목적은 아니어서 그런지 자체 웹서비스를 위한 참고 가이드의 성격이 강합니다. 하지만 사내 웹표준 가이드 등을 만들 생각이 있다면 다음의 UI가이드가 도움이 될 것 같습니다. 다음의 UI개발자 블로그는 NULI와 달리 따로 운영되고 있네요. 이곳에서도 종종 좋은 정보들이 올라오고 있습니다.

MDC - Mozilla Developer Center

모질라 재단이 운영하고 있는 개발자 센터입니다. 기술(Technologies) 카테고리에서 HTML, CSS, XML, AJAX, DOM, RSS 등 많은 기술 문서를 열람해 보실 수 있습니다. 회원가입을 하시면 직접 글을 올릴 수도 있습니다.

Dev.Opera

오페라 소프트웨어의 개발자 센터입니다. 외견상 MDC와 유사하며, Articles 카테고리를 통해서 HTML, CSS, Javascript 등에 대한 글을 열람해 보실 수 있습니다. 최근에 개설된 Web Standards Curriculum 은 정말 좋습니다! (제가 활동중인 스터디그룹에서도 WSC를 이용해서 공부를 하고 있습니다.) Dev.Opera 역시 MDC와 마찬가지로 회원 가입을 하면 저자가 되어서 직접 글을 올릴 수 있습니다. 최근의 내용을 봐서는 오페라쪽이 좀 더 활발한 것 같습니다.

Aptana Reference Guides

Aptana가 제작 운여하고 있는 레퍼런스입니다. 역시 HTML, CSS, Javascript 를 다루며, Jaxer라는 자사 서비스 가이드를 포함하고 있습니다. 개인적으로 자주 찾는 곳인데 각각의 브라우저별 지원 현황이 잘 정리되어 있어서 보기 좋습니다. 별도의 레퍼런스 북이 없다면 정말 괜찮은 사이트입니다.

웹표준을 탐험하는 히치하이커를 위한 지침서

더글러스 애덤스가 쓴 '은하수를 여행하는 히치하이커를 위한 안내서'를 패러디한 제목의 웹표준 가이드 사이트입니다. ELEX님이 작성하신 것으로 초기에는 PDF 문서로 배포되다가 최근에 스프링노트를 통해서 가이드라인 사이트를 구축하신 것 같습니다. 기부금을 내시면 ELEX님께 도움을 드릴 수도 있을것 같군요! 포털사가 만든 가이드가 복잡해 보이고, 영어로 된 가이드가 영 읽기 힘들다면 ELEX님의 가이드를 한번 추천해 드립니다. 꼼꼼하게 잘 정리하시고 운영하는 열정이 대단하신것 같습니다.


이 밖에도 W3C Schools이나 Max Design, Yahoo! UI Library와 같이 이미 많이 알려진 레퍼런스, 가이드 사이트도 있습니다. 찾아보면 더 많은 곳이 있을 것이고, 카페(하코사와 같은)나 사이트(CDK같은) 등 소규모로 제작 운영되는 레퍼런스와 가이드도 알찬 것들이 많을 것이라고 생각해 봅니다. 또한 대부분의 회사가 자체 가이드라인을 가지고 있거나 제작하고 있는 것으로 알고 있습니다. 아직 준비되어 있지 않다면 직접 한번 만들어 보시는 것도 좋은 공부가 되지 않을까 싶습니다. 그런 의미에서 저 역시 틈틈히 '마크업 가이드라인'을 만들어 보고 있습니다. 게을른 탓에 지지부진하긴 하지만 자신의 작업 스타일이라든가 알고 있는 지식을 정리해볼 수 있는 좋은 기회라고 생각됩니다.


출처 : http://www.pageoff.net/828
Posted by 1010
반응형
Posted by 1010
반응형

------------------------------------------------------
window.onload = function(){
 loadBooks();
}

function loadBooks(){
 //sendRequest("books.jsp",null,loadedBooksXML,"GET");
 new ajax.xhr.Request("books.jsp",null,loadedBooksXML,"GET");
 new ajax.xhr.Request("books.xsl",null,loadedBooksXSL,"GET");
}

var xmlDoc = null;
var xslDoc = null;


function loadedBooksXML(req) {
 if (req.readyState == 4) {
  if (req.status == 200) {
   xmlDoc = req.responseXML;
   //sendRequest("books.xsl",null,loadedBooksXSL,"GET");
   //doXSLT(); 
  }
 }
}

function loadedBooksXSL(req) {
 if (req.readyState == 4) {
  if (req.status == 200) {
   xslDoc = req.responseXML;
   doXSLT();
  }
 }
}

function doXSLT(){
 if(xmlDoc == null || xslDoc == null) return;
 var bookList = document.getElementById("bookList");
 if(window.ActiveXObject){ // IE방식의 xml문서를 xsl 변환
  bookList.innerHTML = xmlDoc.transformNode(xslDoc);
 }else{ // W3C 지원 브라우저의 xml문서를 xsl변환
  var xsltProc = new XSLTProcessor();
  xsltProc.importStylesheet(xslDoc);
  var fragment = xsltProc.transformToFragment(xmlDoc,document);
  bookList.appendChild(fragment);
 }
}
---------------------------------------------------

var ajax = {};
ajax.xhr = {};

ajax.xhr.Request = function(url,params,callback, method){
 this.url = url;
 this.params = params;
 this.callback = callback;
 this.method = method;
 this.send();
}

ajax.xhr.Request.prototype = {
 getXMLHttpRequest: function(){
  if(window.ActiveXObject){
   try{
    return new ActiveXObject("Msxml2.XMLHTTP");
   }catch (e) {
    try {
     return new ActiveXObject("Microsoft.XMLHTTP");
    } catch (e1) {
     return null;
    }
   }
  }else if(window.XMLHttpRequest){
   return new XMLHttpRequest();
  }else{
   return null;
  }
 },

 send: function() {
  this.req = this.getXMLHttpRequest();
  var httpMethod = this.method ? this.method : 'GET';

  if(httpMethod != 'GET' && httpMethod != 'POST'){
   httpMethod = 'GET';
  }

  var httpParams = (this.params == null || this.params == '')? null : this.params;
  var httpUrl = this.url;

  if(httpMethod == 'GET' && httpParams != null){
   httpUrl = httpUrl + "?" + httpParams;
  }

  this.req.open(httpMethod, httpUrl, true);
  this.req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

  var request = this;
  this.req.onreadystatechange = function(){
   request.onStateChange.call(request);
  }
  this.req.send(httpMethod == 'POST' ? httpParams : null);
 },

 onStateChange: function(){
  this.callback(this.req);
 }
}

Posted by 1010
반응형

var ajax = {};
ajax.xhr = {};

ajax.xhr.Request = function(url,params,callback, method){
 this.url = url;
 this.params = params;
 this.callback = callback;
 this.method = method;
 this.send();
}

ajax.xhr.Request.prototype = {
 getXMLHttpRequest: function(){
  if(window.ActiveXObject){
   try{
    return new ActiveXObject("Msxml2.XMLHTTP");
   }catch (e) {
    try {
     return new ActiveXObject("Microsoft.XMLHTTP");
    } catch (e1) {
     return null;
    }
   }
  }else if(window.XMLHttpRequest){
   return new XMLHttpRequest();
  }else{
   return null;
  }
 },

 send: function() {
  this.req = this.getXMLHttpRequest();
  var httpMethod = this.method ? this.method : 'GET';
  if(httpMethod != 'GET' && httpMethod != 'POST'){
   httpMethod = 'GET';
  }
  var httpParams = (this.params == null || this.params == '')? null : this.params;
  var httpUrl = this.url;
  if(httpMethod == 'GET' && httpParams != null){
   httpUrl = httpUrl + "?" + httpParams;
  }
  this.req.open(httpMethod, httpUrl, true);
  this.req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  var request = this;
  this.req.onreadystatechange = function(){
   request.onStateChange.call(request);
  }
  this.req.send(httpMethod == 'POST' ? httpParams : null);
 },

 onStateChange: function(){
  this.callback(this.req);
 }
}

Posted by 1010
반응형

---------------------

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
 <meta http-equiv="content-type" content="text/html; charset=euc-kr" />
 <title>최신 영화 소식</title>
 <script type="text/javascript" src="httpRequest.js"></script>
 <script type="text/javascript" src="bookList.js"></script>
</head>
<body>
 <div id="bookList"></div>
</body>
</html> 


----------------
<?xml version="1.0" encoding="euc-kr" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes" encoding="euc-kr" />
 <xsl:template match="books">
  <ul>
   <xsl:for-each select="book">
    <li>
     <strong><xsl:value-of select="title"/></strong>
     (<em><xsl:value-of select="author" /></em>)
    </li>
   </xsl:for-each>
  </ul>
 </xsl:template>
</xsl:stylesheet>


-------------------------

<%@ page contentType="text/xml; charset=utf-8" %>
<%@ page import="java.util.List" %>
 <books>
  <book>
   <title>프로젝트 생존 전략</title>
   <author>스티브 맥코넬</author>
  </book>
  <book>
   <title>웹 표준 가이드</title>
   <author>소프트웨어 진흥원</author>
  </book>
  <book>
   <title>넛지</title>
   <author>스티브 맥코넬</author>
  </book>
 </books>

--------------------------

window.onload = function(){
 loadBooks();
}

function loadBooks(){
 sendRequest("books.jsp",null,loadedBooksXML,"GET");
}

var xmlDoc = null;
var xslDoc = null;


function loadedBooksXML() {
 if (httpRequest.readyState == 4) {
  if (httpRequest.status == 200) {
   xmlDoc = httpRequest.responseXML;
   sendRequest("books.xsl",null,loadedBooksXSL,"GET");
  }
 }
}

function loadedBooksXSL() {
 if (httpRequest.readyState == 4) {
  if (httpRequest.status == 200) {
   xslDoc = httpRequest.responseXML;
   doXSLT();
  }
 }
}

function doXSLT(){
 if(xmlDoc == null || xslDoc == null) return;
 var bookList = document.getElementById("bookList");
 if(window.ActiveXObject){ // IE방식의 xml문서를 xsl 변환
  bookList.innerHTML = xmlDoc.transformNode(xslDoc);
 }else{ // W3C 지원 브라우저의 xml문서를 xsl변환
  var xsltProc = new XSLTProcessor();
  xsltProc.importStylesheet(xslDoc);
  var fragment = xsltProc.transformToFragment(xmlDoc,document);
  bookList.appendChild(fragment);
 }
}

Posted by 1010
반응형
XMLHttpRequest 객체 생성
open() 요청 초기화
sned() 요청 전송
1.XMLHttpRequest 서버 요청 전송후 응답 alert() 출력
2.XMLHttpRequest 서버 요청 전송시 한글 파라미터 utf-8 인코딩 후 전송
3.XMLHttpRequest 서버 요청 전송후 응답을 innerHTML 사용해서 clinet  브라우저의 웹 문서 변경
웹 문서에 내용보기
4.XMLHttpRequest 서버 요청 전송후 XML로 받은 응답 처리
5.XMLHttpRequest 서버 요청 전송후 XML로 받은 응답 xsl 처리
Posted by 1010
반응형



function load2(url) {
    req = getXMLHttpRequest();
    req.onreadystatechange = ViewMessage2;  //함수 호출 *ViewMessage
    req.open("GET", url, true);
    req.send(null);
 ViewMessage2();
}

function ViewMessage2(){  //서버 통신상태를 나타낸다.
 if(req.readyState == 4) {
        if(req.status == 200){          
            var xmlDoc = req.responseXML;
   SetSSN(xmlDoc,"DSN");    
        } else{
            alert("서버 상태가 불안정 합니다."); // 서버 상황을 alert 창으로
        }
    }
}


//////////////////////////////////////////////////////////////////////////////
function load(url) {
    req = getXMLHttpRequest();
    req.onreadystatechange = ViewMessage;  //함수 호출 *ViewMessage
    req.open("GET", url, true);
    req.send(null);
 ViewMessage();
}

function ViewMessage(){  //서버 통신상태를 나타낸다.
 if(req.readyState == 4) {
        if(req.status == 200){          
            var xmlDoc = req.responseXML;
   SetSSN(xmlDoc,"DSN");    
        } else{
            alert("서버 상태가 불안정 합니다."); // 서버 상황을 alert 창으로
        }
    }
}

Posted by 1010
반응형

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="utf-8">
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>javascript :prototype 사용 변수 선언 </title>
  <script type="text/javascript" src="prototype.js"></script>
 
  <SCRIPT LANGUAGE="JavaScript">
   
  <!--

   function addLoadEvent(func) {
     var oldonload = window.onload;
     if (typeof window.onload != 'function') {
    window.onload = func;
     } else {
    window.onload = function() {
      oldonload();
      func();
    }
     }
   }

   var Member = Class.create();
   Member.prototype={
    initialize : function(part){
     this.part = part;
    },
    memberList:function(){
     var list = new Array("홍길동","박문수","이몽룡");
     var console = document.getElementById("area");
     if(console != null){
      console.innerHTML += "<b>"+this.part+"</b> 수강생 명단 :<br/> "+list+"<br/>";
     } //if
    }
   }


   var PartMember = Class.create();
   PartMember.prototype = Object.extend(
    new Member,{
     memberList : function(){
      var list = new Array("이순신","김유신","홍길동");
      var console = document.getElementById("area");
      if(console != null){
       console.innerHTML += "<b>수강과목</b><br/>"+list+"<br/>";
      } //if
      Member.prototype.memberList.apply(this);
     } 
    }
   );


   function callFunction(){ 
    var partMember = new PartMember("웹표준 설계반");
    partMember.memberList();
   }

   addLoadEvent(callFunction);

   

  //-->
  </SCRIPT>
 </head>
 <body>
  <div id="area"></div>
 </body>
</html>

Posted by 1010
반응형

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="utf-8">
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>javascript :prototype 사용 변수 선언 </title>
  <script type="text/javascript" src="prototype.js"></script>
 
  <SCRIPT LANGUAGE="JavaScript">
   
  <!--

   function addLoadEvent(func) {
     var oldonload = window.onload;
     if (typeof window.onload != 'function') {
    window.onload = func;
     } else {
    window.onload = function() {
      oldonload();
      func();
    }
     }
   }

   var Subject = Class.create();


   Subject.prototype={
    initialize : function(name){
     this.name = name;
    }
   }

   var ChildSubject = Class.create();

   ChildSubject.prototype = Object.extend(
    new Subject,{
     showList : function(){
      var subjectList = new Array("XHTML","jsp","ajax");
      var console = document.getElementById("area");
      if(console != null){
       console.innerHTML += "<b>수강과목</b><br/>"+subjectList+"";
      } //if
     } //showList : function
    }//new Subject,
   );//ChildSubject.prototype


   function callFunction(){
    var childSubject = new ChildSubject("컴퓨터 공학과");
    childSubject.showList();
   }

   addLoadEvent(callFunction);

   

  //-->
  </SCRIPT>
 </head>
 <body>
  <div id="area"></div>
 </body>
</html>

Posted by 1010