123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- ;(function ($, window, document, undefined) {
- 'use strict';
- Foundation.libs.dropdown = {
- name : 'dropdown',
- version : '5.1.1',
- settings : {
- active_class: 'open',
- is_hover: false,
- opened: function(){},
- closed: function(){}
- },
- init : function (scope, method, options) {
- Foundation.inherit(this, 'throttle');
- this.bindings(method, options);
- },
- events : function (scope) {
- var self = this,
- S = self.S;
- S(this.scope)
- .off('.dropdown')
- .on('click.fndtn.dropdown', '[' + this.attr_name() + ']', function (e) {
- var settings = S(this).data(self.attr_name(true) + '-init') || self.settings;
- e.preventDefault();
- if (!settings.is_hover || Modernizr.touch) self.toggle(S(this));
- })
- .on('mouseenter.fndtn.dropdown', '[' + this.attr_name() + '], [' + this.attr_name() + '-content]', function (e) {
- var $this = S(this);
- clearTimeout(self.timeout);
- if ($this.data(self.data_attr())) {
- var dropdown = S('#' + $this.data(self.data_attr())),
- target = $this;
- } else {
- var dropdown = $this;
- target = S("[" + self.attr_name() + "='" + dropdown.attr('id') + "']");
- }
- var settings = target.data(self.attr_name(true) + '-init') || self.settings;
-
- if(S(e.target).data(self.data_attr()) && settings.is_hover) {
- self.closeall.call(self);
- }
-
- if (settings.is_hover) self.open.apply(self, [dropdown, target]);
- })
- .on('mouseleave.fndtn.dropdown', '[' + this.attr_name() + '], [' + this.attr_name() + '-content]', function (e) {
- var $this = S(this);
- self.timeout = setTimeout(function () {
- if ($this.data(self.data_attr())) {
- var settings = $this.data(self.data_attr(true) + '-init') || self.settings;
- if (settings.is_hover) self.close.call(self, S('#' + $this.data(self.data_attr())));
- } else {
- var target = S('[' + self.attr_name() + '="' + S(this).attr('id') + '"]'),
- settings = target.data(self.attr_name(true) + '-init') || self.settings;
- if (settings.is_hover) self.close.call(self, $this);
- }
- }.bind(this), 150);
- })
- .on('click.fndtn.dropdown', function (e) {
- var parent = S(e.target).closest('[' + self.attr_name() + '-content]');
- if (S(e.target).data(self.data_attr()) || S(e.target).parent().data(self.data_attr())) {
- return;
- }
- if (!(S(e.target).data('revealId')) &&
- (parent.length > 0 && (S(e.target).is('[' + self.attr_name() + '-content]') ||
- $.contains(parent.first()[0], e.target)))) {
- e.stopPropagation();
- return;
- }
- self.close.call(self, S('[' + self.attr_name() + '-content]'));
- })
- .on('opened.fndtn.dropdown', '[' + self.attr_name() + '-content]', function () {
- self.settings.opened.call(this);
- })
- .on('closed.fndtn.dropdown', '[' + self.attr_name() + '-content]', function () {
- self.settings.closed.call(this);
- });
- S(window)
- .off('.dropdown')
- .on('resize.fndtn.dropdown', self.throttle(function () {
- self.resize.call(self);
- }, 50)).trigger('resize');
- },
- close: function (dropdown) {
- var self = this;
- dropdown.each(function () {
- if (self.S(this).hasClass(self.settings.active_class)) {
- self.S(this)
- .css(Foundation.rtl ? 'right':'left', '-99999px')
- .removeClass(self.settings.active_class);
- self.S(this).trigger('closed');
- }
- });
- },
- closeall: function() {
- var self = this;
- $.each(self.S('[' + this.attr_name() + '-content]'), function() {
- self.close.call(self, self.S(this))
- });
- },
- open: function (dropdown, target) {
- this
- .css(dropdown
- .addClass(this.settings.active_class), target);
- dropdown.trigger('opened');
- },
- data_attr: function () {
- if (this.namespace.length > 0) {
- return this.namespace + '-' + this.name;
- }
- return this.name;
- },
- toggle : function (target) {
- var dropdown = this.S('#' + target.data(this.data_attr()));
- if (dropdown.length === 0) {
- // No dropdown found, not continuing
- return;
- }
- this.close.call(this, this.S('[' + this.attr_name() + '-content]').not(dropdown));
- if (dropdown.hasClass(this.settings.active_class)) {
- this.close.call(this, dropdown);
- } else {
- this.close.call(this, this.S('[' + this.attr_name() + '-content]'))
- this.open.call(this, dropdown, target);
- }
- },
- resize : function () {
- var dropdown = this.S('[' + this.attr_name() + '-content].open'),
- target = this.S("[" + this.attr_name() + "='" + dropdown.attr('id') + "']");
- if (dropdown.length && target.length) {
- this.css(dropdown, target);
- }
- },
- css : function (dropdown, target) {
- var offset_parent = dropdown.offsetParent(),
- position = target.offset();
- position.top -= offset_parent.offset().top;
- position.left -= offset_parent.offset().left;
- if (this.small()) {
- dropdown.css({
- position : 'absolute',
- width: '95%',
- 'max-width': 'none',
- top: position.top + target.outerHeight()
- });
- dropdown.css(Foundation.rtl ? 'right':'left', '2.5%');
- } else {
- if (!Foundation.rtl && this.S(window).width() > dropdown.outerWidth() + target.offset().left) {
- var left = position.left;
- if (dropdown.hasClass('right')) {
- dropdown.removeClass('right');
- }
- } else {
- if (!dropdown.hasClass('right')) {
- dropdown.addClass('right');
- }
- var left = position.left - (dropdown.outerWidth() - target.outerWidth());
- }
- dropdown.attr('style', '').css({
- position : 'absolute',
- top: position.top + target.outerHeight(),
- left: left
- });
- }
- return dropdown;
- },
- small : function () {
- return matchMedia(Foundation.media_queries.small).matches &&
- !matchMedia(Foundation.media_queries.medium).matches;
- },
- off: function () {
- this.S(this.scope).off('.fndtn.dropdown');
- this.S('html, body').off('.fndtn.dropdown');
- this.S(window).off('.fndtn.dropdown');
- this.S('[data-dropdown-content]').off('.fndtn.dropdown');
- this.settings.init = false;
- },
- reflow : function () {}
- };
- }(jQuery, this, this.document));
|