/** * UI v1.1.0 * Copyright 2017-2018 Muyao * Licensed under the Muyao License 1.0 */ (function (window, document, $) { 'use strict'; $.site.contentTabs = { $instance: $('#admui-navTabs .site-menu'), $content: $('#admui-pageContent'), storageKey: 'admui.base.contentTabs', tabId: 0, relative: 0, tabTimeout: 30, init: function () { this.bind(); this._defaultTab(); }, bind: function () { var self = this, $navContabs = $("#admui-siteConTabs"), $navContent = $navContabs.find("ul.con-tabs"); this.tabWidth = $navContent.find("li").width(); this.view = $navContabs.find(".contabs-scroll").width(); this.ifameTabs(); // 标签页的左右移动 && 关闭单个标签页 && 切换标签页 $navContabs .on('click.site.contabs', 'button.pull-left', function () { self.tabPosition($navContent, self.tabWidth, "right"); }) .on('click.site.contabs', '.pull-right>.btn-icon', function () { var content = $navContent.width(); self.tabPosition($navContent, self.tabWidth, "left", self.view, content); }) .on('click.site.contabs', 'ul.con-tabs>li', function (e) { var $target = $(e.target), $item = $(this); if ($target.is("i.wb-close-mini")) { // 关闭 self.closeTab($item); } else if (!$item.is(".active")) { // 切换 $item.siblings("li").removeClass("active"); $item.addClass("active"); self._checkoutTab($item.find('a')); self.enable($item); } e.preventDefault(); }); // 刷新当前页 && 关闭其他 && 所有标签页 $navContabs .on('click.site.contabs', '.pull-right li.reload-page', function () { var $navLi = $navContabs.find('ul.con-tabs>li.active>a'), tabUrl = $navLi.attr('href'); // 刷新当前页 self.$content.children('[src="' + tabUrl + '"]').attr('src', tabUrl); }) .on('click.site.contabs', '.pull-right li.close-other', function () { var $navLis = $navContabs.find('ul.con-tabs>li'); $navLis.each(function () { var $that = $(this), tabId; if (!$that.is('.active') && $that.index() !== 0) { tabId = $that.find('a').attr('target'); $that.remove(); self.$content.children('[name="' + tabId + '"]').remove(); self._updateSetting(tabId); } }); $navContent.animate({left: 0}, 100); self.btnView('hide'); }) .on('click.site.contabs', '.pull-right li.close-all', function () { var $tabs = $navContabs.find('ul.con-tabs>li'), $checked = $tabs.eq(0); $tabs.each(function () { var $that = $(this), tabId; if ($that.index() !== 0) { tabId = $that.find('a').attr('target'); $that.remove(); self._updateSetting(tabId); } }); $navContent.animate({left: 0}, 100); self.btnView('hide'); $checked.addClass('active'); self.enable($tabs.eq(0)); self._checkoutTab($checked.find('a')); // 关闭所有 self.$content.children(':not(:first)').remove(); self.tabSize(); }); // 登出清楚标签页缓存 $(document).on('click', '#admui-signOut', function () { $.sessionStorage.remove(self.storageKey); }); // 浏览器窗口大小改变,标签页的对应状态 $(window).on('resize', this.resize); }, ifameTabs: function (el) { // 为当前doc对象中的a[data-iframe]标签绑定创建标签页功能 var self = this, doc = el === undefined ? document : el; // 新建标签页 $(doc).on('click', 'a[data-iframe]', function (e) { var $item = $(this), urlResult, url = $item.attr('href'), title = $.trim($item.text()) || $.trim($item.attr('title')), iframeContent = $item.data('iframe') || '#admui-pageContent', tabResult = $item.is('[target="_blank"]'); urlResult = new RegExp(/^([a-zA-z]+:|#|javascript|www\.)/); // 不执行新建标签页操作的地址 if (urlResult.test(url)) { return; } if (tabResult && iframeContent === '#admui-pageContent') { window.history.replaceState(null, '', '#!' + url); self.tabType = true; self.buildTab({name: title, url: url}); if (!self.$instance.find($item).length) { self.enable($item.parent()); } } else if (!tabResult) { $(iframeContent).find('iframe.active').attr('src', url); } e.preventDefault(); }); }, _checkoutTab: function (tab) { // 标签页的切换 var $content = this.$content, tabId = tab.attr('target'), tabTitle = $.trim(tab.attr('title')), tabUrl = tab.attr('href'), $checkedTab = $content.children('iframe[name="' + tabId + '"]'); $('title').text(tabTitle); if (!this.tabType) { window.history.replaceState(null, '', '#!' + tabUrl); } if (!$checkedTab.attr('src')) { $checkedTab.attr('src', tabUrl); } $content.children('.active').removeClass('active'); $checkedTab.addClass('active'); $.site.iframeEvents($checkedTab); this._updateSetting('checked', tabId); this.tabType = false; }, _defaultTab: function () { // 存储默认标签的信息 var $defaultTab = $('#admui-siteConTabs').find('li:first > a'), settings; settings = this.settings = $.sessionStorage.get(this.storageKey); if (settings === null) { settings = $.extend(true, {}, { 'iframe-0': { 'url': $defaultTab.attr('href'), 'name': $defaultTab.text() }, 'checked': $defaultTab.attr('target'), 'tabId': this.tabId }); this._updateSetting(settings); } else { this.tabId = settings.tabId; } }, _updateSetting: function (item, value) { var settings = $.sessionStorage.get(this.storageKey); settings = settings ? settings : {}; if (typeof item === 'object') { $.extend(true, settings, item); } else if (!value) { delete settings[item]; } else { settings[item] = value; } $.sessionStorage.set(this.storageKey, settings, this.tabTimeout); }, resize: function () { var self = $.site.contentTabs, $navContabs = $(".site-contabs"), $navContent = $navContabs.find("ul.con-tabs"); self._throttle(function () { self.view = $navContabs.find(".contabs-scroll").width(); self.tabEvent($navContent, 'media'); }, 200)(); }, enable: function ($el) { // 左侧菜单定位 var $instance = this.$instance, href = $.trim($el.find('a').attr('href')), _result = href.indexOf('#'), tabUrl = _result > 0 ? href.substring(0, _result) : href, $current = $instance.find('a[href="' + tabUrl + '"]'), $currentParents, $currentLi, $currentHasSub, $instanceLi, checkedId, currentId; if ($current.length === 0) { $.site.menu.refresh(); return; } checkedId = $.trim($instance.closest('div.tab-pane.active').attr('id')); currentId = $.trim($current.closest('div.tab-pane').attr('id')); if (checkedId !== currentId) { $('#admui-navbar a[href="#' + currentId + '"]').tab('show'); } $currentLi = $current.closest('li').siblings('li.open'); $currentParents = $current.parents('li.has-sub'); $currentHasSub = $current.closest('li.has-sub').siblings('li.open'); $instanceLi = $instance.find('li.open'); $instance.find('li.active').trigger('deactive.site.menu'); $current.closest('li').trigger('active.site.menu'); if ($currentLi.length) { $currentLi.trigger('close.site.menu'); } if (!$current.closest('li.has-sub').hasClass('open')) { if ($currentHasSub.length) { $currentHasSub.trigger('close.site.menu'); } if ($instanceLi.length) { $instanceLi.not($currentParents).trigger('close.site.menu'); } $currentParents.trigger('open.site.menu'); } }, buildTab: function (opt) { // 新建标签页 var $tabNav = $(".con-tabs"), tabName, obj = {}, tabId, _url = opt.url, _result = _url.indexOf('#'), tabUrl = _result > 0 ? _url.substring(0, _result) : _url; if (this._checkTabs($tabNav, tabUrl)) { // 标签查重 return; } tabId = ++this.tabId; tabName = 'iframe-' + tabId; // 修改当前选中的标签页 $tabNav.find("li.active").removeClass("active"); $tabNav.append('
  • ' + opt.name + '' + '
  • '); obj[tabName] = { 'url': tabUrl, 'name': opt.name }; $.extend(obj, { 'checked': tabName, 'tabId': tabId }); this._updateSetting(obj); // 修改页面标题 opt.name = opt.name === '' ? '无标题' : opt.name; $('title').text($.trim(opt.name)); this.buildIframe(_url); this.tabSize(); this.tabEvent($tabNav, 'media'); this.tabType = false; }, _checkTabs: function (doc, url) { // 标签查重 var x, prevAll, nextAll, contentW, _view = this.view, _tab = this.tabWidth, $currenttab = doc.find("a[href='" + url + "']").closest('li'); if ($currenttab.hasClass('active')) { // 标签存在&已选中 return true; } if ($currenttab.size() <= 0) { // 标签不存在 return false; } // 标签存在未选中 doc.find("li.active").removeClass("active"); $currenttab.addClass("active"); // 切换标签页 this._checkoutTab($currenttab.find('a')); // 标签位移到可视界面显示 x = doc.position().left; contentW = doc.width(); prevAll = $currenttab.prevAll('li').size() * _tab; nextAll = $currenttab.nextAll('li').size() * _tab; if (-prevAll < x) { if (prevAll + x < _view) { return true; } x = -(prevAll - _view + _tab); } else { if (-x < contentW - nextAll) { return true; } x = -(contentW - nextAll - _tab); } doc.animate({ left: x }, 100); return true; }, buildIframe: function (url) { // 创建iframe窗口 var $content = this.$content, iframeName = 'iframe-' + this.tabId, $checkedIframe; $content.children('.active').removeClass('active'); $content.append(''); $checkedIframe = $content.find('iframe[name="' + iframeName + '"]'); $.site.iframeEvents($checkedIframe); }, tabSize: function () { // 修改标签页盒子尺寸 var content, $tabNav = $(".con-tabs"), _num = $tabNav.find("li").size(); content = this.tabWidth * _num; $tabNav.css("width", content); }, tabEvent: function (doc, media) { // 增删标签页的对应状态 var content = $(".con-tabs").width(), _view = this.view, _tab = this.tabWidth; if (content > this.view) { this.tabPosition(doc, _tab, "left", _view, content, media); this.btnView('visible'); } else { this.btnView('hide'); } if (this.currentView < _view || this.currentContent > content) { this.tabPosition(doc, _tab, "right", _view, content, media); } this.currentView = _view; this.currentContent = content; }, tabPosition: function (doc, width, dir, view, content, media) { // 标签页的位移 var self = this, x = doc.position().left, callback = function (x) { var flag = x + width; if (flag > 0) { self.relative = x; return 0; } else { return x; } }; if (dir === "left") { if (x <= view - content) { return false; } if (typeof media !== 'undefined') { x = view - content; } else { x = this.relative !== 0 ? x - width + this.relative : x - width; this.relative = 0; } } else if (dir === "right") { if (x === 0) { return false; } if (typeof media !== 'undefined') { x = content <= view ? 0 : view - content; } else { x = callback(x + width); } } doc.animate({ left: x }, 100); }, _throttle: function (fn, interval) { // 函数节流操作 var _fn = fn, timer, firstTime = true; return function () { var args = arguments, self = this; if (firstTime) { _fn.apply(self, args); firstTime = false; } if (timer) { return false; } timer = setTimeout(function () { clearTimeout(timer); timer = null; _fn.apply(self, args); }, interval || 500); }; }, closeTab: function ($item) { var checkedTabId = $item.children('a').attr('target'), $checked = '', $nextLi = $item.next('li'), $content = this.$content; if ($item.is('.active')) { // 关闭选中标签 if ($nextLi.size() > 0) { $checked = $nextLi; } else { $checked = $item.prev('li'); } $checked.addClass("active"); this.enable($checked); this._checkoutTab($checked.find('a')); } $item.remove(); $content.children('[name="' + checkedTabId + '"]').remove(); this._updateSetting(checkedTabId); this.tabSize(); this.tabEvent($(".con-tabs"), 'media'); }, btnView: function (status) { // 标签页左右移动按钮状态 var $siteContabs = $('.site-contabs'), $contabsLeftBtn = $siteContabs.children('button.pull-left'), $contabsRightBtn = $siteContabs.find('.pull-right > button.btn-icon'); if (status === 'visible') { $contabsLeftBtn.removeClass('hide'); $contabsRightBtn.removeClass('hide'); } else if (status === 'hide') { $contabsLeftBtn.addClass('hide'); $contabsRightBtn.addClass('hide'); } } }; })(window, document, jQuery);