/** * 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('