(function ($) { /** * Tab栏控件 * * @class FS.QuickTab * @extends FR.Widget * @since 8.0 * * @cfg {JSON} options 配置属性 * @cfg {String} options.baseCls 控件基础类 * @cfg {String} options.style 控件主题样式 * @cfg {Number} options.tabWidth Tab宽度 * @cfg {Number} options.tabHeight Tab高度,目前框架暂不支持此配置项,慎用 * @cfg {Number} options.dropBoxWidth Tab弹出按钮框宽度 * @cfg {Boolean} options.isCollapsible 是否可收起 * @cfg {String} options.hasHomepageBtn 是否需显示首页按钮 * * @cfg {Function} [options.onCreateTab] 创建Tab标签时的操作,可修改标签样式(全局) * @cfg {Function} [options.onSelectTab] 选中每个Tab页面时的操作,可修改内容(全局) * @cfg {Function} [options.onCloseTab] 关闭每个Tab页面时的操作(全局) * @cfg {Function} [options.afterLoadTab] 加载每个Tab页面时的操作(全局) */ FS.QuickTab = FR.extend(FR.Widget, { NAV: { 'BACK': 0, 'MORE': 1, 'ITEM': 2, 'HOMEPAGE': 3, 'MOREITEM': 4, 'CLOSEALL': 5, 'CLOSEOTHER': 6 }, _defaultConfig: function () { return $.extend(FS.QuickTab.superclass._defaultConfig.apply(this, arguments), { baseCls: 'fs-tab', style: 'alpha', tabWidth: 150, tabHeight: 30, dropBoxWidth: 150, isCollapsible: true, hasHomepageBtn: false, onCreateTab: null, onSelectTab: null, onCloseTab: null, afterLoadTab: null }); }, _init: function () { FS.QuickTab.superclass._init.apply(this, arguments); this.element.addClass(this.options.style); // 悬浮元素区 this.$float = $('<div class="fs-tab-float"/>').css({ 'z-Index': FR.widget.opts.zIndex++ }).appendTo(this.element); // Tab栏按钮 this.$btns = this._createBtns(); // 内容区遮罩 this.$contentMask = this._createContentMask().hide().appendTo(this.element); // 内容区 this.$content = $('<div class="fs-tab-content"/>').appendTo(this.element); // 缓存当前 tab 栏中已加载的对应 entry,务必与 $tabs 中顺序一致 this.loadedEntries = []; this._createHomepageBtn(); this._bindBtnEvts(); this.visibleTabCount = 0; this.currentTabWidth = this.options.tabWidth; this.dropdownLeft = Math.floor((this.options.tabWidth - this.options.dropBoxWidth) / 2); this.doResize(); // 展开状态 this.isExpand = true; if (this.options.isCollapsible === true) { this.setExpand(false); this.isExpand = false; this.element.hide(); } }, _resizeTabs: function () { var self = this; var width = this.element.width(), height = this.element.height(); // 自适应缩放tab栏 var tabBarWidth = width - 40; // 计算tab区域尺寸 if (this.options.isCollapsible) { tabBarWidth -= 60; } if (this.options.hasHomepageBtn) { tabBarWidth -= 60; } this.$tabs.width(tabBarWidth); var tabs = this.$tabs.children(); // 宽度只缩不增 var visibleTabCount = Math.floor(tabBarWidth / this.options.tabWidth) + 1; var tabWidth = this.options.tabWidth; if (tabs.length >= visibleTabCount) { tabWidth = Math.floor(tabBarWidth / visibleTabCount); } this.visibleTabCount = visibleTabCount; // 缩放操作 if (tabWidth !== this.currentTabWidth) { this.dropdownLeft = Math.floor((tabWidth - this.options.dropBoxWidth) / 2); $.each(tabs, function (i, tab) { $(tab).outerWidth(tabWidth); // 调整文本标题宽度 $(".fs-tab-item-label", $(tab)).outerWidth(tabWidth - 20); }); this.currentTabWidth = tabWidth; } // 内容区域缩放 this.$content.width(width).height(height - this.options.tabHeight); this.fireEvent("resize", {width : width, height : height - this.options.tabHeight}); // 尝试对当前已选中标签执行 var $selectedTab = this._getSelectedTab(); if ($selectedTab !== null) { this._doSelectTab($selectedTab) } }, _createContentMask: function () { var self = this; return $('<div class="fs-tab-content-mask"/>').click( function (e) { if (self._isMenuExpanded()) { // 如果Tab菜单弹出,则先收起 self._expandMenu(false); e.stopEvent(); } }).css({ 'z-Index': FR.widget.opts.zIndex++ }); }, _createBtns: function () { var self = this; var $btns = $('<div class="fs-tab-btns fui-seb"/>').appendTo(this.element); // 返回目录按钮 if (this.options.isCollapsible) { $('<div class="fs-tab-back fui-bsb nav-btn"/>') .append($('<i class="icon-tab-dashboard"/>')) .data('NAV', this.NAV.BACK) .appendTo($btns); } // 首页 if (this.options.hasHomepageBtn) { $('<div class="fs-tab-homepage fui-seb nav-btn"/>') .append($('<i class="icon-tab-home"/>')) .data('NAV', this.NAV.HOMEPAGE) .appendTo($btns); } // tab标签 this.$tabs = $('<ul class="fs-tab-names"/>') .appendTo($btns); //更多tab下拉按钮 $('<div class="fs-tab-more nav-btn"/>') .append($('<i class="icon-tab-menu"/>')) .data('NAV', this.NAV.MORE) .appendTo($btns); // 菜单 this.$menu = $('<div class="fs-tab-menu-wrapper fui-bcb lower"/>').css({ 'top': this.options.tabHeight }).hide().appendTo(this.$float); var menuOptions = $('<div class="fs-tab-menu-options">').appendTo(this.$menu); // 关闭所有 $('<div class="fs-tab-menu-item nav-btn"/>').append( $('<span/>').text(FR.i18nText("FS-Frame-Close_All")) ).data('NAV', this.NAV.CLOSEALL).appendTo(menuOptions); // 关闭其他 $('<div class="fs-tab-menu-item nav-btn"/>').append( $('<span/>').text(FR.i18nText("FS-Frame-Close_Other_Tabs")) ).data('NAV', this.NAV.CLOSEOTHER).appendTo(menuOptions); this.$menuItems = $('<ul class="fs-tab-menu-items"/>') .appendTo(this.$menu); return $btns; }, _bindBtnEvts: function () { var NAV = this.NAV, self = this; var doProxy = function (event) { var target = event.target; var type = event.type; var $obj = $(target).closest('.nav-btn'); if ($obj && $obj.length > 0) { var navitype = $obj.data('NAV'); if (type === 'mouseover') { switch (navitype) { case NAV.CLOSEALL: case NAV.CLOSEOTHER: case NAV.MOREITEM: $obj.addClass('fui-fbc fui-bsb'); break; default : break; } $('.icon-tab-close', $obj).show(); } else if (type === 'mouseout') { switch (navitype) { case NAV.CLOSEALL: case NAV.CLOSEOTHER: case NAV.MOREITEM: $obj.removeClass('fui-fbc fui-bsb'); break; default : break; } $('.icon-tab-close', $obj).hide(); } else if (type === 'click') { switch (navitype) { case NAV.BACK: //返回 self.setExpand(!self.isExpanded()); self._expandMenu(false); break; case NAV.HOMEPAGE: // 首页按钮 self.setExpand(true); self._doSelectHomepage(); break; case NAV.MOREITEM: case NAV.ITEM: //打开指定标签 if ($obj.hasClass("fs-tab-menu-item")) { $obj = self._findLoadedTabFromEntry($obj.data('ENTRY')); } self._doSelectTab($obj); self.setExpand(true); self._expandMenu(false); break; case NAV.MORE: //更多下拉标签 self._expandMenu(true); break; case NAV.CLOSEALL: //关闭所有 self._doCloseAllTabs(); self._expandMenu(false); break; case NAV.CLOSEOTHER: self._doCloseOtherTabs(); self._expandMenu(false); break; default: break; } } } }; this.$btns.unbind(); this.$btns.bind('click', doProxy) .bind('mouseover', doProxy) .bind('mouseout', doProxy); this.$float.unbind(); this.$float.bind('click', doProxy) .bind('mouseover', doProxy) .bind('mouseout', doProxy); }, _doSelectTab: function ($tab) { var idx = this._getTabIndex($tab); if (idx < 0) { return; } // 选中Tab时的操作 var entry = this._getTabEntry($tab); var $content = $tab.data('CONTENT'); if (FR.applyFunc(this, entry.onSelect, [$tab, $content, entry], false) === false) { FR.applyFunc(this, this.options.onSelectTab, [$tab, $content, entry], false); } // 将被隐藏的 tab 移动至可显示的最后一个 var lastIndex = this.visibleTabCount - 1; if (idx > lastIndex) { this._moveTabByIndex(idx, lastIndex) } // 设置选中状态 if (!$tab.hasClass('select')) { $('.select', this.$btns).removeClass('select fui-bsb'); $tab.addClass('select fui-bsb'); } // 展示内容 if ($content && $content.is(":hidden")) { $('.fs-tab-content-item', this.$content).hide(); $content.show(); } this._refreshMenu(); }, _doCloseTab: function ($tab) { var self = this; var idx = this._getTabIndex($tab); var $selectedTab = this._getSelectedTab(); var selectedIdx = this._getTabIndex($selectedTab); var $content = $tab.data('CONTENT'); if ($content) { // 检查并确认是否关闭标签页 var entry = this._getTabEntry($tab); var doNotClose = FR.applyFunc(this, entry.onClose, [$tab, $content, entry], false); if (!doNotClose) { doNotClose = FR.applyFunc(this, this.options.onCloseTab, [$tab, $content, entry], false); } // 关闭标签页 if (!doNotClose && this._needToClose($content)) { $content.detach(); } else { // 未确认关闭,继续保留 return; } } var callback = function () { // 移除Tab var index = self._getTabIndex($tab); $tab.remove(); self.loadedEntries.splice(index, 1); if (self.loadedEntries.length === 0) { if (self.options.hasHomepageBtn) { // 选择首页 self._doSelectHomepage(); } else { // 没有可选Tab时隐藏 var hideFn = function () { if (self.loadedEntries.length === 0) { self.element.hide(); } }; self.setExpand(false, hideFn) } } self._refreshMenu(); }; // 移除下拉按钮 $(".fs-tab-item-dropdown-wrapper", self.$float).remove(); // 执行关闭操作 $tab.animate({ width: '-=' + this.options.tabWidth }, 'fast', callback); // 重新选中Tab var $target = null; if (idx !== selectedIdx) { // 之前选中的Tab $target = $selectedTab; } else if (idx + 1 < this.loadedEntries.length) { // 后方有可选Tab $target = this._getTabByIndex(idx + 1) } else { // 前一项Tab $target = this._getTabByIndex(this.loadedEntries.length - 2); } this._doSelectTab($target); }, _needToClose: function (frame) { if (frame.length > 0 && frame[0].contentWindow) { // ifame 直接关闭 if (frame[0].nodeName === "IFRAME") { return true; } var win = frame[0].contentWindow; var beforeUnload = win.onbeforeunload || (win.document && win.document.body.onbeforeunload); // 关闭前检查标签页内容 if ($.isFunction(beforeUnload)) { var info = beforeUnload.call(); if (info) { var confirm = window.confirm(info + "\n" + FR.i18nText('FS-Frame-Sure_To_Leave')); if (!confirm) { return false; } } } } return true; }, _doCloseAllTabs: function () { var self = this; $.each(this.$tabs.children(), function (index, tab) { self._doCloseTab($(tab)); }) }, /** * 关闭当前的选中的tab选项页 */ closeActiveTab: function () { //711开放的接口兼容. this._doCloseTab(this._getSelectedTab()) }, _doCloseOtherTabs: function () { var self = this; var $selected = this._getSelectedTab(); $.each(this.$tabs.children(), function (index, tab) { if ($selected.context !== tab) { self._doCloseTab($(tab)); } }) }, _getSelectedTab: function () { var $tab = null; $.each(this.$tabs.children(), function (i, tab) { if ($(tab).hasClass('select')) { $tab = $(tab); return false; } }); return $tab; }, _getTabIndex: function ($tab) { if (FR.isNull($tab)) { return -1; } return $.inArray($tab.get(0), this.$tabs.children()); }, _getTabByIndex: function (idx) { return $(this.$tabs.children().get(idx)); }, _getTabEntry: function ($tab) { return this.loadedEntries[this._getTabIndex($tab)]; }, _moveTabByIndex: function (from, to) { var tabs = this.$tabs.children(); tabs.splice(to, 0, tabs.splice(from, 1)[0]); this.$tabs.append(tabs); this.loadedEntries.splice(to, 0, this.loadedEntries.splice(from, 1)[0]); }, _addNewTabFromEntry: function (entry) { var self = this; var $tab = $('<li class="fs-tab-item nav-btn"/>') .data('NAV', this.NAV.ITEM) .hover(function () { $(".fs-tab-item-dropdown-wrapper", self.$float).remove(); if ($(this).hasClass('select') && self.isExpanded()) { var wrapperOffset = { top: self.options.tabHeight, left: $(this).offset().left - self.element.offset().left }; var $wrapper = self._createTabDropdownWrapper(entry).offset(wrapperOffset).appendTo(self.$float); $wrapper.data('TAB', $(this)) } }, function () { }).appendTo(this.$tabs); $tab.outerWidth(this.currentTabWidth); var $label = $('<div class="fs-tab-item-label">').outerWidth(this.currentTabWidth - 20).append( $('<span/>').text(entry.text).attr('title', entry.text) ).appendTo($tab); // 关闭按钮 $('<i class="icon-tab-close"/>') .click(function (e) { self._doCloseTab($(this).closest(".fs-tab-item")); // 屏蔽选中操作 e.stopEvent(); }).hide() .appendTo($label); if (FR.applyFunc(this, entry.onCreate, [$tab, entry], false) === false) { FR.applyFunc(this, this.options.onCreateTab, [$tab, entry], false); } // 缓存entry供刷新使用 this.loadedEntries.push(entry); this._resizeTabs(); this._doSelectTab($tab); return $tab; }, _createHomepageBtn: function () { var self = this; if (this.options.hasHomepageBtn) { var url = FS.config.homePageUrl; var $btn = $(".fs-tab-homepage.nav-btn", this.$btns); $btn.hover(function () { $(".fs-tab-item-dropdown-wrapper", self.$float).remove(); if ($(this).hasClass('select') && self.isExpanded()) { var wrapperOffset = { top: self.options.tabHeight, left: $(this).offset().left - self.element.offset().left - 45 }; var $wrapper = self._createTabDropdownWrapper().offset(wrapperOffset) .addClass('homepage-drop').appendTo(self.$float); $wrapper.data('TAB', $(this)); } }, function () { }); $('.fs-tab-content-item', this.$content).hide(); // 设置首页内容 this.setExpand(true, function () { var $content; if (FS.isPlatForm()) { $content = $('<div class="fs-tab-content-item platform-bg"/>') .append($('<div class="platform-fg"/>')).appendTo(self.$content); } else { $content = $('<iframe class="fs-tab-content-item"/>').attr( 'src', encodeURI(FS.Trans._dealWithSrc(url)) ).appendTo(self.$content); } $btn.data('CONTENT', $content); self._doSelectHomepage(); }); } }, _doSelectHomepage: function () { var $btn = $(".fs-tab-homepage.nav-btn", this.$btns); // 设置选中状态 if (!$btn.hasClass('select')) { $('.select', this.$btns).removeClass('select fui-bsb'); $btn.addClass('select fui-bsb'); } // 展示内容 var content = $btn.data('CONTENT'); if (content && content.is(":hidden")) { $('.fs-tab-content-item', this.$content).hide(); content.show(); } }, _createTabDropdownWrapper: function (entry) { var self = this; var isStarred = false; // 根据是否具有entry.id判断tab是否为管理页面 if (entry && entry.id) { isStarred = this._isEntryStarred(entry); } var btnCount = 1; // 容器 var $wrapper = $('<div class="fs-tab-item-dropdown-wrapper"/>').css({ 'left': entry ? this.dropdownLeft : 0, 'z-Index': FR.widget.opts.zIndex++ }); // 根据是否具有entry.id判断tab是否为管理页面 if (entry && !entry.isModule && entry.showFavorite !== 'no') { btnCount++; } // 下拉菜单内容 var $drop = $('<div class="fs-tab-item-dropdown"/>').appendTo($wrapper); $('<span class="arrow"/>').appendTo($wrapper); // 刷新按钮 this._createRefreshBtn().appendTo($drop); // 收藏按钮 if (btnCount > 1) { $drop.addClass("double-size"); $('<span class="splitter"/>').appendTo($drop); this._createStarBtn(isStarred).appendTo($drop); } // 绑定删除下拉菜单事件 var doRemove = function (e) { if (!$(e.target).closest('.fs-tab-item-dropdown-wrapper').length > 0 && !$(e.target).closest('.nav-btn.select').length > 0) { $(".fs-tab-item-dropdown-wrapper", self.$float).remove(); $('body').unbind(); } }; $('body').bind('mouseover', doRemove); return $wrapper; }, _isEntryStarred: function (entry) { var isStarred = false; $.each(FS.Control.getFavoriteNodes(), function (index, node) { if (node.entry.id === entry.id) { isStarred = true; return false; } }); return isStarred; }, _getFavoriteNodeByEntry: function (entry) { var target = null; $.each(FS.Control.getFavoriteNodes(), function (index, node) { if (node.entry.id === entry.id) { target = node; return false; } }); return target; }, _createDropdownBtn: function (config) { var self = this; return $('<div class="fs-tab-item-dropdown-btn"/>') .addClass(config.btnCls).append($('<i/>').addClass(config.iconCls)) .append($('<span/>').text(config.text)).click(function (e) { var $tab = $(this).closest(".fs-tab-item-dropdown-wrapper").data('TAB'); var entry = self.loadedEntries[self._getTabIndex($tab)]; config.op(e, $tab, entry); }); }, _createRefreshBtn: function () { var self = this; var config = { 'btnCls': "dropdown-refresh", 'iconCls': "icon-tab-refresh", 'text': FR.i18nText('FS-Frame-Button_Refresh'), 'op': function (e, $tab) { self._refreshTab($tab); // 点击刷新隐藏下拉按钮 $(".fs-tab-item-dropdown-wrapper", $tab).eq(0).hide(); } }; return this._createDropdownBtn(config); }, _refreshTab: function ($tab, src) { var $content = $tab.data('CONTENT'); var completeFn = $tab.data('COMPLETE'); if ($content && $content.size() > 0) { var frame = $content[0]; if (frame && frame.src) { // 刷新iframe,支持跨域 frame.src = src || frame.src; FR.applyFunc(self, completeFn, [$content], false); } else if ($(frame).hasClass("fs_design_container")) { // 刷新管理页面 var entry = this._getTabEntry($tab); entry.contentEl.children().remove(); this._loadPlainPaneFromEntry(entry, $tab); } } }, _createStarBtn: function (isStarred) { var self = this; var starCfg = { 'btnCls': "dropdown-star", 'iconCls': "icon-tab-star", 'op': function (e, $tab, entry) { // 按钮点击操作 var target = e.target; var $btn = $(target).closest('.fs-tab-item-dropdown-btn'); if (!entry && !entry.id) { e.stopEvent(); return; } if ($btn && $btn.length > 0) { var starred = $btn.data('isStarred'); if (starred === true) { // 取消收藏 var node = self._getFavoriteNodeByEntry(entry); if (node !== null) { FS.Control.removeFavoriteNode(node.id, function () { self._replaceStarBtn(!starred); }); } } else { // 收藏 FS.Control.addFavoriteNode(entry, function () { self._replaceStarBtn(!starred); }); } } // 屏蔽选中操作 e.stopEvent(); } }; starCfg.text = isStarred ? FR.i18nText('FS-Frame-Button_Unstar') : FR.i18nText('FS-Frame-Button_Star'); var $btn = this._createDropdownBtn(starCfg); $('.icon-tab-star', $btn).html(isStarred ? '\ue603' : '\ue61e'); $btn.data("isStarred", isStarred); return $btn; }, _replaceStarBtn: function (isStarred) { var $btn = this.$float.find(".dropdown-star"); if ($btn.data("isStarred") !== isStarred) { var $icon = $('.icon-tab-star', $btn); var $label = $('span', $btn); if (isStarred) { // 取消收藏 $icon.html('\ue603'); $label.text(FR.i18nText('FS-Frame-Button_Unstar')); } else { // 收藏 $icon.html('\ue61e'); $label.text(FR.i18nText('FS-Frame-Button_Star')); } $btn.data("isStarred", isStarred); } }, _findLoadedTabFromEntry: function (entry) { var self = this; var $tab = null; $.each(self.loadedEntries, function (i, loadedEntry) { if (self._compareEntry(entry, loadedEntry)) { $tab = $(self.$tabs.children()[i]); return false; } }); return $tab; }, /** * 比较生成 tab 的两个 entry 是否为同一个 * @private * @param e1 第一个entry * @param e2 第二个entry * @returns {boolean} 两个 entry 是否为同一个 */ _compareEntry: function (e1, e2) { if (FR.isNull(e1) || FR.isNull(e2)) { return e1 == undefined && e2 == undefined || e1 == null && e2 == null } if (e1 === e2) { return true; } else if (typeof e1 == 'object' && typeof e2 == 'object') { if (e1.text === e2.text) { // 标题一致 return true; } else if (!FR.isNull(e1.id) && e1.id === e2.id) { // id 一致 return true; } } return false; }, _expandMenu: function (expand, duration) { var isExpand = this._isMenuExpanded(); if (expand === isExpand) { return; } duration = duration || 50; if (expand) { this.$contentMask.show(); this.$menu.css({ 'z-Index': FR.widget.opts.zIndex++ }).slideDown(duration); } else { this.$contentMask.hide(); this.$menu.slideUp(duration); } }, _isMenuExpanded: function () { return this.$menu.is(":visible"); }, _refreshMenu: function () { var self = this; var menuEntries = this.loadedEntries.slice(this.visibleTabCount); this.$menu.children('.slimScrollDiv').detach(); this.$menu.children('.fs-tab-menu-items').detach(); this.$menuItems = $('<div class="fs-tab-menu-items"/>') .appendTo(this.$menu); var maxHeight = this.element.height() - 100; var itemsHeight = 0; $.each(menuEntries, function (index, entry) { itemsHeight += 30; var $menuItem = self._addMenuItemFromEntry(entry); self.$menuItems.append($menuItem); }); if (itemsHeight > maxHeight) { this.$menuItems.slimScroll({ position: 'relative', height: maxHeight + 'px' }) } }, _addMenuItemFromEntry: function (entry) { var self = this; var $menuItem = $('<a class="fs-tab-menu-item nav-btn"/>') .data('NAV', this.NAV.MOREITEM) .data('ENTRY', entry) .appendTo(this.$menuItems); $('<span/>').text(entry.text) .attr('title', entry.text) .appendTo($menuItem); $('<i class="icon-tab-close"/>') .click(function (e) { var $item = $(this).closest(".fs-tab-menu-item"); var $tab = self._findLoadedTabFromEntry($item.data('ENTRY')); self._doCloseTab($tab); // 屏蔽选中操作 e.stopEvent(); }).hide() .appendTo($menuItem); return $menuItem; }, _loadIframePaneFromEntry: function (entry, $tab) { var url, timeStamp = "", self = this; this.element.show(); if (entry.src) { url = entry.src; } else if (entry.bilink) { url = entry.bilink; } else if (entry.url) { url = entry.url; FR.ajax({ async: false, data: { serverID : FS.serverID }, url: FR.servletURL + '?op=fs_main&cmd=entry_report&id=' + entry.id + '&isTree=true', complete: function (res, status) { timeStamp = (url.indexOf('?') > -1 ? '&' : '?') + 'fr_check_url=' + res.responseText; } }); } var src = url ? url + timeStamp : '?op=fs_main&cmd=entry_report&id=' + entry.id; if (entry.bi_edit) { src += "&edit=_bi_edit_"; } if(FS.serverID){ src += ("&serverID=" + FS.serverID); } $('.fs-tab-content-item', this.$content).hide(); this.setExpand(true, function () { var $content = $('<iframe class="fs-tab-content-item"/>').attr( 'src', encodeURI(src) ).appendTo(self.$content); $tab.data('CONTENT', $content); $tab.data('COMPLETE', entry.afterLoad); self._doSelectTab($tab); // 执行后续事件 if (FR.applyFunc(self, entry.afterLoad, [$tab, $content, entry], false) === false) { FR.applyFunc(self, self.options.afterLoadTab, [$tab, $content, entry], false); } }); }, _loadPlainPaneFromEntry: function (entry, $tab) { var self = this; this.element.show(); $('.fs-tab-content-item', this.$content).hide(); this.setExpand(true, function () { var $content = $('<div class="fs-tab-content-item"/>'); if (entry.contentEl) { $content = entry.contentEl.addClass('fs-tab-content-item').appendTo(self.$content); } $tab.data('CONTENT', $content); $tab.data('COMPLETE', entry.afterLoad); self._doSelectTab($tab); // 执行后续事件 if (FR.applyFunc(self, entry.afterLoad, [$tab, $content, entry], false) === false) { FR.applyFunc(self, self.options.afterLoadTab, [$tab, $content, entry], false); } }); }, ////// TabPane 开放的 API //////// /** * 调整Tab面板尺寸 * @param give 新的尺寸 */ doResize: function (give) { if (give) { this.element.width(give.width) .height(give.height); } this._resizeTabs(give); }, /** * 获取Tab面板状态是否已展开 * @returns {Boolean} tab面板是否已展开 */ isExpanded: function () { return this.isExpand; }, /** * 设置Tab面板展开状态 * @param {Boolean} expand 展开标志: True -> 展开, False -> 收起 * @param {Function} callback 展开完成后的回调 */ setExpand: function (expand, callback) { if (this.isExpand == expand) { FR.applyFunc(this, callback, [], false); return; } // 始终展开则直接隐藏 if (!expand && !this.options.isCollapsible) { this.element.hide(); return; } // 展开被隐藏 if (expand && this.element.is(":hidden") && this.loadedEntries.length > 0) { this.element.show(); } this.isExpand = expand; var top = 0; if (!expand) { top = this.element.height() - this.options.tabHeight; } this.element.animate({ top: top }, 'fast', callback); // 改变弹出菜单位置 if (expand) { this.$menu.css({'top': this.options.tabHeight}); this.$contentMask.css({'top': 0}); } else { this.$menu.css({'top': -this.$menu.height() - 2}); this.$contentMask.css({'top': this.options.tabHeight - document.body.clientHeight}); } }, /** * 向Tab栏添加项目 * * @param {Object} entry Tab项对应的entry对象 * @param [entry.text] 标签页的标题,是为了兼容title属性而存在的 * @param [entry.title] 标签页的标题 * @param [entry.src] 标签页的内容指向的地址 * @param [entry.onCreate] 创建Tab标签时的操作,可修改标签样式 * @param [entry.onSelect] 选中每个Tab页面时的操作,可修改内容 * @param [entry.onClose] 关闭每个Tab页面时的操作 * @param [entry.afterLoad] 加载每个Tab页面时的操作 */ addItem: function (entry) { // 兼容title参数 if (!entry.text) { entry.text = entry.title; } var $tab = this._findLoadedTabFromEntry(entry); if ($tab === null) { $tab = this._addNewTabFromEntry(entry); } else { this._doSelectTab($tab); this._refreshTab($tab, entry.src); this.setExpand(true); return; } if (entry.isModule) { // 加载模块 var designContainer = $("<div/>").addClass('fs_design_container'); entry.contentEl = designContainer; FS.Design.initOP(); var initOP = FS.Design.op; entry.afterLoad = function () { if (initOP[entry.id]) { initOP[entry.id].apply(FS.Design, [designContainer]); } }; this._loadPlainPaneFromEntry(entry, $tab); } else if (entry.contentEl) { this._loadPlainPaneFromEntry(entry, $tab); } else { this._loadIframePaneFromEntry(entry, $tab); } } }); })(jQuery);