tab.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. define(['jquery', 'layui'], function($, layui) {
  2. "use strict";
  3. var tabs = layui.tabs;
  4. var pearTab = function(opt) {
  5. this.option = opt;
  6. };
  7. var tabData = new Array();
  8. var tabDataCurrent = 0;
  9. var contextTabDOM;
  10. pearTab.render = function(opt) {
  11. var option = {
  12. container: opt.container,
  13. elem: opt.elem,
  14. data: opt.data,
  15. tool: opt.tool,
  16. roll: opt.roll,
  17. index: opt.index,
  18. width: opt.width,
  19. height: opt.height,
  20. tabMax: opt.tabMax,
  21. session: opt.session ? opt.session : false,
  22. preload: opt.preload ? opt.preload : false,
  23. closeEvent: opt.closeEvent,
  24. success: opt.success ? opt.success : function(id) {}
  25. }
  26. if (option.session) {
  27. if (sessionStorage.getItem(option.elem + "-pear-tab-data") != null) {
  28. tabData = JSON.parse(sessionStorage.getItem(option.elem + "-pear-tab-data"));
  29. option.data = JSON.parse(sessionStorage.getItem(option.elem + "-pear-tab-data"));
  30. tabDataCurrent = sessionStorage.getItem(option.elem + "-pear-tab-data-current");
  31. tabData.forEach(function(item, index) {
  32. if (item.id == tabDataCurrent) {
  33. option.index = index;
  34. }
  35. })
  36. } else {
  37. tabData = opt.data;
  38. }
  39. }
  40. var lastIndex;
  41. var tab = createTab(option);
  42. $("#" + opt.container).html(tab);
  43. tabs.render({
  44. elem: '#'+ option.elem,
  45. closable: true
  46. })
  47. toolEvent(option);
  48. $("#" + opt.container).width(opt.width);
  49. $("#" + opt.container).height(opt.height);
  50. $("#" + opt.container).css({
  51. position: "relative"
  52. });
  53. closeEvent(option);
  54. option.success(sessionStorage.getItem(option.elem + "-pear-tab-data-current"));
  55. return new pearTab(option);
  56. }
  57. pearTab.prototype.click = function(callback) {
  58. var elem = this.option.elem;
  59. var option = this.option;
  60. tabs.on('afterChange(' + this.option.elem + ')', function(data) {
  61. var id = $("#" + elem + " .layui-tabs-header .layui-this").attr("lay-id");
  62. sessionStorage.setItem(option.elem + "-pear-tab-data-current", id);
  63. if (!option.preload) {
  64. var $iframe = $(".layui-tabs[lay-filter='" + elem + "'] .layui-tabs-body").find(
  65. "iframe[id='" + id + "']");
  66. var iframeUrl = $iframe.attr("src");
  67. if (!iframeUrl || iframeUrl === "about:blank") {
  68. // 获取 url 并重载
  69. tabData.forEach(function(item, index) {
  70. if (item.id === id) {
  71. iframeUrl = item.url;
  72. }
  73. })
  74. tabIframeLoading(elem);
  75. $iframe.attr("src", iframeUrl);
  76. }
  77. }
  78. callback(id);
  79. });
  80. }
  81. pearTab.prototype.clear = function() {
  82. sessionStorage.removeItem(this.option.elem + "-pear-tab-data");
  83. sessionStorage.removeItem(this.option.elem + "-pear-tab-data-current");
  84. }
  85. pearTab.prototype.addTab = function(opt) {
  86. var title = '';
  87. if (opt.close) {
  88. title += '<span class="pear-tab-active"></span><span class="able-close title">' + opt.title +
  89. '</span><i class="layui-icon layui-unselect layui-tabs-close">ဆ</i>';
  90. } else {
  91. title += '<span class="pear-tab-active"></span><span class="disable-close title">' + opt.title +
  92. '</span><i class="layui-icon layui-unselect layui-tabs-close">ဆ</i>';
  93. }
  94. tabs.add(this.option.elem, {
  95. title: title,
  96. content: '<iframe id="' + opt.id + '" data-frameid="' + opt.id +
  97. '" scrolling="auto" frameborder="0" src="' +
  98. opt.url + '" style="width:100%;height:100%;" allowfullscreen="true"></>',
  99. id: opt.id
  100. });
  101. tabData.push(opt);
  102. sessionStorage.setItem(this.option.elem + "-pear-tab-data", JSON.stringify(tabData));
  103. sessionStorage.setItem(this.option.elem + "-pear-tab-data-current", opt.id);
  104. tabs.change(this.option.elem, opt.id);
  105. }
  106. var index = 0;
  107. // 根据过滤 fliter 标识, 重置选项卡标题
  108. pearTab.prototype.changeTabTitleById = function(elem, id, title) {
  109. var currentTab = $(".layui-tabs[lay-filter='" + elem + "'] .layui-tabs-header [lay-id='" + id +
  110. "'] .title");
  111. currentTab.html(title);
  112. }
  113. // 根据过滤 filter 标识, 删除指定选项卡
  114. pearTab.prototype.delTabByElem = function(elem, id, callback) {
  115. var currentTab = $(".layui-tabs[lay-filter='" + elem + "'] .layui-tabs-header [lay-id='" + id + "']");
  116. if (currentTab.find("span").is(".able-close")) {
  117. tabDelete(elem, id, callback);
  118. }
  119. }
  120. // 根据过滤 filter 标识, 删除其他选项卡
  121. pearTab.prototype.delOtherTabByElem = function(elem, callback) {
  122. var currentId = $(".layui-tabs[lay-filter='" + elem + "'] .layui-tabs-header .layui-this").attr(
  123. "lay-id");
  124. var tabtitle = $(".layui-tabs[lay-filter='" + elem + "'] .layui-tabs-header li");
  125. $.each(tabtitle, function(i) {
  126. if ($(this).attr("lay-id") != currentId) {
  127. if ($(this).find("span").is(".able-close")) {
  128. tabDelete(elem, $(this).attr("lay-id"), callback);
  129. }
  130. }
  131. })
  132. }
  133. // 根据过滤 filter 标识, 删除全部选项卡
  134. pearTab.prototype.delAllTabByElem = function(elem, callback) {
  135. var currentId = $(".layui-tabs[lay-filter='" + elem + "'] .layui-tabs-header .layui-this").attr(
  136. "lay-id");
  137. var tabtitle = $(".layui-tabs[lay-filter='" + elem + "'] .layui-tabs-header li");
  138. $.each(tabtitle, function(i) {
  139. if ($(this).find("span").is(".able-close")) {
  140. tabDelete(elem, $(this).attr("lay-id"), callback);
  141. }
  142. })
  143. }
  144. // 根据过滤 filter 标识, 删除当前选项卡
  145. pearTab.prototype.delCurrentTabByElem = function(elem, callback) {
  146. var currentTab = $(".layui-tabs[lay-filter='" + elem + "'] .layui-tabs-header .layui-this");
  147. if (currentTab.find("span").is(".able-close")) {
  148. var currentId = currentTab.attr("lay-id");
  149. tabDelete(elem, currentId, callback);
  150. }
  151. }
  152. /** 添 加 唯 一 选 项 卡 */
  153. pearTab.prototype.addTabOnly = function(opt, time) {
  154. var title = '';
  155. if (opt.close) {
  156. title += '<span class="pear-tab-active"></span><span class="able-close title">' + opt.title +
  157. '</span><i class="layui-icon layui-unselect layui-tabs-close">ဆ</i>';
  158. } else {
  159. title += '<span class="pear-tab-active"></span><span class="disable-close title">' + opt.title +
  160. '</span><i class="layui-icon layui-unselect layui-tabs-close">ဆ</i>';
  161. }
  162. if ($(".layui-tabs[lay-filter='" + this.option.elem + "'] .layui-tabs-header li[lay-id]").length <=
  163. 0) {
  164. tabs.add(this.option.elem, {
  165. title: title,
  166. content: '<iframe id="' + opt.id + '" data-frameid="' + opt.id +
  167. '" scrolling="auto" frameborder="0" src="' +
  168. opt.url + '" style="width:100%;height:100%;" allowfullscreen="true"></iframe>',
  169. id: opt.id
  170. });
  171. if (time != false && time != 0) {
  172. tabIframeLoading(this.option.elem, opt.id);
  173. }
  174. tabData.push(opt);
  175. sessionStorage.setItem(this.option.elem + "-pear-tab-data", JSON.stringify(tabData));
  176. sessionStorage.setItem(this.option.elem + "-pear-tab-data-current", opt.id);
  177. } else {
  178. var isData = false;
  179. $.each($(".layui-tabs[lay-filter='" + this.option.elem + "'] .layui-tabs-header li[lay-id]"),
  180. function() {
  181. if ($(this).attr("lay-id") == opt.id) {
  182. isData = true;
  183. }
  184. })
  185. if (isData == false) {
  186. if (this.option.tabMax != false) {
  187. if ($(".layui-tabs[lay-filter='" + this.option.elem + "'] .layui-tabs-header li[lay-id]")
  188. .length >= this.option.tabMax) {
  189. layer.msg("最多打开" + this.option.tabMax + "个标签页", {
  190. icon: 2,
  191. time: 1000,
  192. shift: 6
  193. });
  194. return false;
  195. }
  196. }
  197. tabs.add(this.option.elem, {
  198. title: title,
  199. content: '<iframe id="' + opt.id + '" data-frameid="' + opt.id +
  200. '" scrolling="auto" frameborder="0" src="' +
  201. opt.url + '" style="width:100%;height:100%;" allowfullscreen="true"></iframe>',
  202. id: opt.id
  203. });
  204. if (time != false && time != 0) {
  205. tabIframeLoading(this.option.elem, opt.id);
  206. }
  207. tabData.push(opt);
  208. sessionStorage.setItem(this.option.elem + "-pear-tab-data", JSON.stringify(tabData));
  209. sessionStorage.setItem(this.option.elem + "-pear-tab-data-current", opt.id);
  210. }
  211. }
  212. tabs.change(this.option.elem, opt.id);
  213. sessionStorage.setItem(this.option.elem + "-pear-tab-data-current", opt.id);
  214. }
  215. // 刷 新 指 定 的 选 项 卡
  216. pearTab.prototype.refresh = function(time) {
  217. // 刷 新 指 定 的 选 项 卡
  218. var $iframe = $(".layui-tabs[lay-filter='" + this.option.elem + "'] .layui-tabs-body .layui-show")
  219. .find("iframe");
  220. if (time != false && time != 0) {
  221. tabIframeLoading(this.option.elem);
  222. }
  223. $iframe.attr("src", $iframe.attr("src"));
  224. }
  225. function tabIframeLoading(elem, id) {
  226. var load = '<div id="pear-tab-loading' + index + '" class="pear-tab-loading">' +
  227. '<div class="ball-loader">' +
  228. '<span></span><span></span><span></span><span></span>' +
  229. '</div>' +
  230. '</div>'
  231. var $iframe = $(".layui-tabs[lay-filter='" + elem + "'] .layui-tabs-body .layui-show").find("iframe");
  232. if (id) {
  233. $iframe = $(".layui-tabs[lay-filter='" + elem + "'] .layui-tabs-body").find("iframe[id='" + id +
  234. "']");
  235. }
  236. $iframe.parent().append(load);
  237. var pearLoad = $("#" + elem).find("#pear-tab-loading" + index);
  238. pearLoad.css({
  239. display: "block"
  240. });
  241. index++;
  242. $iframe.on("load", function() {
  243. pearLoad.fadeOut(1000, function() {
  244. pearLoad.remove();
  245. });
  246. })
  247. }
  248. function tabDelete(elem, id, callback, option) {
  249. //根据 elem id 来删除指定的 layui title li
  250. var tabTitle = $(".layui-tabs[lay-filter='" + elem + "']").find(".layui-tabs-header");
  251. // 删除指定 id 的 title
  252. var removeTab = tabTitle.find("li[lay-id='" + id + "']");
  253. var nextNode = removeTab.next("li");
  254. if (!removeTab.hasClass("layui-this")) {
  255. tabs.close(elem, id);
  256. tabData = JSON.parse(sessionStorage.getItem(elem + "-pear-tab-data"));
  257. tabDataCurrent = sessionStorage.getItem(elem + "-pear-tab-data-current");
  258. tabData = tabData.filter(function(item) {
  259. return item.id != id;
  260. })
  261. sessionStorage.setItem(elem + "-pear-tab-data", JSON.stringify(tabData));
  262. return false;
  263. }
  264. var currId;
  265. if (nextNode.length) {
  266. currId = nextNode.attr("lay-id");
  267. } else {
  268. var prevNode = removeTab.prev("li");
  269. currId = prevNode.attr("lay-id");
  270. }
  271. callback(currId);
  272. tabData = JSON.parse(sessionStorage.getItem(elem + "-pear-tab-data"));
  273. tabDataCurrent = sessionStorage.getItem(elem + "-pear-tab-data-current");
  274. tabData = tabData.filter(function(item) {
  275. return item.id != id;
  276. })
  277. sessionStorage.setItem(elem + "-pear-tab-data", JSON.stringify(tabData));
  278. sessionStorage.setItem(elem + "-pear-tab-data-current", currId);
  279. tabs.close(elem, id);
  280. }
  281. function createTab(option) {
  282. var type = "";
  283. if (option.roll == true) {
  284. type = "layui-tab-roll";
  285. }
  286. if (option.tool != false) {
  287. type = "layui-tab-tool";
  288. }
  289. if (option.roll == true && option.tool != false) {
  290. type = "layui-tab-rollTool";
  291. }
  292. var tab = '<div class="pear-tab ' + type + ' layui-tabs" lay-filter="' + option.elem +
  293. '" id="' + option.elem +
  294. '" >';
  295. var title = '<ul class="layui-tabs-header">';
  296. var content = '<div class="layui-tabs-body">';
  297. var control =
  298. '<div class="layui-tab-control"><li class="layui-tab-tool layui-icon layui-icon-down"><ul class="layui-nav" lay-filter=""><li class="layui-nav-item"><a href="javascript:;"></a><dl class="layui-nav-child">';
  299. // 处 理 选 项 卡 头 部
  300. var index = 0;
  301. $.each(option.data, function(i, item) {
  302. var TitleItem = '';
  303. if (option.index == index) {
  304. TitleItem += '<li lay-id="' + item.id +
  305. '" class="layui-this"><span class="pear-tab-active"></span>';
  306. } else {
  307. TitleItem += '<li lay-id="' + item.id + '" ><span class="pear-tab-active"></span>';
  308. }
  309. if (item.close) {
  310. // 当 前 选 项 卡 可 以 关 闭
  311. TitleItem += '<span class="able-close title">' + item.title + '</span>';
  312. } else {
  313. // 当 前 选 项 卡 不 允 许 关 闭
  314. TitleItem += '<span class="disable-close title">' + item.title + '</span>';
  315. }
  316. TitleItem += '<i class="layui-icon layui-unselect layui-tabs-close">ဆ</i></li>';
  317. title += TitleItem;
  318. if (option.index == index) {
  319. // 处 理 显 示 内 容
  320. content += '<div class="layui-show layui-tabs-item"><iframe id="' + item.id +
  321. '" data-frameid="' + item.id +
  322. '" src="' + item.url +
  323. '" frameborder="no" border="0" marginwidth="0" marginheight="0" style="width: 100%;height: 100%;" allowfullscreen="true"></iframe></div>'
  324. } else {
  325. if (!option.preload) {
  326. item.url = "about:blank";
  327. }
  328. // 处 理 显 示 内 容
  329. content += '<div class="layui-tabs-item"><iframe id="' + item.id + '" data-frameid="' +
  330. item.id + '" src="' +
  331. item.url +
  332. '" frameborder="no" border="0" marginwidth="0" marginheight="0" style="width: 100%;height: 100%;" allowfullscreen="true"></iframe></div>'
  333. }
  334. index++;
  335. });
  336. title += '</ul>';
  337. content += '</div>';
  338. control += '<dd id="closeThis"><a href="#">关 闭 当 前</a></dd>'
  339. control += '<dd id="closeOther"><a href="#">关 闭 其 他</a></dd>'
  340. control += '<dd id="closeAll"><a href="#">关 闭 全 部</a></dd>'
  341. control += '</dl></li></ul></li></div>';
  342. tab += title;
  343. tab += control;
  344. tab += content;
  345. tab += '</div>';
  346. tab += ''
  347. return tab;
  348. }
  349. function closeEvent(option) {
  350. $(".layui-tabs[lay-filter='" + option.elem + "']").on("click", ".layui-tabs-close", function(event) {
  351. var layid = $(this).parent().attr("lay-id");
  352. tabDelete(option.elem, layid, option.closeEvent, option);
  353. return false //阻止冒泡
  354. })
  355. }
  356. function toolEvent(option) {
  357. $("body .layui-tabs[lay-filter='" + option.elem + "']").on("click", "#closeThis", function() {
  358. var currentTab = $(".layui-tabs[lay-filter='" + option.elem +
  359. "'] .layui-tabs-header .layui-this");
  360. if (currentTab.find("span").is(".able-close")) {
  361. var currentId = currentTab.attr("lay-id");
  362. tabDelete(option.elem, currentId, option.closeEvent, option);
  363. } else {
  364. layer.msg("当前页面不允许关闭", {
  365. icon: 3,
  366. time: 800
  367. })
  368. }
  369. })
  370. $("body .layui-tabs[lay-filter='" + option.elem + "']").on("click", "#closeOther", function() {
  371. var currentId = $(".layui-tabs[lay-filter='" + option.elem +
  372. "'] .layui-tabs-header .layui-this").attr("lay-id");
  373. var tabtitle = $(".layui-tabs[lay-filter='" + option.elem + "'] .layui-tabs-header li");
  374. $.each(tabtitle, function(i) {
  375. if ($(this).attr("lay-id") != currentId) {
  376. if ($(this).find("span").is(".able-close")) {
  377. tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent,
  378. option);
  379. }
  380. }
  381. })
  382. })
  383. $("body .layui-tabs[lay-filter='" + option.elem + "']").on("click", "#closeAll", function() {
  384. var currentId = $(".layui-tabs[lay-filter='" + option.elem +
  385. "'] .layui-tabs-header .layui-this").attr("lay-id");
  386. var tabtitle = $(".layui-tabs[lay-filter='" + option.elem + "'] .layui-tabs-header li");
  387. $.each(tabtitle, function(i) {
  388. if ($(this).find("span").is(".able-close")) {
  389. tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent, option);
  390. }
  391. })
  392. })
  393. }
  394. return pearTab;
  395. })