123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490 |
- /**
- * 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('<li class="active"><a href="' + tabUrl + '" target="' + tabName +
- '" title="' + opt.name + '' + '" rel="contents"><span>' + opt.name + '</span><i class="icon' +
- ' wb-close-mini">' + '</i></a></li>');
- 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('<iframe src="' + url + '" frameborder="0" name="' + iframeName + '" class="page-frame animation-fade active"></iframe>');
- $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);
|