天天看點

jquery web插件實作

首先這是一個小demo,嘗試性的去實作了幾個功能。

這是html頁面

<!DOCTYPE html>
<html >
<head>
    <meta charset="UTF-8">
    <title>widget</title>
    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
    <script src="test5.js"></script>
</head>
<body>
<style>
    .custom-colorize {
        font-size: 20px;
        position: relative;
        width: 75px;
        height: 75px;
    }
    .custom-colorize-changer {
        font-size: 10px;
        position: absolute;
        right: 0;
        bottom: 0;
    }
</style>
<div>
    <div id="my-widget1">改變顔色</div>
    <div id="my-widget2">改變顔色</div>
    <div id="my-widget3">改變顔色</div>
    <div id="my-widget4">改變顔色</div>
    <button id="disable">切換 disable 選項</button>
    <button id="black">改變黑色</button>
</div>
</body>
<script>
    $(function () {
        $("#my-widget1").colorize({
            red: 60, blue: 60
        });
        $("#my-widget2").colorize();
        $("#my-widget3").colorize({
            green: 128
        });
        $("#my-widget3").colorize({
            red: 60, blue: 60
        });
        $("#disable").click(function () {
            $(".custom-colorize").each(function () {
                if ($(this).colorize("option", "disabled")) {
                    $(this).colorize("enable");
                } else {
                    $(this).colorize("disable");
                }
            });
        });
        $("#black").click(function () {
            $(".custom-colorize").each(function () {
                $(this).colorize({
                    red: 0,
                    green: 0,
                    blue: 0
                });
            });
        });
    })
</script>
</html>
           

這是js頁面(就是上文中引用的test5.js,為什麼是5?因為這是我嘗試的第5個版本),js的話還有很多改進的地方,比如代碼備援,還有插件的屬性定義格式可能也不是很好)

(function (factory) {
    if (typeof define === "function" && (define.amd || define.cmd) && !jQuery) {
        // AMD或CMD
        define([ "jquery" ],factory);
    } else if (typeof module === 'object' && module.exports) {
        // Node/CommonJS
        module.exports = function( root, jQuery ) {
            if ( jQuery === undefined ) {
                if ( typeof window !== 'undefined' ) {
                    jQuery = require('jquery');
                } else {
                    jQuery = require('jquery')(root);
                }
            }
            factory(jQuery);
            return jQuery;
        };
    } else {
        //Browser globals
        factory(jQuery);
    }
}(function ($) {

    var Plugin = function (element, options) {
        this.element = element;
        this.options = options;
    };

    Plugin.prototype = {
        console: function () {
            console.log(this.element);
            console.log(this.options);
        },
        getElement: function () {
            return this.element
        },
        setElement: function (element) {
            this.element = element;
        },
        getOptions: function () {
            return this.options
        },
        setOptions: function (options) {
            this.options = options;
        },
        disabled: function () {
            this.options.disable = true;
        }
    };

    var colorize = {
        enable: function () {
            var ui = $._data($(this)[0], "colorize");
            if (!ui) {
                $.error('error');
            } else {
                var options = ui.getOptions();
                options["disabled"] = false;
                $._data($(this)[0], "colorize").setOptions(options);
            }
        },
        disable: function () {
            var ui = $._data($(this)[0], "colorize");
            if (!ui) {
                $.error('error');
            } else {
                var options = ui.getOptions();
                options["disabled"] = true;
                $._data($(this)[0], "colorize").setOptions(options);
            }
        },
        option: function (param) {
            var ui = $._data($(this)[0], "colorize");
            if (!ui) {
                $.error('error');
            } else {
                return ui.getOptions()[param];
            }
        },
        init: function (param) {
            return this.each(function () {

                var $this = $(this);
                var _api = {};
                var defaults = {
                    red: 255,
                    green: 0,
                    blue: 0,
                    disabled: false
                };

                // 用來判斷是否已經被定義過了,定義過了就不用預設屬性了
                var options;
                var ui = $._data(this, "colorize");
                if (!ui) {
                    options = $.extend({}, defaults, param);
                    ui = new Plugin(this, options);
                    $._data(this, "colorize", ui);
                } else {
                    options = $.extend({}, ui.getOptions(), param);
                    ui.setOptions(options);
                }

                var changer = $("<button>", {
                    text: "改變",
                    "class": "custom-colorize-changer"
                });

                var refresh = function (target) {
                    target.css("background-color", "rgb(" +
                        options.red + "," +
                        options.green + "," +
                        options.blue + ")"
                    );
                };

                var random = function () {
                    if (options.disabled === true)
                        return;
                    var colors = {
                        red: Math.floor(Math.random() * 256),
                        green: Math.floor(Math.random() * 256),
                        blue: Math.floor(Math.random() * 256)
                    };
                    options = $.extend({}, options, colors);
                    $._data($this[0], "colorize").setOptions(options);
                    refresh($this);
                };

                _api.create = function () {
                    $this.addClass("custom-colorize");
                    // changer.appendTo($this).button();
                    changer.appendTo($this);
                    changer.on("click", random);
                    refresh($this);
                };

                _api.create();
            });
        }
    };


    $.fn.colorize = function(param) {
        if (colorize[param]) {
            return colorize[param].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof param === 'object' || !param) {
            return colorize.init.apply(this, arguments);
        } else {
            $.error('Method' + method + 'does not exist on jQuery.pluginName');
        }
    };
}));
           

如果有什麼問題,歡迎騷擾 ( ̄▽ ̄)/,時間過去太久就可能忘記了φ(>ω<*) 

繼續閱讀