본문으로 바로가기

함수단위와 프로토타입의 탭 메뉴 만들기





함수단위의 탭 메뉴


기본 마크업 구성

html
<ul id="tabMenu1">    
    <li>Lorem ipsum dolor sit amet.</li>
    <li>Lorem ipsum dolor sit amet. Lorem ipsum dolor.</li>
    <li>Lorem ipsum dolor sit amet.</li>
    <li>Lorem ipsum dolor sit amet. Lorem ipsum dolor.</li>
</ul>

<ul id="tabMenu2">    
    <li>Lorem ipsum dolor sit amet.</li>
    <li>Lorem ipsum dolor sit amet. Lorem ipsum dolor.</li>
    <li>Lorem ipsum dolor sit amet.</li>
    <li>Lorem ipsum dolor sit amet. Lorem ipsum dolor.</li>
</ul>




함수단위 탭 메뉴 로직

javascript
$(function() {
    tabMenu("#tabMenu1",0);
    tabMenu("#tabMenu2",1);
});

function tabMenu(selector, index) {
    // 요소 리스트
    var $tabMenu = null,
            $menuItem = null,
            $selectItem = null;

    // 요소 초기화
    function init(el) {
        $tabMenu = $(el);
        $menuItem = $tabMenu.find('li');
    }

    // 이벤트 등록
    function initEvent() {
        $menuItem.on('click', function () {
            setSelectItem($(this));
        })
    }

    // 해당 메뉴 아이템 선택하기
    function setSelectItem($menuItem) {
        // 기존 아이템 비활성화 처리하기
        if($selectItem) {
            $selectItem.removeClass('select');
        }

        // 신규 아이템 활성화 처리하기
        $selectItem = $menuItem;
        $selectItem.addClass('select');
    }

    // index 에 해당하는 메뉴 아이템 초기 설정하기
    function indexItemAt(index) {
        setSelectItem($menuItem.eq(index));
    }

    // 함수 호출
    init(selector);
    initEvent();
    indexItemAt(index);

}


함수 단위 프로그래밍의 단점은 함수가 호출될 때 마다 함수 내부에 동일한 함수와 변수가 만들어집니다.





프로토타입을 이용한 클래스 단위의 탭 메뉴

프로토타입을 이용하면 함수 단위 프로그래밍의 단점을 해결할 수 있습니다.

객체가 상속을 통한 동일한 공간이 만들어지기 때문에 공통으로 사용할 수 있습니다.

위의 함수 단위 코딩을 프로토타입을 이용한 클래스화 시켜보겠습니다.

javascript
$(function() {

    // 첫 번째 탭메뉴 인스턴스 생성
    var firstTab = new TabMenu("#tabMenu1");
    firstTab.indexItemAt(1);

    // 두 번째 탭메뉴 인스턴스 생성
    var secondsTab = new TabMenu("#tabMenu2");
    secondsTab.indexItemAt(0);

});

// CLASS Define
function TabMenu(selector) {
    this.$tabmenu = null;
    this.$menuItem = null;
    this.$selectItem = null;

    this.init(selector);
    this.initEvent();
}

// 프로토타입 그룹화
TabMenu.prototype = {
    // 요소 초기화
    'init' : function (el) {
        this.$tabmenu = $(el);
        this.$menuItem = this.$tabmenu.find('li');
    },

    // 이벤트 등록하기
    'initEvent' : function () {
        var _self = this;
        this.$menuItem.on('click', function () {
            _self.setSelectItem($(this));
        })
    },

    // 메뉴 아이템 선택 설정하기
    'setSelectItem' : function ($item) {
        // 기존 아이템 비활성화 처리하기
        if(this.$selectItem) {
            this.$selectItem.removeClass('select');
        }
        // 신규 아이템 활성화 처리하기
        this.$selectItem = $item;
        this.$selectItem.addClass('select');
    },

    // index 에 해당하는 메뉴 아이템 선택하기
    'indexItemAt' : function (index) {
        var $indexItem = this.$menuItem.eq(index)
        // 기존 메서드의 재사용
        this.setSelectItem($indexItem);
    }
}



Jaehee's WebClub


'Code Lab' 카테고리의 다른 글

탭메뉴 플러그인(자동롤링)  (0) 2015.09.22
keycode 체크하기  (0) 2015.08.22
window창에서 문서상 가장 하단의 scrollTop 값 구하기  (0) 2015.03.16
반올림 함수  (0) 2015.02.20
가까운 수 구하기(배열)  (0) 2015.02.20