1. 程式人生 > >jQuery外掛開發

jQuery外掛開發

Lightweight Start 模式

1.什麼是Lightweight模式

這種模式適合於外掛開發新手或者是隻是想實現簡單的功能,Lightweight start使用了以下內容:

  • 常見最佳實踐
  • window、document和undefined作為引數傳入
  • 基本的預設物件
  • 簡單的外掛建構函式,用於與初始化建立相關的邏輯,以及用於所使用元素的賦值
  • 擴充套件有預設值的選項
  • 構造函數週圍的lightweight包裝器,避免出現多例項
// 函式呼叫之前的分號是為了安全的目的,防止前面的其他外掛沒有正常關閉。
;(function($, window, document, undefined)
{
"use strict"; // 這裡使用的undefined是ECMAScript3裡的全域性變數undefined,是可以修改的。 // undefined沒有真正傳進來,以便可以確保該值是真正的undefined。ECMAScript5裡,undefined是不可修改的。 // window和document傳遞進來作為區域性變數存在,而非全域性變數, // 因為這可以加快解析流程以及影響最小化(尤其是同事應用一個外掛的時候)。 // 建立預設值 var pluginName = "defaultPluginName"; var defaults = { propertyName: "value"
}; // 外掛真正的建構函式 function Plugin(element, options) { this.element = element; // jQuery extend方法用於將兩個或多個物件合併在一起,在第一個物件裡進行排序。 // 第一個物件通常為空,因為我們不想為外掛的新例項影響預設的option選項。 this.options = $.extend({}, defaults, options); this._defaults = defaults; this
._name = pluginName; this.init(); } $.extend(Plugin.prototype, { init: function() { // 這裡處理初始化邏輯 // 已經可以訪問DOM,並且通過例項訪問options,例如this.element, this.options. // 可以新增更多的方法,呼叫方式如下所示 this.yourOtherFunction("jQuery Boilerplate"); }, yourOtherFunction: function(text) { // 邏輯程式碼 $(this.element).text(text); } }); // 真正的外掛包裝,防止出現多例項 $.fn[pluginName] = function(options) { return this.each(function() { if (!$.data(this, "plugin_" + pluginName)) { $.data(this, "plugin_" + pluginName, new Plugin(this, options)); } }); } })(jQuery, window, document);

2.用法

$("#elem").defaultPluginName({
    propertyName: "a custom value"
});

3.實戰

基於checkbox實現開關按鈕

1.html code

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>flipswitch</title>

    <style type="text/css">
        .flipswitch {
            width: 48px;
            height: 28px;
            border-radius: 14px;
            cursor: pointer;
            background-color: #ccc;
            display: inline-block;
            text-align: left;
            position: relative;
            overflow: hidden;
        }

        .flipswitch > input[type=checkbox] {
            width: 100%;
            height: 100%;
            position: absolute;
            top: -10%;
            left: -5%;
            opacity: 0.01;
            cursor: pointer;
        }

        .flipswitch.active {
            text-align: right;
            background-color: #5cb85c;
        }

        .flipswitch span {
            width: 24px;
            height: 24px;
            margin: 2px;
            border-radius: 13px;
            display: inline-block;
            background: #fff;
        }
    </style>

    <script src="http://cdn.bootcss.com/jquery/1.9.1/jquery.min.js"></script>
    <script type="text/javascript" src="jquery.flipswitch.js"></script>
    <script type="text/javascript">
        (function($, window, document) {
            $(function() {
                $(".flipswitch").flipswitch(function(status) {
                    console.log(status);
                });
            })
        })(jQuery, window, document);
    </script>
</head>
<body>
    <div style="width: 800px; margin: 20px auto;">
        <input type="checkbox" class="flipswitch" checked />
    </div>
</body>
</html>

2.jquery.flipswitch.js

;(function ($, window, document, undefined) {
    "use strict";

    var pluginName = "flipswitch";

    function Plugin(element, statusChanged) {
        this.element = element;
        this.statusChanged = statusChanged;
        this._name = pluginName;
        this.init();
    }

    $.extend(Plugin.prototype, {
        init: function () {
            var base = this;
            var statusChanged = base.statusChanged;
            var $elem = $(base.element);

            $elem.wrap('<div class="' + $elem.attr("class") + '"></div>');
            $("<span></span>").insertBefore($elem);

            var $parent = $elem.parent();
            if($elem.prop("checked")) {
                $parent.addClass("active");
            }

            $elem.on("change", function() {
                $parent.toggleClass("active");
                if($.isFunction(statusChanged)) {
                    statusChanged($elem.prop("checked"));
                }
            })
        }
    });

    $.fn[pluginName] = function (statusChanged) {
        return this.each(function () {
            if (!$.data(this, "plugin_" + pluginName)) {
                $.data(this, "plugin_" +
                    pluginName, new Plugin(this, statusChanged));
            }
        });
    };

})(jQuery, window, document);

3.效果圖
flipswitch