How to Extend Twitter Bootstrap Plugin

后端 未结 5 1896
面向向阳花
面向向阳花 2020-11-27 02:43

I am digging into Twitter\'s Bootstrap and now want to try and add some functionality to the plugins, but I can\'t figure out how to do so. Using the modal plugin as an exa

相关标签:
5条回答
  • 2020-11-27 03:20

    For the record there is a simple method to override or extend existing functions:

    var _show = $.fn.modal.Constructor.prototype.show;
    
    $.fn.modal.Constructor.prototype.show = function() {
        _show.apply(this, arguments);
        //Do custom stuff here
    };
    

    Doesn't cover custom arguments, but it's easy as well with the method above; instead of using apply and arguments, specify the original arguments plus the custom ones in the function definition, then call the original _show (or whichever it is) with the original arguments, and finally do other stuff with the new arguments.

    0 讨论(0)
  • 2020-11-27 03:28

    This is an old thread, but I just made some custom extensions to modal using the following pattern:

    // save the original function object
    var _super = $.fn.modal;
    
    // add custom defaults
    $.extend( _super.defaults, {
        foo: 'bar',
        john: 'doe'
    });
    
    // create a new constructor
    var Modal = function(element, options) {
    
        // do custom constructor stuff here
    
         // call the original constructor
        _super.Constructor.apply( this, arguments );
    
    }
    
    // extend prototypes and add a super function
    Modal.prototype = $.extend({}, _super.Constructor.prototype, {
        constructor: Modal,
        _super: function() {
            var args = $.makeArray(arguments);
            _super.Constructor.prototype[args.shift()].apply(this, args);
        },
        show: function() {
    
            // do custom method stuff
    
            // call the original method
            this._super('show');
        }
    });
    
    // override the old initialization with the new constructor
    $.fn.modal = $.extend(function(option) {
    
        var args = $.makeArray(arguments),
            option = args.shift();
    
        return this.each(function() {
    
            var $this = $(this);
            var data = $this.data('modal'),
                options = $.extend({}, _super.defaults, $this.data(), typeof option == 'object' && option);
    
            if ( !data ) {
                $this.data('modal', (data = new Modal(this, options)));
            }
            if (typeof option == 'string') {
                data[option].apply( data, args );
            }
            else if ( options.show ) {
                data.show.apply( data, args );
            }
        });
    
    }, $.fn.modal);
    

    This way you can

    1) add your own default options

    2) create new methods with custom arguments and access to original (super) functions

    3) do stuff in the constructor before and/or after the original constructor is called

    0 讨论(0)
  • 2020-11-27 03:28

    For reference, I had a similar problem so I "extended" the Typeahead plugin by forking and adding the functionality I needed in the plugin script itself.

    If you have to change the source it's not really an extension anyways so I figured it was easier just to put all my modifications in one place.

    0 讨论(0)
  • 2020-11-27 03:33

    +1 for the accepted answer above from David. But if I could simplify it a bit more, I'd adjust the DEFAULTS extending and $fn.modal extending like so:

    !function($) {
    
        'use strict';
    
        // save the original function object
        var _super = $.fn.modal;
    
        // create a new constructor
        var Modal = function(element, options) {
    
            // do custom constructor stuff here
    
            // call the original constructor
            _super.Constructor.apply( this, arguments );
    
        }
    
        // add custom defaults
        Modal.DEFAULTS = $.extend( _super.defaults, {
             myCustomOption: true
        });
    
        // extend prototypes and add a super function
        Modal.prototype = $.extend({}, _super.Constructor.prototype, {
            constructor: Modal,
            _super: function() {
                var args = $.makeArray(arguments);
                _super.Constructor.prototype[args.shift()].apply(this, args);
            },
            show: function() {
    
                // do custom method stuff
    
                // call the original method
                this._super('show');
            },
            myCustomMethod: function() {
                alert('new feature!');
            }
        });
    
        // Copied exactly from Bootstrap 3 (as of Modal.VERSION  = '3.3.5')
        // Notice: You can copy & paste it exactly, no differences!
        function Plugin(option, _relatedTarget) {
            return this.each(function () {
                var $this   = $(this)
                var data    = $this.data('bs.modal')
                var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
    
                if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
                if (typeof option == 'string') data[option](_relatedTarget)
                else if (options.show) data.show(_relatedTarget)
            })
        }
    
        // override the old initialization with the new constructor
        $.fn.modal = $.extend(Plugin, $.fn.modal);
    
    }(jQuery);
    
    0 讨论(0)
  • 2020-11-27 03:38

    For anyone looking to do this with Bootstrap 3. The plugin layout has changed a bit the default options for all Bootstrap 3 plugins are attached to the plugins constructor:

    var _super = $.fn.modal;
    $.extend(_super.Constructor.DEFAULTS, {
           foo: 'bar',
           john: 'doe'
    });
    
    0 讨论(0)
提交回复
热议问题