bodyTab.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. /*
  2. @Author: 请叫我马哥
  3. @Time: 2017-04
  4. @Tittle: tab
  5. @Description: 点击对应按钮添加新窗口
  6. */
  7. var tabFilter,menu=[],liIndex,curNav,delMenu;
  8. layui.define(["element","jquery"],function(exports){
  9. var element = layui.element,
  10. $ = layui.jquery,
  11. layId,
  12. Tab = function(){
  13. this.tabConfig = {
  14. closed : true,
  15. openTabNum : undefined, //最大可打开窗口数量
  16. tabFilter : "bodyTab", //添加窗口的filter
  17. url : undefined //获取菜单json地址
  18. }
  19. };
  20. //获取二级菜单数据
  21. Tab.prototype.render = function() {
  22. var url = this.tabConfig.url;
  23. $.get(url,function(data){
  24. //显示左侧菜单
  25. if($(".navBar").html() == ''){
  26. var _this = this;
  27. $(".navBar").html(navBar(data)).height($(window).height()-245);
  28. element.init(); //初始化页面元素
  29. $(window).resize(function(){
  30. $(".navBar").height($(window).height()-245);
  31. })
  32. let url=$('#top_tabs .layui-this .layui-tab-close').data('url')
  33. if(url){
  34. let a=$('.layui-nav-tree .layui-nav-item').find(`a[data-url="${url}"]`)
  35. a.trigger('click')
  36. if(a.parent().parent().hasClass('layui-nav-child')){
  37. a.parent().parent().parent().addClass('layui-nav-itemed')
  38. }
  39. }else{
  40. $('.layui-nav-tree .layui-nav-item a').eq(0).trigger('click')
  41. }
  42. }
  43. })
  44. }
  45. //参数设置
  46. Tab.prototype.set = function(option) {
  47. var _this = this;
  48. $.extend(true, _this.tabConfig, option);
  49. return _this;
  50. };
  51. //通过title获取lay-id
  52. Tab.prototype.getLayId = function(title){
  53. $(".layui-tab-title.top_tab li").each(function(){
  54. if($(this).find("cite").text() == title){
  55. layId = $(this).attr("lay-id");
  56. }
  57. })
  58. return layId;
  59. }
  60. //通过title判断tab是否存在
  61. Tab.prototype.hasTab = function(title){
  62. var tabIndex = -1;
  63. $(".layui-tab-title.top_tab li").each(function(){
  64. if($(this).find("cite").text() == title){
  65. tabIndex = 1;
  66. }
  67. })
  68. return tabIndex;
  69. }
  70. //右侧内容tab操作
  71. var tabIdIndex = 0;
  72. Tab.prototype.tabAdd = function(_this){
  73. if(window.sessionStorage.getItem("menu")){
  74. menu = JSON.parse(window.sessionStorage.getItem("menu"));
  75. }
  76. var that = this;
  77. var closed = that.tabConfig.closed,
  78. openTabNum = that.tabConfig.openTabNum;
  79. tabFilter = that.tabConfig.tabFilter;
  80. if(_this.attr("target") == "_blank"){
  81. window.location.href = _this.attr("data-url");
  82. }else if(_this.attr("data-url") != undefined){
  83. var title = '';
  84. if(_this.find("i.iconfont,i.layui-icon").attr("data-icon") != undefined){
  85. if(_this.find("i.iconfont").attr("data-icon") != undefined){
  86. title += '<i class="iconfont '+_this.find("i.iconfont").attr("data-icon")+'"></i>';
  87. }else{
  88. title += '<i class="layui-icon">'+_this.find("i.layui-icon").attr("data-icon")+'</i>';
  89. }
  90. }
  91. //已打开的窗口中不存在
  92. if(that.hasTab(_this.find("cite").text()) == -1 && _this.siblings("dl.layui-nav-child").length == 0){
  93. if($(".layui-tab-title.top_tab li").length == openTabNum){
  94. layer.msg('只能同时打开'+openTabNum+'个选项卡哦。不然系统会卡的!');
  95. return;
  96. }
  97. tabIdIndex++;
  98. title += '<cite>'+_this.find("cite").text()+'</cite>';
  99. title += '<i class="layui-icon layui-unselect layui-tab-close" data-id="'+tabIdIndex+'" data-url="'+_this.attr("data-url")+'">&#x1006;</i>';
  100. element.tabAdd(tabFilter, {
  101. title : title,
  102. content :"<iframe src='"+_this.attr("data-url")+"' data-id='"+tabIdIndex+"'></frame>",
  103. id : new Date().getTime()
  104. })
  105. //当前窗口内容
  106. var curmenu = {
  107. "icon" : _this.find("i.iconfont").attr("data-icon")!=undefined ? _this.find("i.iconfont").attr("data-icon") : _this.find("i.layui-icon").attr("data-icon"),
  108. "title" : _this.find("cite").text(),
  109. "href" : _this.attr("data-url"),
  110. "layId" : new Date().getTime()
  111. }
  112. menu.push(curmenu);
  113. window.sessionStorage.setItem("menu",JSON.stringify(menu)); //打开的窗口
  114. window.sessionStorage.setItem("curmenu",JSON.stringify(curmenu)); //当前的窗口
  115. element.tabChange(tabFilter, that.getLayId(_this.find("cite").text()));
  116. that.tabMove(); //顶部窗口是否可滚动
  117. }else{
  118. //当前窗口内容
  119. var curmenu = {
  120. "icon" : _this.find("i.iconfont").attr("data-icon")!=undefined ? _this.find("i.iconfont").attr("data-icon") : _this.find("i.layui-icon").attr("data-icon"),
  121. "title" : _this.find("cite").text(),
  122. "href" : _this.attr("data-url")
  123. }
  124. window.sessionStorage.setItem("curmenu",JSON.stringify(curmenu)); //当前的窗口
  125. element.tabChange(tabFilter, that.getLayId(_this.find("cite").text()));
  126. that.tabMove(); //顶部窗口是否可滚动
  127. }
  128. }
  129. }
  130. //顶部窗口移动
  131. Tab.prototype.tabMove = function(){
  132. $(window).on("resize",function(){
  133. var topTabsBox = $("#top_tabs_box"),
  134. topTabsBoxWidth = $("#top_tabs_box").width(),
  135. topTabs = $("#top_tabs"),
  136. topTabsWidth = $("#top_tabs").width(),
  137. tabLi = topTabs.find("li.layui-this"),
  138. top_tabs = document.getElementById("top_tabs");;
  139. if(topTabsWidth > topTabsBoxWidth){
  140. if(tabLi.position().left > topTabsBoxWidth || tabLi.position().left+topTabsBoxWidth > topTabsWidth){
  141. topTabs.css("left",topTabsBoxWidth-topTabsWidth);
  142. }else{
  143. topTabs.css("left",-tabLi.position().left);
  144. }
  145. //拖动效果
  146. var flag = false;
  147. var cur = {
  148. x:0,
  149. y:0
  150. }
  151. var nx,dx,x ;
  152. function down(){
  153. flag = true;
  154. var touch ;
  155. if(event.touches){
  156. touch = event.touches[0];
  157. }else {
  158. touch = event;
  159. }
  160. cur.x = touch.clientX;
  161. dx = top_tabs.offsetLeft;
  162. }
  163. function move(){
  164. var self=this;
  165. window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
  166. if(flag){
  167. var touch ;
  168. if(event.touches){
  169. touch = event.touches[0];
  170. }else {
  171. touch = event;
  172. }
  173. nx = touch.clientX - cur.x;
  174. x = dx+nx;
  175. if(x > 0){
  176. x = 0;
  177. }else{
  178. if(x < topTabsBoxWidth-topTabsWidth){
  179. x = topTabsBoxWidth-topTabsWidth;
  180. }else{
  181. x = dx+nx;
  182. }
  183. }
  184. top_tabs.style.left = x +"px";
  185. //阻止页面的滑动默认事件
  186. document.addEventListener("touchmove",function(){
  187. event.preventDefault();
  188. },false);
  189. }
  190. }
  191. //鼠标释放时候的函数
  192. function end(){
  193. flag = false;
  194. }
  195. //pc端拖动效果
  196. topTabs.on("mousedown",down);
  197. topTabs.on("mousemove",move);
  198. $(document).on("mouseup",end);
  199. //移动端拖动效果
  200. topTabs.on("touchstart",down);
  201. topTabs.on("touchmove",move);
  202. topTabs.on("touchend",end);
  203. }else{
  204. //移除pc端拖动效果
  205. topTabs.off("mousedown",down);
  206. topTabs.off("mousemove",move);
  207. topTabs.off("mouseup",end);
  208. //移除移动端拖动效果
  209. topTabs.off("touchstart",down);
  210. topTabs.off("touchmove",move);
  211. topTabs.off("touchend",end);
  212. topTabs.removeAttr("style");
  213. return false;
  214. }
  215. }).resize();
  216. }
  217. $("body").on("click",".top_tab li",function(){
  218. //切换后获取当前窗口的内容
  219. var curmenu = '';
  220. var menu = JSON.parse(window.sessionStorage.getItem("menu"));
  221. if(window.sessionStorage.getItem("menu")){
  222. curmenu = menu[$(this).index()-1];
  223. }
  224. if($(this).index() == 0){
  225. window.sessionStorage.setItem("curmenu",'');
  226. }else{
  227. window.sessionStorage.setItem("curmenu",JSON.stringify(curmenu));
  228. if(window.sessionStorage.getItem("curmenu") == "undefined"){
  229. //如果删除的不是当前选中的tab,则将curmenu设置成当前选中的tab
  230. if(curNav != JSON.stringify(delMenu)){
  231. window.sessionStorage.setItem("curmenu",curNav);
  232. }else{
  233. window.sessionStorage.setItem("curmenu",JSON.stringify(menu[liIndex-1]));
  234. }
  235. }
  236. }
  237. element.tabChange(tabFilter,$(this).attr("lay-id")).init();
  238. // new Tab().tabMove();
  239. })
  240. //删除tab
  241. $("body").on("click",".top_tab li i.layui-tab-close",function(){
  242. //删除tab后重置session中的menu和curmenu
  243. liIndex = $(this).parent("li").index();
  244. var menu = JSON.parse(window.sessionStorage.getItem("menu"));
  245. //获取被删除元素
  246. delMenu = menu[liIndex-1];
  247. var curmenu = window.sessionStorage.getItem("curmenu")=="undefined" ? undefined : window.sessionStorage.getItem("curmenu")=="" ? '' : JSON.parse(window.sessionStorage.getItem("curmenu"));
  248. if(JSON.stringify(curmenu) != JSON.stringify(menu[liIndex-1])){ //如果删除的不是当前选中的tab
  249. // window.sessionStorage.setItem("curmenu",JSON.stringify(curmenu));
  250. curNav = JSON.stringify(curmenu);
  251. }else{
  252. if($(this).parent("li").length > liIndex){
  253. window.sessionStorage.setItem("curmenu",curmenu);
  254. curNav = curmenu;
  255. }else{
  256. window.sessionStorage.setItem("curmenu",JSON.stringify(menu[liIndex-1]));
  257. curNav = JSON.stringify(menu[liIndex-1]);
  258. }
  259. }
  260. menu.splice((liIndex-1), 1);
  261. window.sessionStorage.setItem("menu",JSON.stringify(menu));
  262. element.tabDelete("bodyTab",$(this).parent("li").attr("lay-id")).init();
  263. new Tab().tabMove();
  264. })
  265. var bodyTab = new Tab();
  266. exports("bodyTab",function(option){
  267. return bodyTab.set(option);
  268. });
  269. })