[카테고리:] JavaScript

  • new Date(datestring) 사용 시 주의점

    자바스크립트에서 Date 객체를 생성할 때 파라메터에 날짜를 문자열로 넣어 줄 수 있습니다.

    new Date("October 13, 1975 11:13:00");

    다음과 같이 yyyy/mm/dd 형식의 문자열도 사용할 수도 있습니다.

    new Date("2014/03/01");
    new Date("2014-03-01");
    new Date("2014,03,01");

    그런데 정확한 원인은 알 수 없지만, 날짜가 하루 이전으로 생성되는 문제가 간헐적으로 발생하는군요. 그러므로 좀 귀찮더라도, 년, 월, 일을 직접 쪼개서 넣어주는 방식을 사용하는 것이 좋겠습니다.

    new Date(yyyy, mm, dd);
  • JavaScript와 SVG를 사용해서 아크(Arc) 그리기

    사각형이나 라운드 사각형, 원 같은 경우는 레이어와 CSS로 얼마든지 표현할 수 있지만, 좀 더 복잡한 도형의 경우에는 CSS로는 표현하기가 어렵습니다. 그래서 SVG를 사용하는 방법을 찾던 중, 아크를 그리는데 어려움이 있어서 샘플로 만들어 봤습니다.

    우선 데모를 보시죠.

    Path 객체를 사용해서 원하는 모양의 아크를 만들려니 계산식이 복잡해 지더군요. 그래서 중심좌표, 반지름 및 각도를 가지고 아크를 그릴 수 있도록 공식을 짜 봤습니다.
    시작점의 위치는 12시 방향으로 고정해서 잡고, 끝점의 좌표를 계산하여 시계 반대방향으로 아크를 그리도록 했습니다. 시계방향으로 그리거나, 시작점과 끝점을 제어하도록 하는 부분은 위 샘플을 응용하면 될 것 같네요.

    물론 쉽게 사용할 수 있는 공개된 소스들도 많이 있지만, 개념을 이해하는 차원에서…

  • iPad 음악 앱, 아티스트 목록 따라하기

    아이패드의 음악 앱에서 아티스트 목록으로 가서 가수를 선택하면, 해당 가수의 앨범 목록이 나옵니다.
    위아래로 스크롤을 해보면 앨범 제목과 커버자켓 이미지가 스크롤영역 상단에 고정되어 보이죠. 이걸 jQuery를 사용해서 만들어 봤습니다.

    iPad 음악, 아티스트 목록

    다음의 기기 및 브라우저를 지원합니다.
    PC의 파이어폭스, 크롬, 사파리 완벽 지원(jQuery 사용)
    IE9, 오페라 부분 지원(iScroll을 사용하여 기능 구현)
    iOS 기기(iPhone 3GS 이전, iPad 오리지널 제외) 부분 지원(iScroll을 사용하여 기능 구현)
    IE8 이전 버전 미지원
    안드로이드 미지원

    파이어폭스, 크롬 및 사파리의 경우 jQuery와 scroll 이벤트를 사용하면 이상없이 잘 동작합니다.

    그러나 IE9와 오페라의 경우에는 화면 상단에서 레이어가 떨리는 현상이 발생하기 때문에 iScroll을 사용해서 동작하도록 구현 했습니다. 이때 iScroll에 scroll 이벤트가 없고, 휠 스크롤의 거리 등의 문제로 인해, iScroll 4에 약간 수정을 가한 파일을 사용했습니다.

    IE8 이전 버전은 iScroll에서 지원하지 않으므로 제외했습니다.

    iOS 기기도 대부분 iScroll을 통해 지원하지만, 일부 구형 모델은 속도 문제로 지원하지 않습니다.

    안드로이드는 갤럭시 S3, 넥서스원, 베가 등의 단말에서 테스트 해 봤는데, 문제가 많아서 제외시켜 버렸습니다. jQuery로 제어하면 상단 레이어가 떨리고, iScroll을 사용하면 속도가 느려지는 등 많은 문제들이 생기네요. 게다가 단말기 마다 차이가 나고, 한 기기에서도 브라우저 별로도 다르게 동작하는 등 문제가 있습니다.

    IE10 이상 및 윈도우 모바일 등 위에 언급되지 않은 환경에서는 테스트 해보지 못했습니다. 혹시 확인해 보실 수 있으면, 댓글로 결과 알려주세요.

    ps. 정말, 웹 작업을 하다보면 IE가 개판이라고 몸소 느끼지만, 모바일 작업을 해보면 안드로이드도 이에 뒤지지 않는다는 사실을 절감하게 되는군요.

  • JavaScript Star Rating

    별점 체크 기능을 자바스크립트로 구현했습니다.
    아래 HTML 태그와 같이 data-label와 data-value 값만 설정해 주면, 내부 코드가 자동으로 생성됩니다.

    Star Rating라곤 했지만 별모양 이미지 작업은 귀찮아서 그냥 원으로 처리. 디자인 적인 부분은 CSS 스타일을 수정해서 사용하세요.
    PC와 모바일 브라우저 모두 지원합니다. (IE7 이전 버전은 제외)

    Demo: http://hangunsworld.com/blogSamples/starRating/

  • iScroll 4에 onScroll 이벤트 사용하여 iOS의 TableView 구현하기

    최근 모바일웹 프로젝트를 진행하면서, DIV 스크롤 기능이 필요하여 iScroll을 사용하게 되었습니다. 그런데 아직 onScroll 이벤트를 제공하지 않아서, 약간의 코드를 추가해서 onScrolling 이벤트를 만들었습니다.

    다음과 같이 onScrolling 이벤트를 추가해 주고,

    // Events
    onRefresh: null,
    onBeforeScrollStart: function (e) { e.preventDefault(); },
    onScrollStart: null,
    onBeforeScrollMove: null,
    onScrollMove: null,
    onBeforeScrollEnd: null,
    onScrollEnd: null,
    onTouchEnd: null,
    onDestroy: null,
    onZoomStart: null,
    onZoom: null,
    onZoomEnd: null,
    onScrolling:null

    그리고 _pos함수에서 위에서 정의된 onScrolling 이벤트를 실행하도록 했습니다.

    _pos: function (x, y) {
    	if (this.zoomed) return;
    
    	x = this.hScroll ? x : 0;
    	y = this.vScroll ? y : 0;
    
    	if (this.options.useTransform) {
    		this.scroller.style[transform] = 'translate(' + x + 'px,' + y + 'px) scale(' + this.scale + ')' + translateZ;
    	} else {
    		x = m.round(x);
    		y = m.round(y);
    		this.scroller.style.left = x + 'px';
    		this.scroller.style.top = y + 'px';
    	}
    
    	this.x = x;
    	this.y = y;
    		
    	if (this.options.onScrolling) this.options.onScrolling.call(this);
    
    	this._scrollbarPos('h');
    	this._scrollbarPos('v');
    },

    스크롤 이벤트를 받으려면, iScroll 초기화 시에 다음과 같이 콜백함수를 등록해 주면 됩니다.

    myScroll = new iScroll('wrapper', {onScrolling: scrolling});
    
    function scrolling(){
    	// onScroll event
    }

    약 2주일 정도 테스트 해보고 있는데, 아직까진 별다른 문제는 없어 보이네요.

    iOS TableView Demo
    Simple TableView Demo
    TableView with IndexBar Demo