jquery,zepto插件编写相关

1.

$.fn.pluginName = function(opt){}
就是为jquery的prototype定义了函数, 这样, 任何一个jquery对象都可以使用这个成员函数,
这种写法直观明了, 你只要知道的就是$.fn = jQuery.prototype = $.prototype

 

2.

$.fn.extend, 在jquery中重新定义了extend的使用方法, 如果只有一个参数, 那么就是扩展本身,
 即$.fn.extend({}), 就是用{}对象扩展$.fn, 也就是jquery的prototype, 这样, 和上面那个就一样了
 两者没有什么区别, 怎么用看自己习惯和理解

 

3.

写插件的时候, 由于是扩展prototype, 所以this就是对象实例, 即this就是jquery对象,
$(this)还是jquery对象, 他们虽然不是同一对象, 但是内容是完全相同的

//匿名封装$ ,防止外部代码的冲突污染
(function($){
    var plugin,privateMethod;  // 声明插件名和插件的私有方法

    /**
     * 这里是插件的主体部分
     * 这里是一个自运行的单例模式。
     * 这里之所以用一个 Plugin 的单例模式 包含一个 Plugin的类,主要是为了封装性,更好的划分代码块
     * 同时 也 方便区分私有方法及公共方法
     * PS:但有时私有方法为了方便还是写在了Plugin类里,这时建议私有方法前加上"_"
     */
    plugin = (function(){
        
        //实例化插件部分 @param element 传入jq对象的选择器  $("#J_plugin").plugin() ,其中 $("#J_plugin") 即是 element
        //* @param options 插件的一些参数
        function plugin(element,options){
            
            //将dom jquery 对象赋给插件保存,方便使用
            this.$element = $(element);

            //将插件的默认参数及用户定义的参数合并到一个新的obj里
            this.settings = $.extend({}, $.fn.plugin.defaults,options);
            //如果将参数设置在dom的自定义属性里,也可以这样写
            this.settings = $.extend({}, $.fn.plugin.defaults, this.$element.data(), options);

            this.init();//初始化
        }

        //插件的公共方法 写法1
        plugin.prototype.dosomething = function(){
            //....
        }

        //插件的公共方法 写法2
        plugin.prototype = {
            init:function (){

            },
            dosomething2: function(){
                //... 
            }
        };

        return plugin;
    }) (); 

    //插件的私有方法
    privateMethod = function(){}

    //将plugin对象转换为jquery插件对象
    $.fn.plugin = function(options){
        return this.each(function(){
            var $me = $(this), instance = $me.data('plugin');
            
            if(!instance){
                //将实例化后的插件缓存在dom结构里(内存里)
                $me.data('plugin', new plugin(this, options));
            }

            //优雅处: 如果插件的参数是一个字符串,则 调用 插件的 字符串方法。
            // * 如 $('#id').plugin('doSomething') 则实际调用的是 $('#id).plugin.doSomething
            //  doSomething是刚才定义的接口(公共方法) * 这种方法 在 juqery ui 的插件里 很常见
            if ($.type(options) === 'string') instance[options]();

        });
    };

    //插件的默认参数
    $.fn.plugin.defaults = {
        xx: 'a',
        xxx: 123
    };

    //优雅处: 通过data-xxx 的方式 实例化插件  这样的话 在页面上就不需要显示调用了。
    // 可以查看bootstrap 里面的JS插件写法
    $(function(){
        return new plugin( $('[data-plugin]') );
    });
    
}) (jQuery);

 

:

zepto:

(function ($) {
    /**
     * 定义一个插件 Plugin
     */
    var Plugin,
        privateMethod;  //插件的私有方法,也可以看做是插件的工具方法集

    /**
     * 这里是插件的主体部分
     * 这里是一个自运行的单例模式。
     * 这里之所以用一个 Plugin 的单例模式 包含一个 Plugin的类,主要是为了封装性,更好的划分代码块
     * 同时 也 方便区分私有方法及公共方法
     * PS:但有时私有方法为了方便还是写在了Plugin类里,这时建议私有方法前加上"_"
     */
    Plugin = (function () {

        /**
         * 插件实例化部分,初始化时调用的代码可以放这里
         * @param element 传入jq对象的选择器,如 $("#J_plugin").plugin() ,其中 $("#J_plugin") 即是 element
         * @param options 插件的一些参数神马的
         * @constructor
         */
        function Plugin(element, options) {
            //将插件的默认参数及用户定义的参数合并到一个新的obj里
            this.settings = $.extend({}, $.fn.plugin.defaults, options);
            //将dom jquery对象赋值给插件,方便后续调用
            this.$element = $(element);
            //初始化调用一下
            this.init();
        }

        /**
         * 写法一
         * 插件的公共方法,相当于接口函数,用于给外部调用
         */
        Plugin.prototype.doSomething = function () {
            /**
             * 方法内容
             */
        };

        /**
         * 写法二
         * 将插件所有函数放在prototype的大对象里
         * @type {{}}
         */
        Plugin.prototype = {

            init:function(){

            },

            doSomething2:function(){

            }
        };

        return Plugin;

    })();

    /**
     * 插件的私有方法
     */
    privateMethod = function () {

    };

    /**
     * 这里是将Plugin对象 转为jq插件的形式进行调用
     * 定义一个插件 plugin
     * zepto的data方法与jq的data方法不同
     * 这里的实现方式可参考文章:http://trentrichardson.com/2013/08/20/creating-zepto-plugins-from-jquery-plugins/
     */
    $.fn.plugin = function(options){
        return this.each(function () {
            var $this = $(this),
                instance = $.fn.plugin.lookup[$this.data('plugin')];
            if (!instance) {
                //zepto的data方法只能保存字符串,所以用此方法解决一下
                $.fn.plugin.lookup[++$.fn.plugin.lookup.i] = new Plugin(this,options);
                $this.data('plugin', $.fn.plugin.lookup.i);
                instance = $.fn.plugin.lookup[$this.data('plugin')];
            }

            if (typeof options === 'string') instance[options]();
        })
    };

    $.fn.plugin.lookup = {i: 0};

    /**
     * 插件的默认值
     */
    $.fn.plugin.defaults = {
        property1: 'value',
        property2: 'value'
    };

    /**
     * 优雅处: 通过data-xxx 的方式 实例化插件。
     * 这样的话 在页面上就不需要显示调用了。
     * 可以查看bootstrap 里面的JS插件写法
     */
    $(function () {
        return new Plugin($('[data-plugin]'));
    });
})(Zepto);

 

参考:

http://www.tuicool.com/articles/AZ77j2

http://www.jb51.net/article/61694.htm
http://blog.jobbole.com/30550/
http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html

 

具体示例:

//调用
var slide = $('#wrapper').customSlide();
console.log('second');
var tmp = $('#wrapper').customSlide('ok');
tmp.customSlide('ok');

//插件
;(function($){

    var customSlide,privateMethods;

    customSlide = (function () {
        
        function customSlide(element,options) {
            this.settings = $.extend({}, $.fn.customSlide.defaults, options);
            this.$element = $(element);
            this.init();
        }

        customSlide.prototype = {
            init: function () {
                console.log('init');
            },
            ok:function () {
                console.log('ok');
            }
        };

        return customSlide;
    }) ();

    $.fn.customSlide = function (options) {
        return this.each(function () {         // return   从而可以链式调用
            var $this = $(this),
            instance = $.fn.customSlide.lookup[$this.data('customSlide')];   //在dom元素上实例化插件并缓存到dom对象上 
            if(!instance){
                console.log(instance);
                $.fn.customSlide.lookup[++$.fn.customSlide.lookup.i] = new customSlide(this,options);
                $this.data('customSlide',$.fn.customSlide.lookup.i);    // 在dom上写 attr data-custom-slide=1; 标识已初始化实例
                instance = $.fn.customSlide.lookup[$this.data('customSlide')];    
                console.log(instance);
            }
            if(typeof options ==='string'){
                instance[options]();  // 通过传递string的方式调用示例的无参方法
            }
        });
    };

    $.fn.customSlide.lookup = {i: 0};

    $.fn.customSlide.defaults = {

    };

    $(function () {
        return new customSlide($('[data-customSlide]'));  // bootstrap方式的在元素上写 data-xxx 的方式启动插件
    });

}) (Zepto);

 

参考:

  1. jQuery官网学习中心关于插件开发的文章: http://learn.jquery.com/plugins/
  2. jQuery官网插件中心:http://plugins.jquery.com/
  3. jQuery官网插件发布指南:http://plugins.jquery.com/docs/publish/
  4. JavaScript Hoist :http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
  5. Google Web Developer Tool : https://developers.google.com/closure/
posted @ 2016-03-14 09:27  wifix  阅读(1416)  评论(0编辑  收藏  举报