본문 바로가기

프로그래밍/jQuery

jQuery slide 플러그-인(plugin) 개발

● 요구사항 

 - 롤링(슬라이드) 갤러리 기능 추가


● 직접 플러그-인(plugin) 개발

 - 관리자가 일관된 패턴으로 쉽게 등록이 가능하다.

 - 슬라이드 type 제공 

   - 원하는 페이지에 쉽게 적용이 가능하다.(범용성)

● 스킬

 1. jQuery.extend( target [, object1] [, objectN] )

  - 두개 이상의 객체를 합친다.(Merge)

  - object1 : 합쳐질 때, 기준이 될 객체 

  - objectN : 기준 객체에 합쳐질 추가 객체 

  !. 기준이 되는 객체에 있는 키와 합쳐질 두번째 객체에 있는 키가 동일할 경우, 첫번째 객체의 값이 덮어써져 버린다.

 2. 객체 메서드 

  - jQuery.fn 객체를 확장한다.(jQuery.fn은 jQuery.prototype의 별칭)

 3. $.getScript

- GET HTTP 요청을 사용하여 서버에서 JavaScript 파일을 로드한 다음 실행.

!. getScript는 $.ajax({ url : url, dataTpe : "script", success : success }); Ajax함수이다.

- jQuery 1.5부터는 .fail() 오류를 설명하는데 사용.

 4. 다수의 엘리먼트에 함수의 기능이 적용되야 함.

  - .each() 사용, 묵시적인 반복(implicit iteration)을 수행.

아래는 객체 메서드을 이용한 직접 플러그-인(plugin) 코드를 작성 해보았습니다.

● jquery.slideplugin-1.0.js - owl.carousel.js 오픈소스를 이용.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
(function ($) {
    $.fn.AdprintSlide = function (items, options, type) {
        var $this = this;
        $.getScript("/js/slides/owl.carousel.js")
            .done(function () {
            return $this.each(function () {
                var className = $(this).attr("class");
                    appendHtmlItems(className, items);
                    var typeOfFunction = getTypeOfFunction(type, options);
                    var opts = $.extend({}, $.fn.AdprintSlide.defaults, typeOfFunction);
                    $this.find(".owl-carousel").owlCarousel(opts);
            });
        }).fail(function () {
            console.log("getScript fail");
        });
    }
 
    $.fn.AdprintSlide.defaults = {
        items: 4,
        loop: true,
        margin: 10,
        autoplay: true,
        autoplayTimeout: 1000,
        autoplayHoverPause: true,
        nav: false,
        autoWidth: false
    }
 
    var getTypeOfFunction = function(type, options){
        if (typeof (type) != "undefined" && type.toLowerCase() == "animate") {
            return slideOption_Animate(options);
        }
        return slideOption_AutoPlay(options);
    }
 
    var slideOption_Animate = function (opts) {
        if (typeof (opts) == "undefined") { return {}; }
        return {
            animateOut: 'fadeOut',
            items: 1,
            margin: opts.margin,
            autoplayTimeout: opts.autoplayTimeout,
            autoplayHoverPause: opts.autoplayHoverPause,
            nav: opts.nav,
        }
    }
 
    var slideOption_AutoPlay = function (opts) {
        if (typeof (opts) == "undefined") { return {}; }
        return {
            items: opts.items,
            autoplayTimeout: opts.autoplayTimeout,
            autoplayHoverPause: opts.autoplayHoverPause,
            nav: opts.nav,
            autoWidth: opts.autoWidth
        }
    }
 
    var loadScript = function() {
        var script = document.createElement('script');
        script.setAttribute("type""text/javascript");
        script.setAttribute("scr""/js/slides/owl.carousel.js");
        document.getElementsByTagName('head')[0].appendChild(script);
    }
 
    var loadCss = function() {
        $('head').append('<link rel="stylesheet" href="/css/slides/test/owl.carousel.min.css"/>');
        $('head').append('<link rel="stylesheet" href="/css/slides/test/owl.theme.default.min.css"/>');
    }
 
    var appendHtmlItems = function(className, items) {
        var h = "<div class=\"large-12 columns\"><div class=\"owl-carousel owl-theme\">";
        $.each(items, function (i, t) {
            h += "<div class=\"item\">"
                + "<a href='" + t.LinkUrl + "' target=\"_blank\">"
                + "<img src='" + t.ImagePath + "'/>"
                + "</div>";
        });
        h += "</div></div>";
        $('.' + className).append(h);
    }
 
    loadScript();
    loadCss();
})(jQuery);
 
cs

※ 주의 사항

  - 위 코드는 jQuery 1.x이상 먼저 Load되어야 합니다. 

  - jQuery가 로딩되지 않았다면 동적으로 로드 할 수 있습니다. 위의 loadScript 함수와 같이 jQuery를 로드 할 수 있습니다.

  - jQuery가 로드 되었는지 확인 할 수 있는 방법도 있습니다. script.readyState == 'complete' || script.readyState == 'load' 인지 확인 가능


● html 소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<script type="text/javascript" src="/js/slides/owl_carousel.widget.js"></script>
<div class="categorySlide"></div>
<script type="text/javascript">
    var items1 = [
        {
            "LinkUrl"""
            , "ImagePath"""
        }, {
            "LinkUrl"""
            , "ImagePath"""
        }, {
            "LinkUrl"""
            , "ImagePath"""
        }, {
            "LinkUrl"""
            , "ImagePath"""
        }, {
            "LinkUrl"""
            , "ImagePath"""
        }, {
            "LinkUrl"""
            , "ImagePath"""
        }
    ];
$(".categorySlide").AdprintSlide(items1, { autoplayHoverPause: true, autoplayTimeout : 1300 }, "autoplay");
</script>
cs

선택자에 AdprintSlide 메서드를 호출합니다. 

● 확장 

 - 관리 기능이 있다면 html 소스에서 item1의 대체로 DB에서 조회하여 보여 줄 수도 있겠습니다. 


참고 사이트 

http://www.nextree.co.kr/p9989/