// # Dropdown jquery plugin // # Depends on "_dropdown.sass" and array shim // # open "dropdown-view" on btn (link, span) click // # close on body click and escape // # option for visible 'dropdown-view' // # option for center the view - this could be done with css too ;(function($, window, document, undefined) { 'use strict'; var pluginName = 'dropdown'; var dropdownsList = []; function Plugin(element, options) { this._name = pluginName; this.element = element; this.$element = $(element); this.options = $.extend({}, $.fn[pluginName].defaults, options); this.$trigger = this.$element.find('.' + this.options.btnClass); this.$content = this.$element.find('.' + this.options.contentClass); this.init(); } Plugin.prototype = { init: function() { this.addEvents(); if (this.options.hidden === false) { this.open(); } }, open: function() { var self = this; $.fn[pluginName].closeAll(); this.isOpen = true; this.$element.addClass('is-open'); this.$trigger.addClass('is-active'); $(document).on('click.dropdown', $.proxy(this.toggle, this)); // close on esc $(document).on('keydown.dropdown', function(e) { if (e.keyCode === 27) { self.close(); } }); }, close: function() { this.isOpen = false; this.$element.removeClass('is-open'); this.$trigger.removeClass('is-active'); $(document).off('click.dropdown'); $(document).off('keydown.dropdown'); }, toggle: function(e) { if (!this.isOpen) { this.open(); } else { this.close(); } e.stopPropagation(); e.preventDefault(); }, center: function() { if (!this.options.centerContent) { return; } var btnWidth = this.$trigger.outerWidth(); var contentWidth = this.$content.outerWidth(); this.$content.css('left', -(Math.abs(btnWidth - contentWidth) / 2)); }, addEvents: function() { this.center(); this.$trigger.on('click.dropdown', $.proxy(this.toggle, this)); this.$content.on('click', function(e) { e.stopPropagation(); }); } }; $.fn[pluginName] = function(options) { return this.each(function() { if (!$.data(this, 'plugin_' + pluginName)) { dropdownsList.push($.data(this, 'plugin_' + pluginName, new Plugin(this, options))); } }); }; $.fn[pluginName].defaults = { wrapClass: 'Dropdown', btnClass: 'Dropdown-control', contentClass: 'Dropdown-view', centerContent: false, hidden: true }; // global function to close all dropdowns $.fn[pluginName].closeAll = function() { // dropdownsList.forEach(function(dropdown) { // dropdown.close(); // }); $.each(dropdownsList, function(index, dropdown) { dropdown.close(); }); }; })(jQuery, window, document);