From e8b14787a6c83aeb5445619b995ff7f5e7b0846e Mon Sep 17 00:00:00 2001 From: EdwinHui Date: Sun, 23 Sep 2018 22:11:07 +0800 Subject: [PATCH] Add force refresh setting --- README.md | 2 + README_cn.md | 2 + css/style.min.css | 1 - js/multitabs.js | 619 ++++++++++++++++++++++++-------------------- js/multitabs.min.js | 1 - 5 files changed, 348 insertions(+), 277 deletions(-) delete mode 100644 css/style.min.css delete mode 100644 js/multitabs.min.js diff --git a/README.md b/README.md index 4d6fb13..231a32c 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ Demo: [nav-tabs](http://edwinhuish.oschina.io/multi-tabs/demo/index-simple.html) 2. ```[data-iframe="true"]``` iframe mode, default is false. While false, is the auto mode (for the self page, use ajax, and the external, use iframe) 3. ```[data-title="new tab"]``` tab's tittle, if empty or undefined, tab's tittle will be link's text. 4. ```[data-url="index.html"]``` this parameter for the object not link. +5. ```[data-refresh="true"]``` for force refresh ### Initial Configuration ### The following is the default configuration, you can modify as you want. @@ -68,6 +69,7 @@ The following is the default configuration, you can modify as you want. link : '.multitabs', //selector text to trigger multitabs. iframe : false, //Global iframe mode, default is false, is the auto mode (for the self page, use ajax, and the external, use iframe) class : '', //class for whole multitabs + refresh: false, //set to true for global force refresh tab init : [ //tabs in initial { type :'', //content type, may be main | info, if empty, default is 'info' diff --git a/README_cn.md b/README_cn.md index 2bcc9c6..e4b0e0c 100644 --- a/README_cn.md +++ b/README_cn.md @@ -58,6 +58,7 @@ Demo: [nav-tabs](http://edwinhuish.oschina.io/multi-tabs/demo/index-simple.html) 2. ```[data-iframe="true"]``` 指定为iframe模式,当值为false的时候,为智能模式,自动判断(内网用ajax,外网用iframe)。缺省为false。 3. ```[data-title="new tab"]``` 设置后指定标签页的标题,默认读取链接字体。 4. ```[data-url="index.html"]``` 如果对象不是``````链接,此值可以指定链接URL +5. ```[data-refresh="true"]``` 强制更新 ### 初始化配置 ### 下面这些为默认配置,可以自行修改 @@ -67,6 +68,7 @@ Demo: [nav-tabs](http://edwinhuish.oschina.io/multi-tabs/demo/index-simple.html) link : '.multitabs', //触发multitabs的selector text,注意需要有".","#"等 iframe : false, //iframe模式的总局设置。当值为false的时候,为智能模式,自动判断(内网用ajax,外网用iframe)。缺省为false。 class : '', //主框架的class + refresh: false, //全局强制更新 init : [ //需要在初始加载的tab { type :'', //标签页的类型,有 main | info,缺省为 info diff --git a/css/style.min.css b/css/style.min.css deleted file mode 100644 index 6d8c07a..0000000 --- a/css/style.min.css +++ /dev/null @@ -1 +0,0 @@ -.mt-wrapper{position:relative;z-index:1}.mt-nav-bar{width:100%;z-index:200;position:absolute}.mt-nav-bar .mt-nav{display:inline-block;vertical-align:top;margin-left:-1px;margin-right:-4px}.mt-nav-panel{overflow:hidden}.mt-nav-panel ul{width:10000px}.mt-tab-content{height:100%}.mt-close-tab{position:absolute;font-size:10px;top:2px;right:5px;color:#94a6b0;cursor:pointer;display:none}li:hover .mt-close-tab{display:inline}.mt-hidden-list .mt-close-tab{display:none!important}a{cursor:pointer}@media(max-width:767px){.mt-nav-bar{display:none}.mt-tab-content{padding-top:0!important}}.mt-tab-content{-webkit-overflow-scrolling:touch;overflow:auto} \ No newline at end of file diff --git a/js/multitabs.js b/js/multitabs.js index 33c201a..36df3dc 100644 --- a/js/multitabs.js +++ b/js/multitabs.js @@ -1,13 +1,13 @@ //Make sure jQuery has been loaded if (typeof jQuery === "undefined") { throw new Error("MultiTabs requires jQuery"); -}((function($){ +}((function ($) { "use strict"; var NAMESPACE, tabIndex; //variable - var MultiTabs, handler, getTabIndex, isExtUrl, sumWidth, trimText, supportStorage; //function - var defaultLayoutTemplates, defaultInit; //default variable + var MultiTabs, handler, getTabIndex, isExtUrl, sumWidth, trimText, supportStorage; //function + var defaultLayoutTemplates, defaultInit; //default variable - NAMESPACE = '.multitabs'; // namespace for on() function + NAMESPACE = '.multitabs'; // namespace for on() function /** * splice namespace for on() function, and bind it @@ -28,8 +28,8 @@ if (typeof jQuery === "undefined") { * @param capacity capacity of tab, except 'main' tab * @returns int return index */ - getTabIndex = function(content, capacity){ - if(content === 'main') return 0; + getTabIndex = function (content, capacity) { + if (content === 'main') return 0; capacity = capacity || 8; //capacity of maximum tab quantity, the tab will be cover if more than it tabIndex = tabIndex || 0; tabIndex++; @@ -43,16 +43,16 @@ if (typeof jQuery === "undefined") { * @param maxLength max length for text * @returns {string} return trimed text */ - trimText = function (text, maxLength){ + trimText = function (text, maxLength) { maxLength = maxLength || $.fn.multitabs.defaults.navTab.maxTitleLength; var words = (text + "").split(' '); var t = ''; - for(var i=0; i maxLength) { + if (t.length > maxLength) { t = t.substr(0, maxLength); t += '...' } @@ -81,15 +81,15 @@ if (typeof jQuery === "undefined") { * @param url URL for judgment * @returns {boolean} external URL return true, local return false */ - isExtUrl = function (url){ - var absUrl = (function(url){ + isExtUrl = function (url) { + var absUrl = (function (url) { var a = document.createElement('a'); - a.href=url; + a.href = url; return a.href; })(url); var webRoot = window.location.protocol + '//' + window.location.host + '/'; var urlRoot = absUrl.substr(0, webRoot.length); - return ( ! (urlRoot===webRoot) ); + return (!(urlRoot === webRoot)); }; /** @@ -99,71 +99,71 @@ if (typeof jQuery === "undefined") { /** * Main Layout */ - default : '
' + - '
' + - '
' + - '' + - '
' + - '' + - '
' + - '' + - '
' + - '
' + - '
' + - '
', - classic : '
' + - '
' + - '' + - '
' + - '' + - '
' + - '
' + - '
' + - '
', - simple : '
' + - '
' + - '' + - '
' + - '
' + - '
', - navTab : '{title}', - closeBtn : ' ', - ajaxTabPane : '
{content}
', - iframeTabPane : '' + default: '
' + + '
' + + '
' + + '' + + '
' + + '' + + '
' + + '' + + '
' + + '
' + + '
' + + '
', + classic: '
' + + '
' + + '' + + '
' + + '' + + '
' + + '
' + + '
' + + '
', + simple: '
' + + '
' + + '' + + '
' + + '
' + + '
', + navTab: '{title}', + closeBtn: ' ', + ajaxTabPane: '
{content}
', + iframeTabPane: '' }; /** * Default init page * @type {*[]} */ - defaultInit = [{ //default tabs in initial; - type : 'main', //default is info; - title : 'main', //default title; - content: '

Demo page

Welcome to use bootstrap multi-tabs :)

' //default content + defaultInit = [{ //default tabs in initial; + type: 'main', //default is info; + title: 'main', //default title; + content: '

Demo page

Welcome to use bootstrap multi-tabs :)

' //default content }]; /** @@ -193,13 +193,14 @@ if (typeof jQuery === "undefined") { * @param active if true, active tab after create * @returns this Chain structure. */ - create : function (obj, active) { + create: function (obj, active) { var options = this.options; var param, $navTab; - if(! ( param = this._getParam(obj) )) { - return this; //return multitabs obj when is invaid obj + if (!(param = this._getParam(obj))) { + return this; //return multitabs obj when is invaid obj } - if( $navTab = this._exist(param)){ + $navTab = this._exist(param) + if ($navTab && !param.refresh) { this.active($navTab); return this; } @@ -209,8 +210,8 @@ if (typeof jQuery === "undefined") { //tab-pane create this._createTabPane(param); //add tab to storage - this._storage( param.did, param); - if(param.active) { + this._storage(param.did, param); + if (param.active) { this.active($navTab); } return this; @@ -223,8 +224,9 @@ if (typeof jQuery === "undefined") { * @returns {*|{}} * @private */ - _createTabPane : function (param) { - var self = this, $el = self.$element; + _createTabPane: function (param) { + var self = this, + $el = self.$element; $el.tabContent.append(self._getTabPaneHtml(param)); return $el.tabContent.find('#' + param.did); }, @@ -236,13 +238,14 @@ if (typeof jQuery === "undefined") { * @returns {string} * @private */ - _getTabPaneHtml : function (param) { - var self = this, options = self.options; - if(!param.content && param.iframe){ + _getTabPaneHtml: function (param) { + var self = this, + options = self.options; + if (!param.content && param.iframe) { return defaultLayoutTemplates.iframeTabPane .replace('{class}', options.content.iframe.class) .replace('{tabPaneId}', param.did); - }else{ + } else { return defaultLayoutTemplates.ajaxTabPane .replace('{class}', options.content.ajax.class) .replace('{tabPaneId}', param.did) @@ -257,17 +260,18 @@ if (typeof jQuery === "undefined") { * @returns {*|{}} * @private */ - _createNavTab : function (param) { - var self = this, $el = self.$element; + _createNavTab: function (param) { + var self = this, + $el = self.$element; var navTabHtml = self._getNavTabHtml(param); - var $navTabLi = $el.navPanelList.find('a[data-type="'+ param.type +'"][data-index="'+ param.index +'"]').parent('li'); - if($navTabLi.length){ + var $navTabLi = $el.navPanelList.find('a[data-type="' + param.type + '"][data-index="' + param.index + '"]').parent('li'); + if ($navTabLi.length) { $navTabLi.html(navTabHtml); - self._getTabPane($navTabLi.find('a:first')).remove(); //remove old content pane directly - }else { - $el.navPanelList.append( '
  • ' + navTabHtml + '
  • '); + self._getTabPane($navTabLi.find('a:first')).remove(); //remove old content pane directly + } else { + $el.navPanelList.append('
  • ' + navTabHtml + '
  • '); } - return $el.navPanelList.find('a[data-type="'+ param.type +'"][data-index="'+ param.index +'"]:first'); + return $el.navPanelList.find('a[data-type="' + param.type + '"][data-index="' + param.index + '"]:first'); }, @@ -278,7 +282,7 @@ if (typeof jQuery === "undefined") { * @returns {string} * @private */ - _getNavTabHtml : function (param) { + _getNavTabHtml: function (param) { var self = this, options = self.options; var closeBtnHtml, display; @@ -286,12 +290,12 @@ if (typeof jQuery === "undefined") { display = options.nav.showCloseOnHover ? '' : 'display:inline;'; closeBtnHtml = (param.type === 'main') ? '' : defaultLayoutTemplates.closeBtn.replace('{style}', display); //main content can not colse. return defaultLayoutTemplates.navTab - .replace('{index}', param.index) - .replace('{navTabId}', param.did) - .replace('{url}', param.url) - .replace('{title}', param.title) - .replace('{type}', param.type) - + closeBtnHtml; + .replace('{index}', param.index) + .replace('{navTabId}', param.did) + .replace('{url}', param.url) + .replace('{title}', param.title) + .replace('{type}', param.type) + + closeBtnHtml; }, /** @@ -301,7 +305,7 @@ if (typeof jQuery === "undefined") { * @returns {string} * @private */ - _generateId : function(param){ + _generateId: function (param) { return 'multitabs_' + param.type + '_' + param.index; }, @@ -310,18 +314,21 @@ if (typeof jQuery === "undefined") { * @param navTab * @returns self Chain structure. */ - active : function (navTab) { - var self = this, $el = self.$element, options = self.options; - var $navTab = self._getNavTab(navTab), $tabPane = self._getTabPane($navTab), + active: function (navTab) { + var self = this, + $el = self.$element, + options = self.options; + var $navTab = self._getNavTab(navTab), + $tabPane = self._getTabPane($navTab), $prevActivedTab = $el.navPanelList.find('li.active:first a'); var prevNavTabParam = $prevActivedTab.length ? self._getParam($prevActivedTab) : {}; var navTabParam = $navTab.length ? self._getParam($navTab) : {}; //change storage active status var storage = self._storage(); - if( storage[prevNavTabParam.id] ) { + if (storage[prevNavTabParam.id]) { storage[prevNavTabParam.id].active = false; } - if( storage[navTabParam.id] ) { + if (storage[navTabParam.id]) { storage[navTabParam.id].active = true; } self._resetStorage(storage); @@ -340,25 +347,26 @@ if (typeof jQuery === "undefined") { * fill tab pane * @private */ - _fillTabPane : function (tabPane, param) { - var self = this, options = self.options; + _fillTabPane: function (tabPane, param) { + var self = this, + options = self.options; var $tabPane = $(tabPane); //if navTab-pane empty, load content - if(!$tabPane.html()){ - if(!$tabPane.is('iframe')){ + if (!$tabPane.html()) { + if (!$tabPane.is('iframe')) { $.ajax({ url: param.url, dataType: "html", - success: function(callback) { + success: function (callback) { $tabPane.html(options.content.ajax.success(callback)); }, - error : function (callback) { + error: function (callback) { $tabPane.html(options.content.ajax.error(callback)); } }); } else { - if(!$tabPane.attr('src')){ + if (!$tabPane.attr('src')) { $tabPane.attr('src', param.url); } } @@ -369,12 +377,15 @@ if (typeof jQuery === "undefined") { * move left * @return self */ - moveLeft : function () { - var self = this, $el = self.$element, + moveLeft: function () { + var self = this, + $el = self.$element, navPanelListMarginLeft = Math.abs(parseInt($el.navPanelList.css("margin-left"))), navPanelWidth = $el.navPanel.outerWidth(true), sumTabsWidth = sumWidth($el.navPanelList.children('li')), - leftWidth = 0, marginLeft = 0, $navTabLi; + leftWidth = 0, + marginLeft = 0, + $navTabLi; if (sumTabsWidth < navPanelWidth) { return self } else { @@ -385,14 +396,16 @@ if (typeof jQuery === "undefined") { } marginLeft = 0; if (sumWidth($navTabLi.prevAll()) > navPanelWidth) { - while (( (marginLeft + $navTabLi.width()) < navPanelWidth) && $navTabLi.length > 0) { + while (((marginLeft + $navTabLi.width()) < navPanelWidth) && $navTabLi.length > 0) { marginLeft += $navTabLi.outerWidth(true); $navTabLi = $navTabLi.prev(); } leftWidth = sumWidth($navTabLi.prevAll()); } } - $el.navPanelList.animate({marginLeft : 0 - leftWidth + "px"}, "fast"); + $el.navPanelList.animate({ + marginLeft: 0 - leftWidth + "px" + }, "fast"); return self; }, @@ -400,12 +413,14 @@ if (typeof jQuery === "undefined") { * move right * @return self */ - moveRight : function () { - var self = this, $el = self.$element, + moveRight: function () { + var self = this, + $el = self.$element, navPanelListMarginLeft = Math.abs(parseInt($el.navPanelList.css("margin-left"))), navPanelWidth = $el.navPanel.outerWidth(true), sumTabsWidth = sumWidth($el.navPanelList.children('li')), - leftWidth = 0, $navTabLi, marginLeft; + leftWidth = 0, + $navTabLi, marginLeft; if (sumTabsWidth < navPanelWidth) { return self; } else { @@ -416,13 +431,15 @@ if (typeof jQuery === "undefined") { $navTabLi = $navTabLi.next(); } marginLeft = 0; - while (( (marginLeft + $navTabLi.width()) < navPanelWidth) && $navTabLi.length > 0) { + while (((marginLeft + $navTabLi.width()) < navPanelWidth) && $navTabLi.length > 0) { marginLeft += $navTabLi.outerWidth(true); $navTabLi = $navTabLi.next(); } leftWidth = sumWidth($navTabLi.prevAll()); if (leftWidth > 0) { - $el.navPanelList.animate({marginLeft : 0 - leftWidth + "px"}, "fast"); + $el.navPanelList.animate({ + marginLeft: 0 - leftWidth + "px" + }, "fast"); } } return self; @@ -434,25 +451,28 @@ if (typeof jQuery === "undefined") { * @return self Chain structure. */ close: function (navTab) { - var self = this, $tabPane; - var $navTab = self._getNavTab(navTab), $navTabLi = $navTab.parent('li'); + var self = this, + $tabPane; + var $navTab = self._getNavTab(navTab), + $navTabLi = $navTab.parent('li'); $tabPane = self._getTabPane($navTab); //close unsave tab confirm - if($navTabLi.length - && $tabPane.length - && $tabPane.hasClass('unsave') - && !self._unsaveConfirm()){ + if ($navTabLi.length && + $tabPane.length && + $tabPane.hasClass('unsave') && + !self._unsaveConfirm()) { return self; } if ($navTabLi.hasClass("active")) { - var $nextLi = $navTabLi.next("li:first"), $prevLi = $navTabLi.prev("li:last"); + var $nextLi = $navTabLi.next("li:first"), + $prevLi = $navTabLi.prev("li:last"); if ($nextLi.size()) { self.active($nextLi); - }else if ($prevLi.size()) { + } else if ($prevLi.size()) { self.active($prevLi); } } - self._delStorage( $navTab.attr('data-id') ); //remove tab from session storage + self._delStorage($navTab.attr('data-id')); //remove tab from session storage $navTabLi.remove(); $tabPane.remove(); return self; @@ -462,13 +482,14 @@ if (typeof jQuery === "undefined") { * close others tab * @return self Chain structure. */ - closeOthers : function () { - var self = this, $el = self.$element; + closeOthers: function () { + var self = this, + $el = self.$element; $el.navPanelList.find('li:not(.active)').find('a:not([data-type="main"])').each(function () { var $navTab = $(this); - self._delStorage( $navTab.attr('data-id') ); //remove tab from session storage + self._delStorage($navTab.attr('data-id')); //remove tab from session storage self._getTabPane($navTab).remove(); //remove tab-content - $navTab.parent('li').remove(); //remove navtab + $navTab.parent('li').remove(); //remove navtab }); $el.navPanelList.css("margin-left", "0"); return self; @@ -478,8 +499,9 @@ if (typeof jQuery === "undefined") { * focus actived tab * @return self Chain structure. */ - showActive : function () { - var self = this, $el = self.$element; + showActive: function () { + var self = this, + $el = self.$element; var navTab = $el.navPanelList.find('li.active:first a'); self._fixTabPosition(navTab); return self; @@ -489,13 +511,14 @@ if (typeof jQuery === "undefined") { * close all tabs, (except main tab) * @return self Chain structure. */ - closeAll : function(){ - var self = this, $el = self.$element; - $el.navPanelList.find('a:not([data-type="main"])').each(function(){ + closeAll: function () { + var self = this, + $el = self.$element; + $el.navPanelList.find('a:not([data-type="main"])').each(function () { var $navTab = $(this); - self._delStorage( $navTab.attr('data-id') ); //remove tab from session storage + self._delStorage($navTab.attr('data-id')); //remove tab from session storage self._getTabPane($navTab).remove(); //remove tab-content - $navTab.parent('li').remove(); //remove navtab + $navTab.parent('li').remove(); //remove navtab }); self.active($el.navPanelList.find('a[data-type="main"]:first').parent('li')); return self; @@ -508,27 +531,28 @@ if (typeof jQuery === "undefined") { * @private */ _init: function (options) { - var self = this, $el = self.$element; + var self = this, + $el = self.$element; $el.html(defaultLayoutTemplates[options.nav.layout] .replace('{mainClass}', options.class) - .replace('{navClass}' , options.nav.class) - .replace(/\{nav-tabs\}/g , options.nav.style) + .replace('{navClass}', options.nav.class) + .replace(/\{nav-tabs\}/g, options.nav.style) .replace(/\{backgroundColor\}/g, options.nav.backgroundColor) - .replace('{dropdown}' , options.language.nav.dropdown) - .replace('{showActivedTab}' , options.language.nav.showActivedTab) - .replace('{closeAllTabs}' , options.language.nav.closeAllTabs) - .replace('{closeOtherTabs}' , options.language.nav.closeOtherTabs) + .replace('{dropdown}', options.language.nav.dropdown) + .replace('{showActivedTab}', options.language.nav.showActivedTab) + .replace('{closeAllTabs}', options.language.nav.closeAllTabs) + .replace('{closeOtherTabs}', options.language.nav.closeOtherTabs) ); - $el.wrapper = $el.find('.mt-wrapper:first'); - $el.nav = $el.find('.mt-nav-bar:first'); - $el.navToolsLeft = $el.nav.find('.mt-nav-tools-left:first'); - $el.navPanel = $el.nav.find('.mt-nav-panel:first'); - $el.navPanelList = $el.nav.find('.mt-nav-panel:first ul'); + $el.wrapper = $el.find('.mt-wrapper:first'); + $el.nav = $el.find('.mt-nav-bar:first'); + $el.navToolsLeft = $el.nav.find('.mt-nav-tools-left:first'); + $el.navPanel = $el.nav.find('.mt-nav-panel:first'); + $el.navPanelList = $el.nav.find('.mt-nav-panel:first ul'); //$el.navTabMain = $('#multitabs_main_0'); $el.navToolsRight = $el.nav.find('.mt-nav-tools-right:first'); - $el.tabContent = $el.find('.tab-content:first'); + $el.tabContent = $el.find('.tab-content:first'); //hide tab-header if maxTabs less than 1 - if(options.nav.maxTabs <= 1){ + if (options.nav.maxTabs <= 1) { options.nav.maxTabs = 1; $el.nav.hide(); } @@ -544,26 +568,30 @@ if (typeof jQuery === "undefined") { * @returns self * @private */ - _final : function(){ - var self = this, $el = self.$element, options = self.options, storage, init = options.init, param; - if( supportStorage){ + _final: function () { + var self = this, + $el = self.$element, + options = self.options, + storage, init = options.init, + param; + if (supportStorage) { storage = self._storage(); self._resetStorage({}); - $.each(storage, function (k,v) { + $.each(storage, function (k, v) { self.create(v, false); }) } - if( $.isEmptyObject(storage)){ + if ($.isEmptyObject(storage)) { init = (!$.isEmptyObject(init) && init instanceof Array) ? init : defaultInit; - for(var i = 0; i < init.length; i++){ - param = self._getParam( init[i]); - if( param ) { + for (var i = 0; i < init.length; i++) { + param = self._getParam(init[i]); + if (param) { self.create(param); } } } //if no any tab actived, active the main tab - if(!$el.navPanelList.children('li.active').length) { + if (!$el.navPanelList.children('li.active').length) { self.active($el.navPanelList.find('[data-type="main"]:first')); } return self; @@ -575,37 +603,50 @@ if (typeof jQuery === "undefined") { * @private */ _listen: function () { - var self = this, $el = self.$element, options = self.options; + var self = this, + $el = self.$element, + options = self.options; //create tab - handler($(document), 'click', options.link, function(){ + handler($(document), 'click', options.link, function () { self.create(this, true); return false; //Prevent the default link action }); //active tab - handler($el.nav, 'click', '.mt-nav-tab', function(){ + handler($el.nav, 'click', '.mt-nav-tab', function () { self.active(this); }); //drag tab - if(options.nav.draggable){ + if (options.nav.draggable) { handler($el.navPanelList, 'mousedown', '.mt-nav-tab', function (event) { - var $navTab = $(this), $navTabLi = $navTab.closest('li'); + var $navTab = $(this), + $navTabLi = $navTab.closest('li'); var $prevNavTabLi = $navTabLi.prev(); - var dragMode = true, moved = false, isMain = ($navTab.data('type') === "main"); - var navTabBlankHtml = '
  • '; + var dragMode = true, + moved = false, + isMain = ($navTab.data('type') === "main"); + var navTabBlankHtml = '
  • '; var abs_x = event.pageX - $navTabLi.offset().left + $el.nav.offset().left; $navTabLi.before(navTabBlankHtml); - $navTabLi.css({'left': event.pageX - abs_x + 'px', 'position': 'absolute', 'z-index': 9999}) + $navTabLi.css({ + 'left': event.pageX - abs_x + 'px', + 'position': 'absolute', + 'z-index': 9999 + }) .addClass('mt-drag-tmp') - .find('a:first').css({'background' : '#f39c12'}); + .find('a:first').css({ + 'background': '#f39c12' + }); $(document).on('mousemove', function (event) { if (dragMode && !isMain) { - $navTabLi.css({'left': event.pageX - abs_x + 'px'}); + $navTabLi.css({ + 'left': event.pageX - abs_x + 'px' + }); $el.navPanelList.children('li:not(".mt-drag-tmp")').each(function () { var leftWidth = $(this).offset().left + $(this).outerWidth() + 20; //20 px more for gap - if( leftWidth > $navTabLi.offset().left ){ - if($(this).next().attr('id') !== 'multitabs_tmp_tab_blank'){ + if (leftWidth > $navTabLi.offset().left) { + if ($(this).next().attr('id') !== 'multitabs_tmp_tab_blank') { moved = true; $prevNavTabLi = $(this); $('#multitabs_tmp_tab_blank').remove(); @@ -615,17 +656,23 @@ if (typeof jQuery === "undefined") { } }); } - }).on("selectstart",function(){ //disable text selection + }).on("selectstart", function () { //disable text selection if (dragMode) { return false; } }).on('mouseup', function () { - if(dragMode){ - $navTabLi.css({'left': '0px', 'position': 'relative', 'z-index': 'inherit'}) + if (dragMode) { + $navTabLi.css({ + 'left': '0px', + 'position': 'relative', + 'z-index': 'inherit' + }) .removeClass('mt-drag-tmp') - .find('a:first').css({'background' : ''}); + .find('a:first').css({ + 'background': '' + }); $('#multitabs_tmp_tab_blank').remove(); - if(moved){ + if (moved) { $prevNavTabLi.after($navTabLi); } } @@ -635,32 +682,32 @@ if (typeof jQuery === "undefined") { } //close tab - handler($el.nav, 'click', '.mt-close-tab', function(){ + handler($el.nav, 'click', '.mt-close-tab', function () { self.close($(this).closest('li')); return false; //Avoid possible BUG }); //move left - handler($el.nav, 'click', '.mt-move-left', function(){ + handler($el.nav, 'click', '.mt-move-left', function () { self.moveLeft(); return false; //Avoid possible BUG }); //move right - handler($el.nav, 'click', '.mt-move-right', function(){ + handler($el.nav, 'click', '.mt-move-right', function () { self.moveRight(); return false; //Avoid possible BUG }); //show actived tab - handler($el.nav, 'click', '.mt-show-actived-tab', function(){ + handler($el.nav, 'click', '.mt-show-actived-tab', function () { self.showActive(); return false; //Avoid possible BUG }); //close all tabs - handler($el.nav, 'click', '.mt-close-all-tabs', function(){ + handler($el.nav, 'click', '.mt-close-all-tabs', function () { self.closeAll(); return false; //Avoid possible BUG }); //close other tabs - handler($el.nav, 'click', '.mt-close-other-tabs', function(){ + handler($el.nav, 'click', '.mt-close-other-tabs', function () { self.closeOthers(); return false; //Avoid possible BUG }); @@ -668,27 +715,27 @@ if (typeof jQuery === "undefined") { //fixed the nav-bar var navHeight = $el.nav.outerHeight(); $el.tabContent.css('paddingTop', navHeight); - if(options.nav.fixed){ - handler($(window), 'scroll', function(){ + if (options.nav.fixed) { + handler($(window), 'scroll', function () { var scrollTop = $(this).scrollTop(); scrollTop = scrollTop < ($el.wrapper.height() - navHeight) ? scrollTop + 'px' : 'auto'; - $el.nav.css('top',scrollTop); + $el.nav.css('top', scrollTop); return false; //Avoid possible BUG }); } //if layout === 'classic' show hide list in dropdown menu - if(options.nav.layout === 'classic'){ - handler($el.nav, 'click', '.mt-dropdown:not(.open)', function(){ //just trigger when dropdown not open. + if (options.nav.layout === 'classic') { + handler($el.nav, 'click', '.mt-dropdown:not(.open)', function () { //just trigger when dropdown not open. var list = self._getHiddenList(); - var $dropDown = $el.navToolsRight.find('.mt-hidden-list:first').empty(); - if(list) { //when list is not empty - while(list.prevList.length){ + var $dropDown = $el.navToolsRight.find('.mt-hidden-list:first').empty(); + if (list) { //when list is not empty + while (list.prevList.length) { $dropDown.append(list.prevList.shift().clone()); } - while(list.nextList.length){ + while (list.nextList.length) { $dropDown.append(list.nextList.shift().clone()); } - }else{ + } else { $dropDown.append('
  • empty
  • '); } // return false; //Avoid possible BUG @@ -703,25 +750,31 @@ if (typeof jQuery === "undefined") { * @returns param param * @private */ - _getParam : function(obj){ - if($.isEmptyObject(obj)){ + _getParam: function (obj) { + if ($.isEmptyObject(obj)) { return false; } - var self = this, options = self.options, param = {}, data = $(obj).data(), $obj = $(obj); + var self = this, + options = self.options, + param = {}, + data = $(obj).data(), + $obj = $(obj); //content param.content = data.content || obj.content || ''; - if(!param.content.length){ + if (!param.content.length) { //url param.url = data.url || obj.url || $obj.attr('href') || $obj.attr('url') || ''; param.url = $.trim(decodeURIComponent(param.url.replace('#', ''))); - }else{ + } else { param.url = ''; } - if (!param.url.length && !param.content.length){ + if (!param.url.length && !param.content.length) { return false; } + //refresh + param.refresh = data.hasOwnProperty('refresh') || obj.hasOwnProperty('refresh') || options.refresh; //iframe param.iframe = data.iframe || obj.iframe || isExtUrl(param.url) || options.iframe; //type @@ -732,7 +785,7 @@ if (typeof jQuery === "undefined") { //active param.active = data.active || obj.active || false; //index - param.index = data.index || obj.index || getTabIndex(param.type, options.nav.maxTabs); + param.index = data.index || obj.index || getTabIndex(param.type, options.nav.maxTabs); //id param.did = data.did || obj.did || this._generateId(param); return param; @@ -745,13 +798,13 @@ if (typeof jQuery === "undefined") { * @returns storage * @private */ - _storage : function (key, param) { - if( supportStorage() ){ + _storage: function (key, param) { + if (supportStorage()) { var storage = JSON.parse(sessionStorage.multitabs || '{}'); - if( !key ){ + if (!key) { return storage; } - if( !param ){ + if (!param) { return storage[key]; } storage[key] = param; @@ -765,10 +818,10 @@ if (typeof jQuery === "undefined") { * @param key * @private */ - _delStorage : function (key) { - if( supportStorage() ){ + _delStorage: function (key) { + if (supportStorage()) { var storage = JSON.parse(sessionStorage.multitabs || '{}'); - if( !key ){ + if (!key) { return storage; } delete storage[key]; @@ -782,8 +835,8 @@ if (typeof jQuery === "undefined") { * @param storage * @private */ - _resetStorage : function (storage) { - if( supportStorage() && typeof storage === "object"){ + _resetStorage: function (storage) { + if (supportStorage() && typeof storage === "object") { sessionStorage.multitabs = JSON.stringify(storage); } }, @@ -793,16 +846,17 @@ if (typeof jQuery === "undefined") { * @param param * @private */ - _exist : function(param){ - if(!param || !param.url){ + _exist: function (param) { + if (!param || !param.url) { return false; } - var self = this, $el = self.$element; - var $navTab = $el.navPanelList.find('a[data-url="'+ param.url +'"]:first'); - if( $navTab.length ) { + var self = this, + $el = self.$element; + var $navTab = $el.navPanelList.find('a[data-url="' + param.url + '"]:first'); + if ($navTab.length) { return $navTab; - }else{ - return false; + } else { + return false; } }, @@ -812,8 +866,8 @@ if (typeof jQuery === "undefined") { * @returns {*} * @private */ - _getTabPane : function(navTab){ - return $('#'+ $(navTab).attr('data-id')); + _getTabPane: function (navTab) { + return $('#' + $(navTab).attr('data-id')); }, /** @@ -822,10 +876,11 @@ if (typeof jQuery === "undefined") { * @returns navTab * @private */ - _getNavTab : function (navTab) { - var self = this, $el = self.$element; + _getNavTab: function (navTab) { + var self = this, + $el = self.$element; var dataId = $(navTab).attr('data-id') || $(navTab).find('a').attr('data-id'); - return $el.navPanelList.find('a[data-id="'+ dataId +'"]:first'); + return $el.navPanelList.find('a[data-id="' + dataId + '"]:first'); }, /** @@ -833,8 +888,9 @@ if (typeof jQuery === "undefined") { * @param navTab * @private */ - _fixTabPosition : function (navTab) { - var self = this, $el = self.$element, + _fixTabPosition: function (navTab) { + var self = this, + $el = self.$element, $navTabLi = $(navTab).parent('li'), tabWidth = $navTabLi.outerWidth(true), prevWidth = $navTabLi.prev().outerWidth(true), @@ -849,22 +905,24 @@ if (typeof jQuery === "undefined") { leftWidth = 0 } else { //when navTab and his right tabs sum width less or same as nav-panel, it means nav-panel can contain the navTab and his right tabs - if ( (prevWidth + tabWidth + sumNextWidth) <= navPanelWidth ) { + if ((prevWidth + tabWidth + sumNextWidth) <= navPanelWidth) { leftWidth = sumPrevWidth; //sum width of left part //add width from the left, calcular the maximum tabs can contained by nav-panel - while ( (sumTabsWidth - leftWidth + prevWidth ) < navPanelWidth) { - $navTabLi = $navTabLi.prev(); //change the left navTab + while ((sumTabsWidth - leftWidth + prevWidth) < navPanelWidth) { + $navTabLi = $navTabLi.prev(); //change the left navTab leftWidth -= $navTabLi.outerWidth(); //reduce the left part width } } else { //nav-panel can not contain the navTab and his right tabs //when the navTab and his left part tabs's sum width more than nav-panel, all the width of 2 previous tabs's width set as the nav-panel margin-left. - if ( (sumPrevWidth + tabWidth ) > navPanelWidth ) { - leftWidth = sumPrevWidth - prevWidth -pprevWidth + if ((sumPrevWidth + tabWidth) > navPanelWidth) { + leftWidth = sumPrevWidth - prevWidth - pprevWidth } } } leftWidth = leftWidth > 0 ? leftWidth : 0; //avoid leftWidth < 0 BUG - $el.navPanelList.animate({marginLeft : 0 - leftWidth + "px"}, "fast"); + $el.navPanelList.animate({ + marginLeft: 0 - leftWidth + "px" + }, "fast"); }, /** @@ -872,12 +930,15 @@ if (typeof jQuery === "undefined") { * @returns hidden tab list, the prevList and nextList * @private */ - _getHiddenList : function(){ - var self = this, $el = self.$element, + _getHiddenList: function () { + var self = this, + $el = self.$element, navPanelListMarginLeft = Math.abs(parseInt($el.navPanelList.css("margin-left"))), navPanelWidth = $el.navPanel.outerWidth(true), sumTabsWidth = sumWidth($el.navPanelList.children('li')), - tabPrevList = [], tabNextList = [], $navTabLi, marginLeft; + tabPrevList = [], + tabNextList = [], + $navTabLi, marginLeft; //all tab's width no more than nav-panel's width if (sumTabsWidth < navPanelWidth) { return false; @@ -892,16 +953,19 @@ if (typeof jQuery === "undefined") { $navTabLi = $navTabLi.next(); } //overflow hidden right part - if(sumTabsWidth > marginLeft){ //check if the right part have hidden tabs + if (sumTabsWidth > marginLeft) { //check if the right part have hidden tabs $navTabLi = $el.navPanelList.children('li:last'); marginLeft = sumTabsWidth; //set margin-left as the Rightmost, and reduce one and one. - while(marginLeft > (navPanelListMarginLeft + navPanelWidth) ){ + while (marginLeft > (navPanelListMarginLeft + navPanelWidth)) { marginLeft -= $navTabLi.outerWidth(true); tabNextList.unshift($navTabLi); //add param from top $navTabLi = $navTabLi.prev(); } } - return {prevList : tabPrevList, nextList : tabNextList}; + return { + prevList: tabPrevList, + nextList: tabNextList + }; } }, @@ -912,16 +976,16 @@ if (typeof jQuery === "undefined") { * @param tabPane * @private */ - _fixTabContentLayout : function(tabPane){ + _fixTabContentLayout: function (tabPane) { var $tabPane = $(tabPane); - if($tabPane.is('iframe')){ + if ($tabPane.is('iframe')) { $('body').addClass('full-height-layout'); /** fix chrome croll disappear bug **/ $tabPane.css("height", "99%"); window.setTimeout(function () { $tabPane.css("height", "100%"); }, 0); - }else{ + } else { $('body').removeClass('full-height-layout'); } }, @@ -931,8 +995,12 @@ if (typeof jQuery === "undefined") { * Entry function * @param option */ - $.fn.multitabs = function(option,id){ - var self = $(this), did = id ? id :'multitabs', multitabs = $(document).data(did), options = typeof option === 'object' && option, opts; + $.fn.multitabs = function (option, id) { + var self = $(this), + did = id ? id : 'multitabs', + multitabs = $(document).data(did), + options = typeof option === 'object' && option, + opts; if (!multitabs) { opts = $.extend(true, {}, $.fn.multitabs.defaults, options, self.data()); opts.nav.style = (opts.nav.style === 'nav-pills') ? 'nav-pills' : 'nav-tabs'; @@ -947,45 +1015,46 @@ if (typeof jQuery === "undefined") { * @type {} */ $.fn.multitabs.defaults = { - link : '.multitabs', //selector text to trigger multitabs. - iframe : false, //Global iframe mode, default is false, is the auto mode (for the self page, use ajax, and the external, use iframe) - class : '', //class for whole multitabs - type : 'info', //change the info content name, is not necessary to change. - init : [], - nav : { - backgroundColor : '#f5f5f5', //default nav-bar background color - class : '', //class of nav - draggable : true, //nav tab draggable option - fixed : false, //fixed the nav-bar - layout : 'default', //it can be 'default', 'classic' (all hidden tab in dropdown list), and simple - maxTabs : 15, //Max tabs number (without counting main tab), when is 1, hide the whole nav - maxTitleLength : 25, //Max title length of tab - showCloseOnHover : true, //while is true, show close button in hover, if false, show close button always - style : 'nav-tabs' //can be nav-tabs or nav-pills + link: '.multitabs', //selector text to trigger multitabs. + iframe: false, //Global iframe mode, default is false, is the auto mode (for the self page, use ajax, and the external, use iframe) + class: '', //class for whole multitabs + type: 'info', //change the info content name, is not necessary to change. + init: [], + refresh: false, + nav: { + backgroundColor: '#f5f5f5', //default nav-bar background color + class: '', //class of nav + draggable: true, //nav tab draggable option + fixed: false, //fixed the nav-bar + layout: 'default', //it can be 'default', 'classic' (all hidden tab in dropdown list), and simple + maxTabs: 15, //Max tabs number (without counting main tab), when is 1, hide the whole nav + maxTitleLength: 25, //Max title length of tab + showCloseOnHover: true, //while is true, show close button in hover, if false, show close button always + style: 'nav-tabs' //can be nav-tabs or nav-pills }, - content :{ - ajax : { - class : '', //Class for ajax tab-pane - error : function (htmlCallBack) { + content: { + ajax: { + class: '', //Class for ajax tab-pane + error: function (htmlCallBack) { //modify html and return return htmlCallBack; }, - success : function (htmlCallBack) { + success: function (htmlCallBack) { //modify html and return return htmlCallBack; } }, - iframe : { - class : '' + iframe: { + class: '' } }, - language : { //language setting - nav : { - title : 'Tab', //default tab's tittle - dropdown : '', //right tools dropdown name - showActivedTab : 'Show Activated Tab', //show active tab - closeAllTabs : 'Close All Tabs', //close all tabs - closeOtherTabs : 'Close Other Tabs', //close other tabs + language: { //language setting + nav: { + title: 'Tab', //default tab's tittle + dropdown: '', //right tools dropdown name + showActivedTab: 'Show Activated Tab', //show active tab + closeAllTabs: 'Close All Tabs', //close all tabs + closeOtherTabs: 'Close Other Tabs', //close other tabs } } }; diff --git a/js/multitabs.min.js b/js/multitabs.min.js deleted file mode 100644 index a4edd0b..0000000 --- a/js/multitabs.min.js +++ /dev/null @@ -1 +0,0 @@ -if("undefined"==typeof jQuery)throw new Error("MultiTabs requires jQuery");!function(a){"use strict";var c,b=".multitabs",e=function(a,c,d,e,f){var g=f?c:c.split(" ").join(b+" ")+b;a.off(g,d,e).on(g,d,e)},f=function(a,b){return"main"===a?0:(b=b||8,c=c||0,c++,c%=b)},i=function(b,c){var d,e,f,g;for(c=c||a.fn.multitabs.defaults.navTab.maxTitleLength,d=(b+"").split(" "),e="",f=0;fc&&(e=e.substr(0,c),e+="..."),e},j=function(){return!(void 0===sessionStorage)},h=function(b){var c=0;return a(b).each(function(){c+=a(this).outerWidth(!0)}),c},g=function(a){var b=function(a){var b=document.createElement("a");return b.href=a,b.href}(a),c=window.location.protocol+"//"+window.location.host+"/",d=b.substr(0,c.length);return!(d===c)},k={"default":'',classic:'',simple:'
    ',navTab:'{title}',closeBtn:' ',ajaxTabPane:'
    {content}
    ',iframeTabPane:''},l=[{type:"main",title:"main",content:"

    Demo page

    Welcome to use bootstrap multi-tabs :)

    "}],d=function(b,c){var d=this;d.$element=a(b),d._init(c)._listen()._final()};d.prototype={constructor:d,create:function(a,b){this.options;var d,e;return(d=this._getParam(a))?(e=this._exist(d))?(this.active(e),this):(d.active=void 0===d.active?b:d.active,e=this._createNavTab(d),this._createTabPane(d),this._storage(d.id,d),d.active&&this.active(e),this):this},_createTabPane:function(a){var b=this,c=b.$element;return c.tabContent.append(b._getTabPaneHtml(a)),c.tabContent.find("#"+a.id)},_getTabPaneHtml:function(a){var b=this,c=b.options;return!a.content&&a.iframe?k.iframeTabPane.replace("{class}",c.iframeTabPane.class).replace("{tabPaneId}",a.id):k.ajaxTabPane.replace("{class}",c.ajaxTabPane.class).replace("{tabPaneId}",a.id).replace("{content}",a.content)},_createNavTab:function(a){var b=this,c=b.$element,d=b._getNavTabHtml(a),e=c.navPanelList.find('a[data-type="'+a.type+'"][data-index="'+a.index+'"]').parent("li");return e.length?(e.html(d),b._getTabPane(e.find("a:first")).remove()):c.navPanelList.append("
  • "+d+"
  • "),c.navPanelList.find('a[data-type="'+a.type+'"][data-index="'+a.index+'"]:first')},_getNavTabHtml:function(a){var b=this,c=b.options,e=c.showClose?"display:inline;":"",d="main"===a.type?"":k.closeBtn.replace("{style}",e);return k.navTab.replace("{index}",a.index).replace("{navTabId}",a.id).replace("{url}",a.url).replace("{title}",a.title).replace("{type}",a.type)+d},_generateId:function(a){return"multitabs_"+a.type+"_"+a.index},active:function(a){var e,f,g,h,i,j,b=this,c=b.$element;return b.options,e=b._getNavTab(a),f=b._getTabPane(e),g=c.navPanelList.find("li.active:first a"),h=g.length?b._getParam(g):{},i=e.length?b._getParam(e):{},j=b._storage(),j[h.id]&&(j[h.id].active=!1),j[i.id]&&(j[i.id].active=!0),b._resetStorage(j),g.parent("li").removeClass("active"),e.parent("li").addClass("active"),b._fixTabPosition(e),b._getTabPane(g).removeClass("active"),f.addClass("active"),b._fixTabContentLayout(f),b._fillTabPane(f,i),b},_fillTabPane:function(b,c){var d=this,e=d.options,f=a(b);f.html()||(f.is("iframe")?f.attr("src")||f.attr("src",c.url):a.ajax({url:c.url,dataType:"html",success:function(a){f.html(e.ajaxSuccess(a))},error:function(a){f.html(e.ajaxError(a))}}))},moveLeft:function(){var i,a=this,b=a.$element,c=Math.abs(parseInt(b.navPanelList.css("margin-left"))),d=b.navPanel.outerWidth(!0),e=h(b.navPanelList.children("li")),f=0,g=0;if(d>e)return a;for(i=b.navPanelList.children("li:first");g+i.width()<=c;)g+=i.outerWidth(!0),i=i.next();if(g=0,h(i.prevAll())>d){for(;g+i.width()0;)g+=i.outerWidth(!0),i=i.prev();f=h(i.prevAll())}return b.navPanelList.animate({marginLeft:0-f+"px"},"fast"),a},moveRight:function(){var g,i,a=this,b=a.$element,c=Math.abs(parseInt(b.navPanelList.css("margin-left"))),d=b.navPanel.outerWidth(!0),e=h(b.navPanelList.children("li")),f=0;if(d>e)return a;for(g=b.navPanelList.children("li:first"),i=0;i+g.width()<=c;)i+=g.outerWidth(!0),g=g.next();for(i=0;i+g.width()0;)i+=g.outerWidth(!0),g=g.next();return f=h(g.prevAll()),f>0&&b.navPanelList.animate({marginLeft:0-f+"px"},"fast"),a},close:function(a){var f,g,b=this,d=b._getNavTab(a),e=d.parent("li"),c=b._getTabPane(d);return e.length&&c.length&&c.hasClass("unsave")&&!b._unsaveConfirm()?b:(e.hasClass("active")&&(f=e.next("li:first"),g=e.prev("li:last"),f.size()?b.active(f):g.size()&&b.active(g)),b._delStorage(d.attr("data-id")),e.remove(),c.remove(),b)},closeOthers:function(){var b=this,c=b.$element;return c.navPanelList.find("li:not(.active)").find('a:not([data-type="main"])').each(function(){var c=a(this);b._delStorage(c.attr("data-id")),b._getTabPane(c).remove(),c.parent("li").remove()}),c.navPanelList.css("margin-left","0"),b},showActive:function(){var a=this,b=a.$element,c=b.navPanelList.find("li.active:first a");return a._fixTabPosition(c),a},closeAll:function(){var b=this,c=b.$element;return c.navPanelList.find('a:not([data-type="main"])').each(function(){var c=a(this);b._delStorage(c.attr("data-id")),b._getTabPane(c).remove(),c.parent("li").remove()}),b.active(c.navPanelList.find('a[data-type="main"]:first').parent("li")),b},_init:function(a){var d,b=this,c=b.$element;return c.html(k[a.layout].replace("{mainClass}",a.class).replace("{navBarClass}",a.navBar.class).replace(/\{nav-tabs\}/g,a.style).replace(/\{backgroundColor\}/g,a.navBar.backgroundColor).replace("{dropdown}",a.language.navBar.dropdown).replace("{showActivedTab}",a.language.navBar.showActivedTab).replace("{closeAllTabs}",a.language.navBar.closeAllTabs).replace("{closeOtherTabs}",a.language.navBar.closeOtherTabs)),c.wrapper=c.find(".mt-wrapper:first"),c.navBar=c.find(".mt-nav-bar:first"),c.navToolsLeft=c.navBar.find(".mt-nav-tools-left:first"),c.navPanel=c.navBar.find(".mt-nav-panel:first"),c.navPanelList=c.navBar.find(".mt-nav-panel:first ul"),c.navToolsRight=c.navBar.find(".mt-nav-tools-right:first"),c.tabContent=c.find(".tab-content:first"),a.navBar.maxTabs<=1&&(a.navBar.maxTabs=1,c.navBar.hide()),d=c.navBar.find(".mt-nav-tools-left:visible:first").width()+c.navBar.find(".mt-nav-tools-right:visible:first").width(),c.navPanel.css("width","calc(100% - "+d+"px)"),b.options=a,b},_final:function(){var e,g,h,b=this,c=b.$element,d=b.options,f=d.init;if(j&&(e=b._storage(),b._resetStorage({}),a.each(e,function(a,c){b.create(c,!1)})),a.isEmptyObject(e))for(f=!a.isEmptyObject(f)&&f instanceof Array?f:l,h=0;h',k=b.pageX-e.offset().left+c.navBar.offset().left;e.before(j),e.css({left:b.pageX-k+"px",position:"absolute","z-index":9999}).addClass("mt-drag-tmp").find("a:first").css({background:"#f39c12"}),a(document).on("mousemove",function(b){g&&!i&&(e.css({left:b.pageX-k+"px"}),c.navPanelList.children('li:not(".mt-drag-tmp")').each(function(){var b=a(this).offset().left+a(this).outerWidth()+20;return b>e.offset().left?("multitabs_tmp_tab_blank"!==a(this).next().attr("id")&&(h=!0,f=a(this),a("#multitabs_tmp_tab_blank").remove(),f.after(j)),!1):void 0}))}).on("selectstart",function(){return g?!1:void 0}).on("mouseup",function(){g&&(e.css({left:"0px",position:"relative","z-index":"inherit"}).removeClass("mt-drag-tmp").find("a:first").css({background:""}),a("#multitabs_tmp_tab_blank").remove(),h&&f.after(e)),g=!1})}),e(c.navBar,"click",".mt-close-tab",function(){return b.close(a(this).closest("li")),!1}),e(c.navBar,"click",".mt-move-left",function(){return b.moveLeft(),!1}),e(c.navBar,"click",".mt-move-right",function(){return b.moveRight(),!1}),e(c.navBar,"click",".mt-show-actived-tab",function(){return b.showActive(),!1}),e(c.navBar,"click",".mt-close-all-tabs",function(){return b.closeAll(),!1}),e(c.navBar,"click",".mt-close-other-tabs",function(){return b.closeOthers(),!1}),f=c.navBar.outerHeight(),c.tabContent.css("paddingTop",f),d.fixed&&e(a(window),"scroll",function(){var b=a(this).scrollTop();return b=bempty")}),b},_getParam:function(b){if(a.isEmptyObject(b))return!1;var c=this,d=c.options,e={},h=a(b);return e.content=h.data("content")||b.content||d.content||"",e.content.length?e.url="":(e.url=h.data("url")||b.url||h.attr("href")||h.attr("url")||"",e.url=a.trim(decodeURIComponent(e.url.replace("#","")))),e.url.length||e.content.length?(e.iframe=h.data("iframe")||b.iframe||g(e.url)||d.iframe,e.type=h.data("type")||b.type||d.type,e.title=h.data("title")||b.title||h.text()||e.url.replace("http://","").replace("https://","")||d.language.navBar.title,e.title=i(e.title,d.navBar.maxTitleLength),e.active=h.data("active")||b.active,e.index=h.data("index")||b.index||f(e.type,d.navBar.maxTabs),e.id=h.data("id")||b.id||this._generateId(e),e):!1},_storage:function(a,b){if(j()){var c=JSON.parse(sessionStorage.multitabs||"{}");return a?b?(c[a]=b,sessionStorage.multitabs=JSON.stringify(c),c):c[a]:c}},_delStorage:function(a){if(j()){var b=JSON.parse(sessionStorage.multitabs||"{}");return a?(delete b[a],sessionStorage.multitabs=JSON.stringify(b),b):b}},_resetStorage:function(a){j()&&"object"==typeof a&&(sessionStorage.multitabs=JSON.stringify(a))},_exist:function(a){var b,c,d;return a&&a.url?(b=this,c=b.$element,d=c.navPanelList.find('a[data-url="'+a.url+'"]:first'),d.length?d:!1):!1},_getTabPane:function(b){return a("#"+a(b).attr("data-id"))},_getNavTab:function(b){var c=this,d=c.$element,e=a(b).attr("data-id")||a(b).find("a").attr("data-id");return d.navPanelList.find('a[data-id="'+e+'"]:first')},_fixTabPosition:function(b){var c=this,d=c.$element,e=a(b).parent("li"),f=e.outerWidth(!0),g=e.prev().outerWidth(!0),i=e.prev().prev().outerWidth(!0),j=h(e.prevAll()),k=h(e.nextAll()),l=d.navPanel.outerWidth(!0),m=h(d.navPanelList.children("li")),n=0;if(l>m)n=0;else if(l>=g+f+k)for(n=j;l>m-n+g;)e=e.prev(),n-=e.outerWidth();else j+f>l&&(n=j-g-i);n=n>0?n:0,d.navPanelList.animate({marginLeft:0-n+"px"},"fast")},_getHiddenList:function(){var i,j,a=this,b=a.$element,c=Math.abs(parseInt(b.navPanelList.css("margin-left"))),d=b.navPanel.outerWidth(!0),e=h(b.navPanelList.children("li")),f=[],g=[];if(d>e)return!1;for(i=b.navPanelList.children("li:first"),j=0;j+i.width()<=c;)j+=i.outerWidth(!0),f.push(i),i=i.next();if(e>j)for(i=b.navPanelList.children("li:last"),j=e;j>c+d;)j-=i.outerWidth(!0),g.unshift(i),i=i.prev();return{prevList:f,nextList:g}},_fixTabContentLayout:function(b){var c=a(b);c.is("iframe")?(a("body").addClass("full-height-layout"),c.css("height","99%"),window.setTimeout(function(){c.css("height","100%")},0)):a("body").removeClass("full-height-layout")}},a.fn.multitabs=function(b,c){var i,e=a(this),f=c?c:"multitabs",g=a(document).data(f),h="object"==typeof b&&b;return g||(i=a.extend(!0,{},a.fn.multitabs.defaults,h,e.data()),i.style="nav-pills"===i.style?"nav-pills":"nav-tabs",g=new d(this,i),a(document).data(f,g)),a(document).data(f)},a.fn.multitabs.defaults={showClose:!1,draggable:!0,fixed:!1,layout:"default",style:"nav-tabs",link:".multitabs",iframe:!1,"class":"",type:"info",init:[],navBar:{"class":"",maxTabs:15,maxTitleLength:25,backgroundColor:"#f5f5f5"},ajaxTabPane:{"class":""},iframeTabPane:{"class":""},language:{navBar:{title:"Tab",dropdown:'',showActivedTab:"Show Activated Tab",closeAllTabs:"Close All Tabs",closeOtherTabs:"Close Other Tabs"}},ajaxSuccess:function(a){return a},ajaxError:function(a){return a}}}(jQuery); \ No newline at end of file