2008년 9월 24일 수요일

자바스크립트로 나이 검사하기

이 글은 스터디 과제로 작성된 코드를 정리한 것입니다.

사용자 입력 상자에 입력된 값이 나이인지 아닌지 그리고 적절한지를 판단하는 스크립트를 작성해 보았습니다.

 

HTML 펼치기..


CSS 보두기..


Java Script


window.onload = function()
{
    // Init
    root = document.getElementById("exam");
    inputs = root.getElementsByTagName("input");    for(var i=0; i<inputs.length; i++)
    {
        if(inputs[i].type == "submit")
        {
            btn = inputs[i];
        }
    }


1. form 영역안에서 타입이 submit인 input 요소를 찾아서 btn 변수에 정의한다.


    // Submit
    btn.onclick = function()
    {
        var block = this.parentNode;
        var fields = block.getElementsByTagName("input");

        for(var i=0; i<fields.length; i++)
        {
            var obj = fields[i];
            if(chkBlank(obj) == false) return false; // Blank Value Check

            if( (obj.type == "text") && (getClassName(obj.className) == true) ) // class Attribute is "numeral"
            {
                if(checkNumeral(obj.value) == false)
                {
                    obj.focus();
                    obj.value = "";
                    return false;
                }

                if(obj.id == "age") // ID Attribute is "age"
                {
                    var user_age = parseInt(fields[i].value); // Conversion
                    if(checkMan(user_age) == false)
                    {
                        fields[i].focus();
                        obj.value = "";
                        return false;
                    }
                }

            }
        }

        alert("전송 완료!");
        return false;

    }

}


2.  btn(submit)을 클릭한 경우 타입이 ‘text’인 input 요소의 값의 유효성 체크를 시행하여 아무 이상이 없으면 ‘전송 완료!’메세지를 출력한다.


function chkBlank(obj) // Blank Value Check
{
    if( (obj.value == "") || (obj.value == null) )
    {
        var tit = obj.parentNode.firstChild.nodeValue;
        alert(tit+"이(가) 채워지지 않았습니다.");
        obj.focus();
        return false;
    }
}


3. 사용자 입력 상자의 값이 빈 경우를 체크한다.


function getClassName(str) // Get Class Attribute Values
{
    var cls = str.split(" ");
    var hasClass = false;
    for(var i=0; i<cls.length; cls++)
    {
        if(cls[i] == "numeral")
        {
            hasClass = true;
        }
        return hasClass;
    }
}


4. class 값을 가져와서 조건식(if)을 통해서 참/거짓만을 돌려주는 함수다.


function checkNumeral(str) // is Numeral
{
    var numeral = "0123456789";
    for(var j=0; j<str.length; j++)
    {
        if(numeral.indexOf(str.charAt(j)) == -1) { alert("아라비아 숫자를 입력해주세요"); return false; }
    }
}


5. getClassName 함수를 통해서 ‘numeral’ 이라는 class 가 포함된 경우(getClassName 함수가 true를 리턴한 경우) 숫자인지 아닌지를 확인한다.

6. 숫자는 정수형만을 선택하였고, 0부터 9까지의 숫자를 numeral 변수에 문자열로 담아둔다.

7. 반복문을 통해서 numeral 변수에 담겨진 숫자(문자형)가 담겨져 있는지 확인하여, 하나라도 숫자 아닌 것이 포함된 경우 경고창을 띄운다.


function checkMan(user_age) // is Man
{
    if(user_age < 0 || user_age > 100)
    {
        alert(user_age+"살? 귀신이냐! 외계인이냐?!");
        return false;
    }
}


8. 전달 받은 값이 숫자인지 확인이 되었다면 마지막으로 적절한 나이인지 확인한다. 0세 이상, 100세 이하의 경우를 적절한 나이로 설정했다.


2008년 9월 16일 화요일

구조와 표현, 동작의 분리 연습

이 글은 스터디 과제로 작성된 코드를 정리한 것입니다.
웹문서는 구조를 담은 HTML과 표현을 담당하는 CSS로 나뉘어진다. 그리고 동작을 담당하는 Script로 구분되는데, 이같은 분리는 구조와 표현 그리고 동작 영역이 서로의 영역으로 최대한 침범하지 않음으로써 유연함을 갖추면서 웹접근성을 확보하는데 도움을 줄 수 있다. 웹표준을 잘 따른 웹사이트가 CSS를 걷어 내었을 경우에도 HTML문서가 담고 있는 콘텐츠를 충분히 고객에게 전달할 수 있는 것과 같이 Script의 분리는 자바스크립트등 동적 기능이 제한적이거나 사용할 수 없는 경우에도 웹탐색을 지속시켜줄 수 있다.

다음은 사용자 입력 상자에 포커스가 위치한 경우 배경색이 바뀌는 동작을 처리하는 예제이다.

HTML보기.


CSS보기.


다음은 Script 코드이다.

var color = "c_red";

옵션(배경색 버튼)에 의해서 선택된 값이 저장되는 전역변수를 가장 먼저 선언했다.

window.onload = function()
{

1. HTML 문서가 완전히 로딩되었을 때 스크립트가 실행되도록 window.onload에 익명함수를 작성했다.

    obj = document.getElementsByTagName("input");

    obj[0].onfocus = function()
    {
        this.className = color;
    }

    obj[0].onblur = function()
    {
        this.className = "";
    }

2. obj 변수에 HTML 문서 내의 모든 input 요소를 배열로 담는다.

3. 예제로 사용된 HTML 문서에는 하나의 input 요소만 존재하므로 첫번째 배열 요소를 지정(obj[0])하는 것으로도 코드를 작성할 있었다.

4. obj[0] 객체(input 요소)에 onfocus 이벤트가 발생할 경우 객체의 class명을 전역 변수 color에 지정된 값(디폴트값은 c_red)이 설정되도록 했다.

5. 마찬가지로 obj[0] 객체에 onblur 이벤트가 발생할 경우 객체의 class명을 비워 원래대로 돌린다.

    idx = document.getElementById("colors");
    bts = idx.getElementsByTagName("button");

    for(var i=0; i<bts.length; i++){
        bts[i].onclick = function(){
            setColor(this);
        }
    }

}

6. id가 "colors"인 요소를 idx 변수에 담고, idx 객체를 기준으로 button 태그들을 모두 bts 변수에 배열 형태로 담는다.

7. HTML 문서에서 id가 colors인 요소 안에 위치한 button 요소는 총 3개이므로, 스크립트는 3번의 반복문을 실행하면서 버튼이 클릭될 때마다 setColor 함수를 실행시킨다.

function setColor(obj)
{
    color = obj.className;
    tit = obj.firstChild.nodeValue;
    alert(tit+"색이 지정되었습니다.");
}

8. setColor 함수는 버튼 요소에 지정된 class명을 전역변수 color에 설정하고, 메세지창을 띄운다.




사내 마크업 개발 프로세스

제가 사내에서 작성하여 적용하고 있는 마크업 개발 가이드의 업무 프로세스입니다. 수시로 업데이트를 하며 보완해 나가고 있습니다.

 전에 작성했던  웹 표준 개발 프로세스 이 다소 이상적이었다면, 다음은 수직적이고 폭포수 형태의 기존 프로세스를 유지한채 마크업 개발자의 업무 단계를 두단계로 나누어 적용한 형태입니다.

  1. 기획 : 담당자들간의 정보 공유가 이루어지고, 기획자에 의해 스토리보드 작성.
  2. 디자인 & 구조적 설계 : 디자인 작업이 시작되고, 스토리보드에 따른 기능별 HTML, Script, Flash(Action Script) 작성 및 구현.
  3. 마크업 개발 : 확정된 디자인을 통한 CSS 작업 및 플래시 결합, Script 적용.
  4. 서버 개발 : 서버측 언어를 통한 각종 기능 구현.
  5. 테스트 : HTML Validation, Cross Browing 등 웹접근성 테스트 실시.
  6. 오픈
마크업 담당자가 두번째 단계에서 기본적인 CSS가 적용되지 않는 HTML 문서를 우선 작성하고, 3단계에서 CSS를 작성함과 동시에 자바스크립트 구현을 동한 HTML 기반의 전체적인 개발 작업을 수행하는 것으로 잡았습니다.