mirror of
https://github.com/arsenetar/pelican-red.git
synced 2024-11-15 08:59:02 +00:00
160 lines
4.4 KiB
JavaScript
160 lines
4.4 KiB
JavaScript
|
/*jslint unparam: true, browser: true, indent: 2 */
|
||
|
|
||
|
;(function ($, window, document, undefined) {
|
||
|
'use strict';
|
||
|
|
||
|
Foundation.libs.dropdown = {
|
||
|
name : 'dropdown',
|
||
|
|
||
|
version : '4.1.3',
|
||
|
|
||
|
settings : {
|
||
|
activeClass: 'open',
|
||
|
opened: function(){},
|
||
|
closed: function(){}
|
||
|
},
|
||
|
|
||
|
init : function (scope, method, options) {
|
||
|
this.scope = scope || this.scope;
|
||
|
Foundation.inherit(this, 'throttle scrollLeft');
|
||
|
|
||
|
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) {
|
||
|
e.preventDefault();
|
||
|
self.toggle($(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.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) {
|
||
|
// temporary workaround until 4.2
|
||
|
if (/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;
|
||
|
} 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;
|
||
|
}
|
||
|
};
|
||
|
}(Foundation.zj, this, this.document));
|