123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- /*jslint unparam: true, browser: true, indent: 2 */
- ;(function ($, window, document, undefined) {
- 'use strict';
- Foundation.libs.dropdown = {
- name : 'dropdown',
- version : '4.2.0',
- settings : {
- activeClass: 'open',
- is_hover: false,
- opened: function(){},
- closed: function(){}
- },
- init : function (scope, method, options) {
- this.scope = scope || this.scope;
- Foundation.inherit(this, 'throttle scrollLeft data_options');
- if (typeof method === 'object') {
- $.extend(true, this.settings, method);
- }
- if (typeof method != 'string') {
- if (!this.settings.init) {
- this.events();
- }
- return this.settings.init;
- } else {
- return this[method].call(this, options);
- }
- },
- events : function () {
- var self = this;
- $(this.scope)
- .on('click.fndtn.dropdown', '[data-dropdown]', function (e) {
- var settings = $.extend({}, self.settings, self.data_options($(this)));
- e.preventDefault();
- if (!settings.is_hover) self.toggle($(this));
- })
- .on('mouseenter', '[data-dropdown]', function (e) {
- var settings = $.extend({}, self.settings, self.data_options($(this)));
- if (settings.is_hover) self.toggle($(this));
- })
- .on('mouseleave', '[data-dropdown-content]', function (e) {
- var target = $('[data-dropdown="' + $(this).attr('id') + '"]'),
- settings = $.extend({}, self.settings, self.data_options(target));
- if (settings.is_hover) self.close.call(self, $(this));
- })
- .on('opened.fndtn.dropdown', '[data-dropdown-content]', this.settings.opened)
- .on('closed.fndtn.dropdown', '[data-dropdown-content]', this.settings.closed);
- $('body').on('click.fndtn.dropdown', function (e) {
- var parent = $(e.target).closest('[data-dropdown-content]');
- if ($(e.target).data('dropdown')) {
- return;
- }
- if (parent.length > 0 && ($(e.target).is('[data-dropdown-content]') || $.contains(parent.first()[0], e.target))) {
- e.stopPropagation();
- return;
- }
- self.close.call(self, $('[data-dropdown-content]'));
- });
- $(window).on('resize.fndtn.dropdown', self.throttle(function () {
- self.resize.call(self);
- }, 50)).trigger('resize');
- this.settings.init = true;
- },
- close: function (dropdown) {
- var self = this;
- dropdown.each(function () {
- if ($(this).hasClass(self.settings.activeClass)) {
- $(this)
- .css(Foundation.rtl ? 'right':'left', '-99999px')
- .removeClass(self.settings.activeClass);
- $(this).trigger('closed');
- }
- });
- },
- open: function (dropdown, target) {
- this
- .css(dropdown
- .addClass(this.settings.activeClass), target);
- dropdown.trigger('opened');
- },
- toggle : function (target) {
- var dropdown = $('#' + target.data('dropdown'));
- this.close.call(this, $('[data-dropdown-content]').not(dropdown));
- if (dropdown.hasClass(this.settings.activeClass)) {
- this.close.call(this, dropdown);
- } else {
- this.close.call(this, $('[data-dropdown-content]'))
- this.open.call(this, dropdown, target);
- }
- },
- resize : function () {
- var dropdown = $('[data-dropdown-content].open'),
- target = $("[data-dropdown='" + dropdown.attr('id') + "']");
- if (dropdown.length && target.length) {
- this.css(dropdown, target);
- }
- },
- css : function (dropdown, target) {
- var offset_parent = dropdown.offsetParent();
- // temporary workaround until 4.2
- if (offset_parent.length > 0 && /body/i.test(dropdown.offsetParent()[0].nodeName)) {
- var position = target.offset();
- position.top -= dropdown.offsetParent().offset().top;
- position.left -= dropdown.offsetParent().offset().left;
- } else {
- var position = target.position();
- }
- if (this.small()) {
- dropdown.css({
- position : 'absolute',
- width: '95%',
- left: '2.5%',
- 'max-width': 'none',
- top: position.top + this.outerHeight(target)
- });
- } else {
- if (!Foundation.rtl && $(window).width() > this.outerWidth(dropdown) + 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 - (this.outerWidth(dropdown) - this.outerWidth(target));
- }
- dropdown.attr('style', '').css({
- position : 'absolute',
- top: position.top + this.outerHeight(target),
- left: left
- });
- }
- return dropdown;
- },
- small : function () {
- return $(window).width() < 768 || $('html').hasClass('lt-ie9');
- },
- off: function () {
- $(this.scope).off('.fndtn.dropdown');
- $('html, body').off('.fndtn.dropdown');
- $(window).off('.fndtn.dropdown');
- $('[data-dropdown-content]').off('.fndtn.dropdown');
- this.settings.init = false;
- },
- reflow : function () {}
- };
- }(Foundation.zj, this, this.document));
|