index.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. /** EasyWeb iframe v3.1.8 date:2020-05-04 License By http://easyweb.vip */
  2. layui.define(['layer', 'element', 'admin'], function (exports) {
  3. var $ = layui.jquery;
  4. var layer = layui.layer;
  5. var element = layui.element;
  6. var admin = layui.admin;
  7. var setter = admin.setter;
  8. var headerDOM = '.layui-layout-admin>.layui-header';
  9. var sideDOM = '.layui-layout-admin>.layui-side>.layui-side-scroll';
  10. var bodyDOM = '.layui-layout-admin>.layui-body';
  11. var tabDOM = bodyDOM + '>.layui-tab';
  12. var titleDOM = bodyDOM + '>.layui-body-header';
  13. var tabFilter = 'admin-pagetabs';
  14. var navFilter = 'admin-side-nav';
  15. var tabEndCall = {}; // Tab关闭的事件回调
  16. var mIsAddTab = false; // 是否是添加Tab,添加Tab的时候切换不自动刷新
  17. var index = {homeUrl: undefined, mTabPosition: undefined, mTabList: []};
  18. /** 渲染主体部分 */
  19. index.loadView = function (param) {
  20. if (!param.menuPath) return layer.msg('url不能为空', {icon: 2, anim: 6});
  21. if (setter.pageTabs) { // 多标签模式
  22. var flag; // 选项卡是否已添加
  23. $(tabDOM + '>.layui-tab-title>li').each(function () {
  24. if ($(this).attr('lay-id') === param.menuPath) flag = true;
  25. });
  26. if (!flag) { // 添加选项卡
  27. if (index.mTabList.length + 1 >= setter.maxTabNum) {
  28. layer.msg('最多打开' + setter.maxTabNum + '个选项卡', {icon: 2, anim: 6});
  29. return admin.activeNav(index.mTabPosition);
  30. }
  31. mIsAddTab = true;
  32. element.tabAdd(tabFilter, {
  33. id: param.menuPath, title: '<span class="title">' + (param.menuName || '') + '</span>',
  34. content: '<iframe class="admin-iframe" lay-id="./' + param.menuPath + '" src="./' + param.menuPath +
  35. '" onload="layui.index.hideLoading(this);" frameborder="0"></iframe>'
  36. });
  37. admin.showLoading({elem: $('iframe[lay-id="' + param.menuPath + '"]').parent(), size: ''});
  38. if (param.menuPath !== index.homeUrl) index.mTabList.push(param); // 记录tab
  39. if (setter.cacheTab) admin.putTempData('indexTabs', index.mTabList); // 缓存tab
  40. }
  41. if (!param.noChange) element.tabChange(tabFilter, param.menuPath); // 切换到此tab
  42. } else { // 单标签模式
  43. admin.activeNav(param.menuPath);
  44. var $contentDom = $(bodyDOM + '>div>.admin-iframe');
  45. if ($contentDom.length === 0) {
  46. $(bodyDOM).html([
  47. '<div class="layui-body-header">',
  48. ' <span class="layui-body-header-title"></span>',
  49. ' <span class="layui-breadcrumb pull-right" lay-filter="admin-body-breadcrumb" style="visibility: visible;"></span>',
  50. '</div>',
  51. '<div style="-webkit-overflow-scrolling: touch;">',
  52. ' <iframe class="admin-iframe" lay-id="', param.menuPath, '" src="', param.menuPath, '"',
  53. ' onload="layui.index.hideLoading(this);" frameborder="0"></iframe>',
  54. '</div>'].join(''));
  55. admin.showLoading({elem: $('iframe[lay-id="' + param.menuPath + '"]').parent(), size: ''});
  56. } else {
  57. admin.showLoading({elem: $contentDom.parent(), size: ''});
  58. $contentDom.attr('lay-id', param.menuPath).attr('src', param.menuPath);
  59. }
  60. $('[lay-filter="admin-body-breadcrumb"]').html(index.getBreadcrumbHtml(param.menuPath));
  61. index.mTabList.splice(0, index.mTabList.length);
  62. if (param.menuPath === index.homeUrl) {
  63. index.mTabPosition = undefined;
  64. index.setTabTitle($(param.menuName).text() || $(sideDOM + ' [lay-href="' + index.homeUrl + '"]').text() || '主页');
  65. } else {
  66. index.mTabPosition = param.menuPath;
  67. index.mTabList.push(param);
  68. index.setTabTitle(param.menuName);
  69. }
  70. if (!setter.cacheTab) return;
  71. admin.putTempData('indexTabs', index.mTabList);
  72. admin.putTempData('tabPosition', index.mTabPosition);
  73. }
  74. if (admin.getPageWidth() <= 768) admin.flexible(true); // 移动端自动收起侧导航
  75. };
  76. /** 加载主页 */
  77. index.loadHome = function (param) {
  78. var cacheTabs = admin.getTempData('indexTabs'); // 获取缓存tab
  79. var cachePosition = admin.getTempData('tabPosition');
  80. var recover = (param.loadSetting === undefined || param.loadSetting) && (setter.cacheTab && cacheTabs && cacheTabs.length > 0);
  81. index.homeUrl = param.menuPath;
  82. param.noChange = cachePosition ? recover : false;
  83. if (setter.pageTabs || !recover) index.loadView(param);
  84. if (recover) { // 恢复缓存tab
  85. for (var i = 0; i < cacheTabs.length; i++) {
  86. cacheTabs[i].noChange = cacheTabs[i].menuPath !== cachePosition;
  87. if (!cacheTabs[i].noChange || (setter.pageTabs && !param.onlyLast)) index.loadView(cacheTabs[i]);
  88. }
  89. }
  90. admin.removeLoading(undefined, false);
  91. };
  92. /** 打开tab */
  93. index.openTab = function (param) {
  94. if (window !== top && !admin.isTop() && top.layui && top.layui.index) return top.layui.index.openTab(param);
  95. if (param.end) tabEndCall[param.url] = param.end;
  96. index.loadView({menuPath: param.url, menuName: param.title});
  97. };
  98. /** 关闭tab */
  99. index.closeTab = function (url) {
  100. if (window !== top && !admin.isTop() && top.layui && top.layui.index) return top.layui.index.closeTab(url);
  101. element.tabDelete(tabFilter, url);
  102. };
  103. /** 设置是否记忆Tab */
  104. index.setTabCache = function (isCache) {
  105. if (window !== top && !admin.isTop() && top.layui && top.layui.index) return top.layui.index.setTabCache(isCache);
  106. admin.putSetting('cacheTab', isCache);
  107. if (!isCache) return index.clearTabCache();
  108. admin.putTempData('indexTabs', index.mTabList);
  109. admin.putTempData('tabPosition', index.mTabPosition);
  110. };
  111. /** 清除tab记忆 */
  112. index.clearTabCache = function () {
  113. admin.putTempData('indexTabs', null);
  114. admin.putTempData('tabPosition', null);
  115. };
  116. /** 设置tab标题 */
  117. index.setTabTitle = function (title, tabId) {
  118. if (window !== top && !admin.isTop() && top.layui && top.layui.index) return top.layui.index.setTabTitle(title, tabId);
  119. if (setter.pageTabs) {
  120. if (!tabId) tabId = $(tabDOM + '>.layui-tab-title>li.layui-this').attr('lay-id');
  121. if (tabId) $(tabDOM + '>.layui-tab-title>li[lay-id="' + tabId + '"] .title').html(title || '');
  122. } else if (title) {
  123. $(titleDOM + '>.layui-body-header-title').html(title);
  124. $(titleDOM).addClass('show');
  125. $(headerDOM).css('box-shadow', '0 1px 0 0 rgba(0, 0, 0, .03)');
  126. } else {
  127. $(titleDOM).removeClass('show');
  128. $(headerDOM).css('box-shadow', '');
  129. }
  130. };
  131. /** 自定义tab标题 */
  132. index.setTabTitleHtml = function (html) {
  133. if (window !== top && !admin.isTop() && top.layui && top.layui.index) return top.layui.index.setTabTitleHtml(html);
  134. if (setter.pageTabs) return;
  135. if (!html) return $(titleDOM).removeClass('show');
  136. $(titleDOM).html(html);
  137. $(titleDOM).addClass('show');
  138. };
  139. /** 获取面包屑 */
  140. index.getBreadcrumb = function (tabId) {
  141. if (!tabId) tabId = $(bodyDOM + '>div>.admin-iframe').attr('lay-id');
  142. var breadcrumb = [];
  143. var $href = $(sideDOM).find('[lay-href="' + tabId + '"]');
  144. if ($href.length > 0) breadcrumb.push($href.text().replace(/(^\s*)|(\s*$)/g, ''));
  145. while (true) {
  146. $href = $href.parent('dd').parent('dl').prev('a');
  147. if ($href.length === 0) break;
  148. breadcrumb.unshift($href.text().replace(/(^\s*)|(\s*$)/g, ''));
  149. }
  150. return breadcrumb;
  151. };
  152. /** 获取面包屑结构 */
  153. index.getBreadcrumbHtml = function (tabId) {
  154. var breadcrumb = index.getBreadcrumb(tabId);
  155. var htmlStr = tabId === index.homeUrl ? '' : ('<a ew-href="' + index.homeUrl + '">首页</a>');
  156. for (var i = 0; i < breadcrumb.length - 1; i++) {
  157. if (htmlStr) htmlStr += '<span lay-separator="">/</span>';
  158. htmlStr += ('<a><cite>' + breadcrumb[i] + '</cite></a>');
  159. }
  160. return htmlStr;
  161. };
  162. /** 关闭loading */
  163. index.hideLoading = function (url) {
  164. if (typeof url !== 'string') url = $(url).attr('lay-id');
  165. admin.removeLoading($('iframe[lay-id="' + url + '"],' + bodyDOM + ' iframe[lay-id]').parent(), false);
  166. };
  167. /** 移动设备遮罩层 */
  168. var siteShadeDom = '.layui-layout-admin .site-mobile-shade';
  169. if ($(siteShadeDom).length === 0) $('.layui-layout-admin').append('<div class="site-mobile-shade"></div>');
  170. $(siteShadeDom).click(function () {
  171. admin.flexible(true);
  172. });
  173. /** 补充tab的dom */
  174. if (setter.pageTabs && $(tabDOM).length === 0) {
  175. $(bodyDOM).html([
  176. '<div class="layui-tab" lay-allowClose="true" lay-filter="', tabFilter, '" lay-autoRefresh="', setter.tabAutoRefresh == 'true', '">',
  177. ' <ul class="layui-tab-title"></ul><div class="layui-tab-content"></div>',
  178. '</div>',
  179. '<div class="layui-icon admin-tabs-control layui-icon-prev" ew-event="leftPage"></div>',
  180. '<div class="layui-icon admin-tabs-control layui-icon-next" ew-event="rightPage"></div>',
  181. '<div class="layui-icon admin-tabs-control layui-icon-down">',
  182. ' <ul class="layui-nav" lay-filter="admin-pagetabs-nav">',
  183. ' <li class="layui-nav-item" lay-unselect>',
  184. ' <dl class="layui-nav-child layui-anim-fadein">',
  185. ' <dd ew-event="closeThisTabs" lay-unselect><a>关闭当前标签页</a></dd>',
  186. ' <dd ew-event="closeOtherTabs" lay-unselect><a>关闭其它标签页</a></dd>',
  187. ' <dd ew-event="closeAllTabs" lay-unselect><a>关闭全部标签页</a></dd>',
  188. ' </dl>',
  189. ' </li>',
  190. ' </ul>',
  191. '</div>'
  192. ].join(''));
  193. element.render('nav', 'admin-pagetabs-nav');
  194. }
  195. /** 侧导航点击监听 */
  196. element.on('nav(' + navFilter + ')', function (elem) {
  197. var $that = $(elem);
  198. var href = $that.attr('lay-href');
  199. if (!href || href === '#') return;
  200. if (href.indexOf('javascript:') === 0) return new Function(href.substring(11))();
  201. var name = $that.attr('ew-title') || $that.text().replace(/(^\s*)|(\s*$)/g, '');
  202. var end = $that.attr('ew-end');
  203. try {
  204. if (end) end = new Function(end);
  205. else end = undefined;
  206. } catch (e) {
  207. console.error(e);
  208. }
  209. index.openTab({url: href, title: name, end: end});
  210. layui.event.call(this, 'admin', 'side({*})', {href: href});
  211. });
  212. /** tab切换监听 */
  213. element.on('tab(' + tabFilter + ')', function () {
  214. var layId = $(this).attr('lay-id');
  215. index.mTabPosition = (layId !== index.homeUrl ? layId : undefined); // 记录当前Tab位置
  216. if (setter.cacheTab) admin.putTempData('tabPosition', index.mTabPosition);
  217. admin.activeNav(layId);
  218. admin.rollPage('auto');
  219. if ($(tabDOM).attr('lay-autoRefresh') == 'true' && !mIsAddTab) admin.refresh(layId, true); // 切换tab刷新
  220. mIsAddTab = false;
  221. layui.event.call(this, 'admin', 'tab({*})', {layId: layId});
  222. // 处理标题缓存
  223. var title = $(this).find('.title').text();
  224. localStorage.title = title;
  225. });
  226. /** tab删除监听 */
  227. element.on('tabDelete(' + tabFilter + ')', function (data) {
  228. var mTab = index.mTabList[data.index - 1];
  229. if (mTab) {
  230. index.mTabList.splice(data.index - 1, 1);
  231. if (setter.cacheTab) admin.putTempData('indexTabs', index.mTabList);
  232. tabEndCall[mTab.menuPath] && tabEndCall[mTab.menuPath].call();
  233. layui.event.call(this, 'admin', 'tabDelete({*})', {layId: mTab.menuPath});
  234. }
  235. if ($(tabDOM + '>.layui-tab-title>li.layui-this').length === 0)
  236. $(tabDOM + '>.layui-tab-title>li:last').trigger('click'); // 解决删除后可能无选中bug
  237. });
  238. /** 多系统切换事件 */
  239. $(document).off('click.navMore').on('click.navMore', '[nav-bind]', function () {
  240. var navId = $(this).attr('nav-bind');
  241. $('ul[lay-filter="' + navFilter + '"]').addClass('layui-hide');
  242. $('ul[nav-id="' + navId + '"]').removeClass('layui-hide');
  243. $(headerDOM + '>.layui-nav .layui-nav-item').removeClass('layui-this');
  244. $(this).parent('.layui-nav-item').addClass('layui-this');
  245. if (admin.getPageWidth() <= 768) admin.flexible(false); // 展开侧边栏
  246. layui.event.call(this, 'admin', 'nav({*})', {navId: navId});
  247. });
  248. /** 开启Tab右键菜单 */
  249. if (setter.openTabCtxMenu && setter.pageTabs) {
  250. layui.use('contextMenu', function () {
  251. if (!layui.contextMenu) return;
  252. $(tabDOM + '>.layui-tab-title').off('contextmenu.tab').on('contextmenu.tab', 'li', function (e) {
  253. var layId = $(this).attr('lay-id');
  254. layui.contextMenu.show([{
  255. icon: 'layui-icon layui-icon-refresh',
  256. name: '刷新当前',
  257. click: function () {
  258. element.tabChange(tabFilter, layId);
  259. if ('true' != $(tabDOM).attr('lay-autoRefresh')) admin.refresh(layId);
  260. }
  261. }, {
  262. icon: 'layui-icon layui-icon-close-fill ctx-ic-lg',
  263. name: '关闭当前',
  264. click: function () {
  265. admin.closeThisTabs(layId);
  266. }
  267. }, {
  268. icon: 'layui-icon layui-icon-unlink',
  269. name: '关闭其他',
  270. click: function () {
  271. admin.closeOtherTabs(layId);
  272. }
  273. }, {
  274. icon: 'layui-icon layui-icon-close ctx-ic-lg',
  275. name: '关闭全部',
  276. click: function () {
  277. admin.closeAllTabs();
  278. }
  279. }], e.clientX, e.clientY);
  280. return false;
  281. });
  282. });
  283. }
  284. exports('index', index);
  285. });