Refactored the repository and gruntified all the things
This commit is contained in:
157
websrc/js/foundation/foundation.tab.js
vendored
Normal file
157
websrc/js/foundation/foundation.tab.js
vendored
Normal file
@@ -0,0 +1,157 @@
|
||||
/*jslint unparam: true, browser: true, indent: 2 */
|
||||
;(function ($, window, document, undefined) {
|
||||
'use strict';
|
||||
|
||||
Foundation.libs.tab = {
|
||||
name : 'tab',
|
||||
|
||||
version : '5.2.1',
|
||||
|
||||
settings : {
|
||||
active_class: 'active',
|
||||
callback : function () {},
|
||||
deep_linking: false,
|
||||
scroll_to_content: true
|
||||
},
|
||||
|
||||
default_tab_hashes: [],
|
||||
|
||||
init : function (scope, method, options) {
|
||||
var self = this,
|
||||
S = this.S;
|
||||
|
||||
this.bindings(method, options);
|
||||
this.handle_location_hash_change();
|
||||
|
||||
// Store the default active tabs which will be referenced when the
|
||||
// location hash is absent, as in the case of navigating the tabs and
|
||||
// returning to the first viewing via the browser Back button.
|
||||
S('[' + this.attr_name() + '] > dd.active > a', this.scope).each(function () {
|
||||
self.default_tab_hashes.push(this.hash);
|
||||
});
|
||||
},
|
||||
|
||||
events : function () {
|
||||
var self = this,
|
||||
S = this.S;
|
||||
|
||||
// Click event: tab title
|
||||
S(this.scope).off('.tab').on('click.fndtn.tab', '[' + this.attr_name() + '] > dd > a', function (e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
self.toggle_active_tab(S(this).parent());
|
||||
});
|
||||
|
||||
// Location hash change event
|
||||
S(window).on('hashchange.fndtn.tab', function (e) {
|
||||
e.preventDefault();
|
||||
self.handle_location_hash_change();
|
||||
});
|
||||
},
|
||||
|
||||
handle_location_hash_change : function () {
|
||||
var self = this,
|
||||
S = this.S;
|
||||
|
||||
S('[' + this.attr_name() + ']', this.scope).each(function () {
|
||||
var settings = S(this).data(self.attr_name(true) + '-init');
|
||||
if (settings.deep_linking) {
|
||||
// Match the location hash to a label
|
||||
var hash = self.scope.location.hash;
|
||||
if (hash != '') {
|
||||
// Check whether the location hash references a tab content div or
|
||||
// another element on the page (inside or outside the tab content div)
|
||||
var hash_element = S(hash);
|
||||
if (hash_element.hasClass('content') && hash_element.parent().hasClass('tab-content')) {
|
||||
// Tab content div
|
||||
self.toggle_active_tab($('[' + self.attr_name() + '] > dd > a[href=' + hash + ']').parent());
|
||||
} else {
|
||||
// Not the tab content div. If inside the tab content, find the
|
||||
// containing tab and toggle it as active.
|
||||
var hash_tab_container_id = hash_element.closest('.content').attr('id');
|
||||
if (hash_tab_container_id != undefined) {
|
||||
self.toggle_active_tab($('[' + self.attr_name() + '] > dd > a[href=#' + hash_tab_container_id + ']').parent(), hash);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Reference the default tab hashes which were initialized in the init function
|
||||
for (var ind in self.default_tab_hashes) {
|
||||
self.toggle_active_tab($('[' + self.attr_name() + '] > dd > a[href=' + self.default_tab_hashes[ind] + ']').parent());
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
toggle_active_tab: function (tab, location_hash) {
|
||||
var S = this.S,
|
||||
tabs = tab.closest('[' + this.attr_name() + ']'),
|
||||
anchor = tab.children('a').first(),
|
||||
target_hash = '#' + anchor.attr('href').split('#')[1],
|
||||
target = S(target_hash),
|
||||
siblings = tab.siblings(),
|
||||
settings = tabs.data(this.attr_name(true) + '-init');
|
||||
|
||||
// allow usage of data-tab-content attribute instead of href
|
||||
if (S(this).data(this.data_attr('tab-content'))) {
|
||||
target_hash = '#' + S(this).data(this.data_attr('tab-content')).split('#')[1];
|
||||
target = S(target_hash);
|
||||
}
|
||||
|
||||
if (settings.deep_linking) {
|
||||
// Get the scroll Y position prior to moving to the hash ID
|
||||
var cur_ypos = $('body,html').scrollTop();
|
||||
|
||||
// Update the location hash to preserve browser history
|
||||
// Note that the hash does not need to correspond to the
|
||||
// tab content ID anchor; it can be an ID inside or outside of the tab
|
||||
// content div.
|
||||
if (location_hash != undefined) {
|
||||
window.location.hash = location_hash;
|
||||
} else {
|
||||
window.location.hash = target_hash;
|
||||
}
|
||||
|
||||
if (settings.scroll_to_content) {
|
||||
// If the user is requesting the content of a tab, then scroll to the
|
||||
// top of the title area; otherwise, scroll to the element within
|
||||
// the content area as defined by the hash value.
|
||||
if (location_hash == undefined || location_hash == target_hash) {
|
||||
tab.parent()[0].scrollIntoView();
|
||||
} else {
|
||||
S(target_hash)[0].scrollIntoView();
|
||||
}
|
||||
} else {
|
||||
// Adjust the scrollbar to the Y position prior to setting the hash
|
||||
// Only do this for the tab content anchor, otherwise there will be
|
||||
// conflicts with in-tab anchor links nested in the tab-content div
|
||||
if (location_hash == undefined || location_hash == target_hash) {
|
||||
$('body,html').scrollTop(cur_ypos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// WARNING: The activation and deactivation of the tab content must
|
||||
// occur after the deep linking in order to properly refresh the browser
|
||||
// window (notably in Chrome).
|
||||
tab.addClass(settings.active_class).triggerHandler('opened');
|
||||
siblings.removeClass(settings.active_class);
|
||||
target.siblings().removeClass(settings.active_class).end().addClass(settings.active_class);
|
||||
settings.callback(tab);
|
||||
target.triggerHandler('toggled', [tab]);
|
||||
tabs.triggerHandler('toggled', [target]);
|
||||
},
|
||||
|
||||
data_attr: function (str) {
|
||||
if (this.namespace.length > 0) {
|
||||
return this.namespace + '-' + str;
|
||||
}
|
||||
|
||||
return str;
|
||||
},
|
||||
|
||||
off : function () {},
|
||||
|
||||
reflow : function () {}
|
||||
};
|
||||
}(jQuery, this, this.document));
|
||||
Reference in New Issue
Block a user