mirror of
https://github.com/hanzoai/jube-fork.git
synced 2026-11-02 14:29:36 +00:00
107 lines
2.9 KiB
JavaScript
Executable File
107 lines
2.9 KiB
JavaScript
Executable File
// # 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);
|