郑许地铁

bodyTab.js 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. /*
  2. @Author: 驊驊龔頾
  3. @Time: 2017-10
  4. @Tittle: bodyTab
  5. @Description: 点击对应按钮添加新窗口
  6. */
  7. var tabFilter,menu=[],liIndex,curNav,delMenu,
  8. changeRefreshStr = window.sessionStorage.getItem("changeRefresh");
  9. layui.define(["element","jquery"],function(exports){
  10. var element = layui.element,
  11. $ = layui.$,
  12. layId,
  13. Tab = function(){
  14. this.tabConfig = {
  15. openTabNum : undefined, //最大可打开窗口数量
  16. tabFilter : "bodyTab", //添加窗口的filter
  17. url : undefined //获取菜单json地址
  18. }
  19. };
  20. //生成左侧菜单
  21. Tab.prototype.navBar = function(strData){
  22. var data;
  23. if(typeof(strData) == "string"){
  24. var data = JSON.parse(strData); //部分用户解析出来的是字符串,转换一下
  25. }else{
  26. data = strData;
  27. }
  28. var ulHtml = '';
  29. for(var i=0;i<data.length;i++){
  30. if(data[i].spread || data[i].spread == undefined){
  31. ulHtml += '<li class="layui-nav-item layui-nav-itemed">';
  32. }else{
  33. ulHtml += '<li class="layui-nav-item">';
  34. }
  35. if(data[i].children != undefined && data[i].children.length > 0){
  36. ulHtml += '<a>';
  37. if(data[i].icon != undefined && data[i].icon != ''){
  38. if(data[i].icon.indexOf("icon-") != -1){
  39. ulHtml += '<i class="seraph '+data[i].icon+'" data-icon="'+data[i].icon+'"></i>';
  40. }else{
  41. ulHtml += '<i class="layui-icon" data-icon="'+data[i].icon+'">'+data[i].icon+'</i>';
  42. }
  43. }
  44. ulHtml += '<cite openid=' + data[i].openid + '>'+data[i].title+'</cite>';
  45. ulHtml += '<span class="layui-nav-more"></span>';
  46. ulHtml += '</a>';
  47. ulHtml += '<dl class="layui-nav-child">';
  48. for(var j=0;j<data[i].children.length;j++){
  49. if(data[i].children[j].target == "_blank"){
  50. ulHtml += '<dd><a data-url="'+data[i].children[j].href+'" target="'+data[i].children[j].target+'">';
  51. }else{
  52. ulHtml += '<dd><a data-url="'+data[i].children[j].href+'">';
  53. }
  54. if(data[i].children[j].icon != undefined && data[i].children[j].icon != ''){
  55. if(data[i].children[j].icon.indexOf("icon-") != -1){
  56. ulHtml += '<i class="seraph '+data[i].children[j].icon+'" data-icon="'+data[i].children[j].icon+'"></i>';
  57. }else{
  58. ulHtml += '<i class="layui-icon" data-icon="'+data[i].children[j].icon+'">'+data[i].children[j].icon+'</i>';
  59. }
  60. }
  61. ulHtml += '<cite openid=' + data[i].openid + '>'+data[i].children[j].title+'</cite></a></dd>';
  62. }
  63. ulHtml += "</dl>";
  64. }else{
  65. if(data[i].target == "_blank"){
  66. ulHtml += '<a data-url="'+data[i].href+'" target="'+data[i].target+'">';
  67. }else{
  68. ulHtml += '<a data-url="'+data[i].href+'">';
  69. }
  70. if(data[i].icon != undefined && data[i].icon != ''){
  71. if(data[i].icon.indexOf("icon-") != -1){
  72. ulHtml += '<i class="seraph '+data[i].icon+'" data-icon="'+data[i].icon+'"></i>';
  73. }else{
  74. ulHtml += '<i class="layui-icon" data-icon="'+data[i].icon+'">'+data[i].icon+'</i>';
  75. }
  76. }
  77. ulHtml += '<cite openid=' + data[i].openid + '>'+data[i].title+'</cite></a>';
  78. }
  79. ulHtml += '</li>';
  80. }
  81. return ulHtml;
  82. }
  83. //获取二级菜单数据
  84. Tab.prototype.render = function() {
  85. //显示左侧菜单
  86. var _this = this;
  87. //左侧固定一个选项
  88. $(".navBar ul").append(_this.navBar(dataStr));
  89. element.render(); //初始化页面元素
  90. $(window).resize(function(){
  91. // $(".navBar").height($(window).height()-210);
  92. })
  93. }
  94. //是否点击窗口切换刷新页面
  95. Tab.prototype.changeRegresh = function(index){
  96. if(changeRefreshStr == "true"){
  97. $(".clildFrame .layui-tab-item").eq(index).find("iframe")[0].contentWindow.location.reload();
  98. }
  99. }
  100. //参数设置
  101. Tab.prototype.set = function(option) {
  102. var _this = this;
  103. $.extend(true, _this.tabConfig, option);
  104. return _this;
  105. };
  106. //通过openid获取lay-id
  107. Tab.prototype.getLayId = function(openid){
  108. $("#top_tabs li").each(function(){
  109. if($(this).find("cite").attr('openid') == openid){
  110. layId = $(this).attr("lay-id");
  111. }
  112. })
  113. return layId;
  114. }
  115. //通过openid判断tab是否存在
  116. Tab.prototype.hasTab = function(openid){
  117. var tabIndex = -1;
  118. $("#top_tabs li").each(function(){
  119. if($(this).find("cite").attr('openid') == openid){
  120. tabIndex = 1;
  121. }
  122. })
  123. return tabIndex;
  124. }
  125. //右侧内容tab操作
  126. var tabIdIndex = 0;
  127. Tab.prototype.tabAdd = function(_this){
  128. if(window.sessionStorage.getItem("menu")){
  129. menu = JSON.parse(window.sessionStorage.getItem("menu"));
  130. }
  131. var that = this;
  132. var openTabNum = that.tabConfig.openTabNum;
  133. tabFilter = that.tabConfig.tabFilter;
  134. if(_this.attr("target") == "_blank"){
  135. window.open(_this.attr("data-url"));
  136. }else if(_this.attr("data-url") != undefined){
  137. var title = '';
  138. // if(_this.find("i.seraph,i.layui-icon").attr("data-icon") != undefined){
  139. // if(_this.find("i.seraph").attr("data-icon") != undefined){
  140. // title += '<i class="seraph '+_this.find("i.seraph").attr("data-icon")+'"></i>';
  141. // }else{
  142. // title += '<i class="layui-icon">'+_this.find("i.layui-icon").attr("data-icon")+'</i>';
  143. // }
  144. // }
  145. //已打开的窗口中不存在
  146. if(that.hasTab(_this.find("cite").attr('openid')) == -1 && _this.siblings("dl.layui-nav-child").length == 0){
  147. if($(".layui-tab-title.top_tab li").length == openTabNum){
  148. layer.msg('只能同时打开'+openTabNum+'个选项卡哦。不然系统会卡的!');
  149. return;
  150. }
  151. tabIdIndex++;
  152. title += '<cite openid=' + _this.find("cite").attr('openid') + '>'+_this.find("cite").text()+'</cite>';
  153. title += '<i class="layui-icon layui-unselect layui-tab-close" data-id="'+tabIdIndex+'">&#x1006;</i>';
  154. element.tabAdd(tabFilter, {
  155. title : title,
  156. content :"<iframe src='"+_this.attr("data-url")+"' data-id='"+tabIdIndex+"'></frame>",
  157. id : new Date().getTime()
  158. })
  159. //当前窗口内容
  160. var curmenu = {
  161. // "icon" : _this.find("i.seraph").attr("data-icon")!=undefined ? _this.find("i.seraph").attr("data-icon") : _this.find("i.layui-icon").attr("data-icon"),
  162. "title" : _this.find("cite").text(),
  163. "openid" : _this.find("cite").attr('openid'),
  164. "href" : _this.attr("data-url"),
  165. "layId" : new Date().getTime()
  166. }
  167. menu.push(curmenu);
  168. window.sessionStorage.setItem("menu",JSON.stringify(menu)); //打开的窗口
  169. window.sessionStorage.setItem("curmenu",JSON.stringify(curmenu)); //当前的窗口
  170. element.tabChange(tabFilter, that.getLayId(_this.find("cite").attr('openid')));
  171. that.tabMove(); //顶部窗口是否可滚动
  172. }else{
  173. //当前窗口内容
  174. var curmenu = {
  175. // "icon" : _this.find("i.seraph").attr("data-icon")!=undefined ? _this.find("i.seraph").attr("data-icon") : _this.find("i.layui-icon").attr("data-icon"),
  176. "title" : _this.find("cite").text(),
  177. "openid" : _this.find("cite").attr('openid'),
  178. "href" : _this.attr("data-url")
  179. }
  180. that.changeRegresh(_this.parent('.layui-nav-item').index());
  181. window.sessionStorage.setItem("curmenu", JSON.stringify(curmenu)); //当前的窗口
  182. element.tabChange(tabFilter, that.getLayId(_this.find("cite").attr('openid')));
  183. that.tabMove(); //顶部窗口是否可滚动
  184. }
  185. }
  186. }
  187. //顶部窗口移动
  188. Tab.prototype.tabMove = function(){
  189. $(window).on("resize",function(event){
  190. var topTabsBox = $("#top_tabs_box"),
  191. topTabsBoxWidth = $("#top_tabs_box").width(),
  192. topTabs = $("#top_tabs"),
  193. topTabsWidth = $("#top_tabs").width(),
  194. tabLi = topTabs.find("li.layui-this"),
  195. top_tabs = document.getElementById("top_tabs"),
  196. event = event || window.event;
  197. if(topTabsWidth > topTabsBoxWidth){
  198. if(tabLi.position().left > topTabsBoxWidth || tabLi.position().left+topTabsBoxWidth > topTabsWidth){
  199. topTabs.css("left",topTabsBoxWidth-topTabsWidth);
  200. }else{
  201. topTabs.css("left",-tabLi.position().left);
  202. }
  203. //拖动效果
  204. var flag = false;
  205. var cur = {
  206. x:0,
  207. y:0
  208. }
  209. var nx,dx,x ;
  210. function down(){
  211. flag = true;
  212. var touch ;
  213. if(event.touches){
  214. touch = event.touches[0];
  215. }else {
  216. touch = event;
  217. }
  218. cur.x = touch.clientX;
  219. dx = top_tabs.offsetLeft;
  220. }
  221. function move(){
  222. var self = this;
  223. if(flag){
  224. window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
  225. var touch ;
  226. if(event.touches){
  227. touch = event.touches[0];
  228. }else {
  229. touch = event;
  230. }
  231. nx = touch.clientX - cur.x;
  232. x = dx+nx;
  233. if(x > 0){
  234. x = 0;
  235. }else{
  236. if(x < topTabsBoxWidth-topTabsWidth){
  237. x = topTabsBoxWidth-topTabsWidth;
  238. }else{
  239. x = dx+nx;
  240. }
  241. }
  242. top_tabs.style.left = x +"px";
  243. //阻止页面的滑动默认事件
  244. document.addEventListener("touchmove",function(){
  245. event.preventDefault();
  246. },false);
  247. }
  248. }
  249. //鼠标释放时候的函数
  250. function end(){
  251. flag = false;
  252. }
  253. //pc端拖动效果
  254. topTabs.on("mousedown",down);
  255. topTabs.on("mousemove",move);
  256. $(document).on("mouseup",end);
  257. //移动端拖动效果
  258. topTabs.on("touchstart",down);
  259. topTabs.on("touchmove",move);
  260. topTabs.on("touchend",end);
  261. }else{
  262. //移除pc端拖动效果
  263. topTabs.off("mousedown",down);
  264. topTabs.off("mousemove",move);
  265. topTabs.off("mouseup",end);
  266. //移除移动端拖动效果
  267. topTabs.off("touchstart",down);
  268. topTabs.off("touchmove",move);
  269. topTabs.off("touchend",end);
  270. topTabs.removeAttr("style");
  271. return false;
  272. }
  273. }).resize();
  274. }
  275. //切换后获取当前窗口的内容
  276. $("body").on("click",".top_tab li",function(){
  277. var curmenu = '';
  278. var menu = JSON.parse(window.sessionStorage.getItem("menu"));
  279. if(window.sessionStorage.getItem("menu")) {
  280. curmenu = menu[$(this).index() - 1];
  281. }
  282. if($(this).index() == 0){
  283. window.sessionStorage.setItem("curmenu",'');
  284. }else{
  285. window.sessionStorage.setItem("curmenu",JSON.stringify(curmenu));
  286. if(window.sessionStorage.getItem("curmenu") == "undefined"){
  287. //如果删除的不是当前选中的tab,则将curmenu设置成当前选中的tab
  288. if(curNav != JSON.stringify(delMenu)){
  289. window.sessionStorage.setItem("curmenu",curNav);
  290. }else{
  291. window.sessionStorage.setItem("curmenu",JSON.stringify(menu[liIndex-1]));
  292. }
  293. }
  294. }
  295. element.tabChange(tabFilter,$(this).attr("lay-id")).render();
  296. bodyTab.changeRegresh($(this).index());
  297. setTimeout(function(){
  298. bodyTab.tabMove();
  299. },100);
  300. })
  301. //删除tab
  302. $("body").on("click",".top_tab li i.layui-tab-close",function(){
  303. //删除tab后重置session中的menu和curmenu
  304. liIndex = $(this).parent("li").index();
  305. var menu = JSON.parse(window.sessionStorage.getItem("menu"));
  306. if(menu != null) {
  307. //获取被删除元素
  308. delMenu = menu[liIndex - 1];
  309. var curmenu = window.sessionStorage.getItem("curmenu") == "undefined" ? undefined : window.sessionStorage.getItem("curmenu") == "" ? '' : JSON.parse(window.sessionStorage.getItem("curmenu"));
  310. if (JSON.stringify(curmenu) != JSON.stringify(menu[liIndex - 1])) { //如果删除的不是当前选中的tab
  311. // window.sessionStorage.setItem("curmenu",JSON.stringify(curmenu));
  312. curNav = JSON.stringify(curmenu);
  313. } else {
  314. if ($(this).parent("li").length > liIndex) {
  315. window.sessionStorage.setItem("curmenu", curmenu);
  316. curNav = curmenu;
  317. } else {
  318. window.sessionStorage.setItem("curmenu", JSON.stringify(menu[liIndex - 1]));
  319. curNav = JSON.stringify(menu[liIndex - 1]);
  320. }
  321. }
  322. menu.splice((liIndex - 1), 1);
  323. window.sessionStorage.setItem("menu", JSON.stringify(menu));
  324. }
  325. element.tabDelete("bodyTab",$(this).parent("li").attr("lay-id")).render();
  326. bodyTab.tabMove();
  327. })
  328. //刷新当前
  329. $(".refresh").on("click",function(){ //此处添加禁止连续点击刷新一是为了降低服务器压力,另外一个就是为了防止超快点击造成chrome本身的一些js文件的报错(不过貌似这个问题还是存在,不过概率小了很多)
  330. if($(this).hasClass("refreshThis")){
  331. $(this).removeClass("refreshThis");
  332. $(".clildFrame .layui-tab-item.layui-show").find("iframe")[0].contentWindow.location.reload();
  333. setTimeout(function(){
  334. $(".refresh").addClass("refreshThis");
  335. },2000)
  336. }else{
  337. layer.msg("您点击的速度超过了服务器的响应速度,还是等两秒再刷新吧!");
  338. }
  339. })
  340. //关闭其他
  341. $(".closePageOther").on("click",function(){
  342. //判断打开有两个以上的窗体并且 不是定位到 后台首页
  343. if($("#top_tabs li").length>2 && $("#top_tabs li.layui-this cite").text()!="后台首页"){
  344. var menu = JSON.parse(window.sessionStorage.getItem("menu"));
  345. $("#top_tabs li").each(function(){
  346. if($(this).attr("lay-id") != '' && !$(this).hasClass("layui-this")){
  347. element.tabDelete("bodyTab",$(this).attr("lay-id")).render();
  348. //此处将当前窗口重新获取放入session,避免一个个删除来回循环造成的不必要工作量
  349. for(var i=0;i<menu.length;i++){
  350. if($("#top_tabs li.layui-this cite").text() == menu[i].title){
  351. menu.splice(0,menu.length,menu[i]);
  352. window.sessionStorage.setItem("menu",JSON.stringify(menu));
  353. }
  354. }
  355. }
  356. })
  357. //判断定位的是 后台首页 并且至少打开了两个以上的 窗体
  358. }else if($("#top_tabs li.layui-this cite").text()=="后台首页" && $("#top_tabs li").length>1){
  359. $("#top_tabs li").each(function(){
  360. if($(this).attr("lay-id") != '' && !$(this).hasClass("layui-this")){
  361. element.tabDelete("bodyTab",$(this).attr("lay-id")).render();
  362. window.sessionStorage.removeItem("menu");
  363. menu = [];
  364. window.sessionStorage.removeItem("curmenu");
  365. }
  366. })
  367. }else{
  368. layer.msg("没有可以关闭的窗口了@_@");
  369. }
  370. //渲染顶部窗口
  371. tab.tabMove();
  372. })
  373. //关闭全部
  374. $(".closePageAll").on("click",function(){
  375. if($("#top_tabs li").length > 1){
  376. $("#top_tabs li").each(function(){
  377. if($(this).attr("lay-id") != ''){
  378. element.tabDelete("bodyTab",$(this).attr("lay-id")).render();
  379. window.sessionStorage.removeItem("menu");
  380. menu = [];
  381. window.sessionStorage.removeItem("curmenu");
  382. }
  383. })
  384. }else{
  385. layer.msg("没有可以关闭的窗口了@_@");
  386. }
  387. //渲染顶部窗口
  388. tab.tabMove();
  389. })
  390. var bodyTab = new Tab();
  391. exports("bodyTab",function(option){
  392. return bodyTab.set(option);
  393. });
  394. })