레이블이 자바스크립트인 게시물을 표시합니다. 모든 게시물 표시
레이블이 자바스크립트인 게시물을 표시합니다. 모든 게시물 표시

2009년 10월 12일 월요일

2009년 9월 30일 수요일

오페라 웹표준 강좌 44장. 자바스크립트 함수

2009년 9월 11일 금요일

오페라 웹표준 강좌 51. 적절한 낮춤 대 점진적 향상

2009년 9월 9일 수요일

자바스크립트 프레임워크를 한 자리에

주요 자바스크립트 프레임워크를 한 화면에서 비교해 볼 수 있는 사이트가 있어 소개해 드립니다.
덴마크의 웹디자이너 Matthias Schutz가 제작한 페이지로 jQuery, MooTools, Prototype 등 주요 자바스크립트 프레임워크의 용량, 속도, UI 툴킷 지원 여부, 라이센스 정책을 한번에 확인해 볼 수 있도록 제공하고 있습니다. 또한, 주요 기능 구현을 위한 코드까지도 비교해 볼 수 있도록 페이지를 구성해 놓고 있어서 자바스크립트 프레임워크를 적용하고자 하시는 분들께 꽤나 도움이 될 것 같습니다.
Javascript Framework Matrix

Javascript Framework Matrix


2009년 9월 8일 화요일

오페라 웹표준 강좌 42장, 자바스크립트 멋진 예제들

클리어보스에서 번역중인 오페라 웹표준 강좌 42장 자바스크립트 멋진 예제들이 번역 되었습니다. 검은태양님 께서 수고해 주셨습니다.


번역된 다른 강좌들:

2009년 9월 6일 일요일

오페라 웹표준 강좌 46장. DOM 여행

오페라 웹표준 강좌 41장. 자바스크립트 시작하기

2009년 8월 31일 월요일

오페라 웹표준 강좌 48장, 동적 스타일 - 자바스크립트로 CSS 다루기

2009년 8월 27일 목요일

오페라 웹표준 강좌 49장, 자바스크립트 이벤트 핸들링

2008년 11월 15일 토요일

간단한 이미지 슬라이더 만들기

과거에는 게시판을 활용한 이미지 갤러리를 활용하는 일이 많았다. 하지만 근래 들어서는 라이트박스 효과와 더불어 슬라이더 형태의 이미지 갤러리를 많이 적용하는 것을 볼 수 있다. 특별히 메인 화면과 같이 콘텐츠의 양이 많은 경우 공간을 효과적으로 활용하기 위한 방법으로 많이 사용된다. 플래시 무비를 활용하는 경우도 있지만 크게 어렵지 않게 자바스크립트를 이용해서도 만들어볼 수 있어서 소개한다.

가장 먼저 다음과 같이 보이도록 마크업과 스타일시트 작업을 한다.
이미지 슬라이더
이미지 목록과 콘트롤 버튼을 정의하고, 목록을 <UL>요소로 정의했다.
<div id="result"></div>
<h1>Image Slider</h1>
<div id="imageSlider">
    <div class="imageList">
        <ul>
            <li><img src="http://www.clearboth.org/study/081112/thumb_01.png" width="84" height="84" alt="썸네일 이미지 1" /></li>
            <li><img src="http://www.clearboth.org/study/081112/thumb_02.png" width="84" height="84" alt="썸네일 이미지 2" /></li>
            <li><img src="http://www.clearboth.org/study/081112/thumb_03.png" width="84" height="84" alt="썸네일 이미지 3" /></li>
            <li><img src="http://www.clearboth.org/study/081112/thumb_04.png" width="84" height="84" alt="썸네일 이미지 4" /></li>
            <li><img src="http://www.clearboth.org/study/081112/thumb_05.png" width="84" height="84" alt="썸네일 이미지 5" /></li>
            <li><img src="http://www.clearboth.org/study/081112/thumb_06.png" width="84" height="84" alt="썸네일 이미지 6" /></li>
            <li><img src="http://www.clearboth.org/study/081112/thumb_07.png" width="84" height="84" alt="썸네일 이미지 7" /></li>
            <li><img src="http://www.clearboth.org/study/081112/thumb_08.png" width="84" height="84" alt="썸네일 이미지 8" /></li>
            <li><img src="http://www.clearboth.org/study/081112/thumb_09.png" width="84" height="84" alt="썸네일 이미지 9" /></li>
            <li><img src="http://www.clearboth.org/study/081112/thumb_10.png" width="84" height="84" alt="썸네일 이미지 10" /></li>
        </ul>
    </div>
    <div class="controller">
        <input type="button" value="◀" title="앞으로" class="btn_prev" />
        <input type="button" value="▶" title="뒤로" class="btn_next" />
    </div>
</div>

이미지 목록을 담은 <UL>요소를 reliative로 정의한 것에 주목하자.
div#imageSlider { position: relative; width: 600px; height: 100px; border: 1px solid #ccc; }
div#imageSlider div.imageList { position: relative; width: 500px; height: 86px; margin: 8px 50px 0; overflow: hidden;  }
div#imageSlider div.imageList ul { position: relative; left: 0; list-style: none; width: 1000px; margin: 0; padding: 0; overflow: hidden; }
div#imageSlider div.imageList ul li { float: left; margin: 0 17px 0 0; }
div#imageSlider div.imageList ul li img { border: 1px solid #ccc; }
div#imageSlider div.controller input { position: absolute; top: 12px; width: 30px; height: 80px; cursor: pointer; }
div#imageSlider div.controller input.btn_prev { left: 10px; }
div#imageSlider div.controller input.btn_next { right: 10px; }
#result { position: relative; top: 0; left: 0; height: 20px; padding: 5px; }
.alert { background: #FF0000; color: #fff; }

자바스크립트를 작성하기 전에 어떻게 작동시켜야 할지를 고민해보자.
이미지 슬라이더 설계도
각각의 이미지들은 <LI>요소로 감싸고, 목록은 <UL>로 감싸 주었다. 그리고, <UL>요소는 <DIV>요소로 감싸고 있다. 좌우로 버튼이 위치해 있다.
위 설계도를 보면 <DIV>요소가 <UL>요소보다 가로 길이가 짧다. 즉, <UL>요소의 일부분만을 보여주도록 구멍 역활을 하고 있다고 보면 된다. 좌우에 위치한 버튼을 선택했을 때 자바스크립트가 <UL>요소의 left 속성 값을 변경하면서 <DIV>요소를 통해 보여지는 위치를 바꾸게 된다. 이것이 이미지 슬라이더의 기본적인 원리이다.

자바스크립트를 살펴보자.

window.onload = function()
{
    res = document.getElementById("result");
    imageSlider(103, 1); // Move Width, Move Item Count
}
HTML 문서가 웹브라우저에 의해 모두(이미지 포함) 렌더링 되면 imageSlider 함수를 실행한다. res 변수는 인덱스 값 등 작동 결과를 임시로 보여주기 위한 것이다.

function imageSlider(w, cnt)
{
    // Global Variable
    imageList = new Object();
    item_width = w*cnt;
    curr_position = 0;
    curr_idx = 0;
    tmp = 0;

    var slider = document.getElementById("imageSlider");
    var groups = slider.getElementsByTagName("div");
    for(var i=0; i < groups.length; i++)
    {
        if(groups[i].className == "imageList") imageList = groups[i].getElementsByTagName("ul")[0]; // Image List (UL Element)
    }
    var lis = imageList.getElementsByTagName("li");
    imageList.style.width = (w * lis.length) + "px";
   
    // Controller
    var bts = slider.getElementsByTagName("input");
    for(var i=0; i<bts.length; i++)
    {
        if(bts[i].type == 'button' && bts[i].className == 'btn_prev')
        {
            bts[i].onclick = function() { sliderPrev(cnt); } // Click To Prev
        }
        else if(bts[i].type == 'button' && bts[i].className == 'btn_next')
        {
            bts[i].onclick = function() { sliderNext(cnt); } // Click To Next
        }
    }
}
imageSlider 함수가 하는 역활은 간단하다. 한번에 이동할 가로 길이의 값과 한번에 이동한 이미지의 수를 정하고, 좌우 버튼의 이벤트를 활성화 시키는 것이다.

function sliderNext(cnt) // Next Behavior
{
    if(curr_idx < 5)
    {
        imageList.style.left = (curr_position - item_width) + "px";
        curr_position -= item_width;
        for(var i=0; i<cnt; i++) curr_idx++;
        res.innerHTML = "Index : " + curr_idx;
        res.className = "";
    }
    else
    {
        res.innerHTML += " / 더이상 이미지가 없습니다";
        res.className = "alert";
    }
}
sliderNext 함수는 <UL>요소의 left 속성값을 현재값에서 한번에 움직여야 할 값을 뺀 값으로 설정하여, 결과적으로 사용자에게 우측에서 좌측으로 이미지들이 한칸씩 움직이는 것처럼 보이게 한다. 한번 움직여 질 때마다 curr_idx 변수는 현재 보이는 <LI>요소의 인덱스 값을 기억하고 있다가 더이상 보여질 <LI>요소(이미지)가 없을 때 경고 메세지를 보여준다.

function sliderPrev(cnt) // Prev Behavior
{
    if(curr_idx > 0)
    {
        imageList.style.left = (curr_position + item_width) + "px";
        curr_position += item_width;
        for(var i=0; i<cnt; i++) curr_idx--;
        res.innerHTML = "Index : " + curr_idx;
        res.className = "";
    }
    else
    {
        res.innerHTML += " / 처음입니다";
        res.className = "alert";
    }
}
sliderPrev 함수 역시 sliderNext 함수와 똑같다. 단지 left 속성 값을 현재 값에서 빼지 않고 더해서 이번에는 좌측에서 우측으로 움직이는 것처럼 보이게 할 뿐이다. 역시 더이상 보여질 이미지가 없는 경우 에러 메세지를 보여준다.

[데모]

2008년 10월 20일 월요일

인풋박스 안에 사라지는 제목

간단한 스크립트다. 사용자 입력상자 안에 제목이 들어 있고, 사용자가 입력상자를 선택(Focus) 했을 때는 제목이 사라지고, 입력상자를 벗어난 경우 본래대로 나타나 보이게 하는 스크립트다. 단 새로운 내용이 입력된 경우에는 제목이 나타나지 않고, 입력된 내용이 유지되어야 한다. 훌륭하게 작성된 스크립트가 많지만 가끔은 그런 스크립트가 초보자들 입장에서 가져와서 해석하는 것이 여간 어려운 일이 아닐 수 없다.

적어도 이 예제는 쉽지 않을까 싶다.


 

<!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="ko" lang="ko">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>new document</title>
  <meta name="Author" content="Bomnun" />
  <meta name="Reply-to" content="chubzo@gmail.com" />
  <script type="text/javascript">
  <!--
      window.onload = function()
      {
          clickToHide(); // HTML 문서 로딩이 완료되면 실행
      }

      function clickToHide()
      {
          inputs = document.getElementsByTagName("input"); // 문서내 모든 input 요소(Tag)를 inputs 배열 변수에 담고
          for(var i = 0; i<inputs.length; i++) // 배열에 저장된 갯수만큼 반복시킨다
          {
              if(inputs[i].type == "text") // input 요소의 타입이 'text' 인것만 골라서
              {
                  inputs[i].value = inputs[i].getAttribute("title"); // 입력상자의 title 속성값을 value 속성값으로 지정하면 HTML 문서가 로딩된 후에 입력상자에는 제목이 들어가게 된다
                  inputs[i].onfocus = function() // 입력상자가 선택(Focus 이벤트)될 때
                  {
                      if(this.value == this.getAttribute("title")) // 입력상자 값이랑 title 속성값이 같으면
                      {
                          this.value = ""; // 비우고
                      }
                  }
                  inputs[i].onblur = function() // 입렵상자를 떠날때(Blur 이벤트)
                  {
                      if(this.value == "") // 값이 비어 있으면
                      {
                          this.value = this.getAttribute("title"); // title 속성값(제목)을 다시 넣는다
                      }
                  }
              }
          }
      }
  //-->
  </script>
  <style type="text/css">
      fieldset { padding: 30px; }
  </style>
</head>
<body>
<fieldset>
  <legend>모교 이름 쓰기</legend>
  <p><input name="user_txt_1" type="text" title="초등학교 이름" /></p>
  <p><input name="user_txt_2" type="text" title="중학교 이름" /></p>
  <p><input name="user_txt_3" type="text" title="고등학교 이름" /></p>
</fieldset>
</body>
</html>

최근에 로그인 영역 등에 '로그인', '비밀번호'와 같은 제목을 입력상자 안에 넣는 디자인이 자주 등장하는데 위와 같은 방법으로 처리할 수 있을것 같다. 물론 디자인으로 처리된 경우는 위 방법은 어렵고 배경 이미지를 스타일시트로 호출하는 방식이 좋은것 같다.


이 글은 스프링노트에서 작성되었습니다.

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에 설정하고, 메세지창을 띄운다.