contabs.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. $(function () {
  2. //计算元素集合的总宽度
  3. function calSumWidth(elements) {
  4. var width = 0;
  5. $(elements).each(function () {
  6. width += $(this).outerWidth(true);
  7. });
  8. return width;
  9. }
  10. //滚动到指定选项卡
  11. function scrollToTab(element) {
  12. var marginLeftVal = calSumWidth($(element).prevAll()), marginRightVal = calSumWidth($(element).nextAll());
  13. // 可视区域非tab宽度
  14. var tabOuterWidth = calSumWidth($(".content-tabs").children().not(".J_menuTabs"));
  15. //可视区域tab宽度
  16. var visibleWidth = $(".content-tabs").outerWidth(true) - tabOuterWidth;
  17. //实际滚动宽度
  18. var scrollVal = 0;
  19. var rightOuterWidth = $(element).next().outerWidth(true);
  20. if (rightOuterWidth === 'undefined' || rightOuterWidth === undefined) {
  21. rightOuterWidth = 0;
  22. }
  23. if ($(".page-tabs-content").outerWidth() < visibleWidth) {
  24. scrollVal = 0;
  25. } else if (marginRightVal <= (visibleWidth - $(element).outerWidth(true) - rightOuterWidth)) {
  26. if ((visibleWidth - rightOuterWidth) > marginRightVal) {
  27. scrollVal = marginLeftVal;
  28. var tabElement = element;
  29. while ((scrollVal - $(tabElement).outerWidth()) > ($(".page-tabs-content").outerWidth() - visibleWidth)) {
  30. scrollVal -= $(tabElement).prev().outerWidth();
  31. tabElement = $(tabElement).prev();
  32. }
  33. if (scrollVal > 59) {
  34. scrollVal -= 40;
  35. }
  36. }
  37. } else if (marginLeftVal > (visibleWidth - $(element).outerWidth(true) - $(element).prev().outerWidth(true))) {
  38. scrollVal = marginLeftVal - $(element).prev().outerWidth(true);
  39. }
  40. $('.page-tabs-content').animate({
  41. marginLeft: 0 - scrollVal + 'px'
  42. }, "fast");
  43. }
  44. //查看左侧隐藏的选项卡
  45. function scrollTabLeft() {
  46. var marginLeftVal = Math.abs(parseInt($('.page-tabs-content').css('margin-left')));
  47. // 可视区域非tab宽度
  48. var tabOuterWidth = calSumWidth($(".content-tabs").children().not(".J_menuTabs"));
  49. //可视区域tab宽度
  50. var visibleWidth = $(".content-tabs").outerWidth(true) - tabOuterWidth;
  51. //实际滚动宽度
  52. var scrollVal = 0;
  53. if ($(".page-tabs-content").width() < visibleWidth) {
  54. return false;
  55. } else {
  56. var tabElement = $(".J_menuTab:first");
  57. var offsetVal = 0;
  58. while ((offsetVal + $(tabElement).outerWidth(true)) <= marginLeftVal) {//找到离当前tab最近的元素
  59. offsetVal += $(tabElement).outerWidth(true);
  60. tabElement = $(tabElement).next();
  61. }
  62. offsetVal = 0;
  63. if (calSumWidth($(tabElement).prevAll()) > visibleWidth) {
  64. while ((offsetVal + $(tabElement).outerWidth(true)) < (visibleWidth) && tabElement.length > 0) {
  65. offsetVal += $(tabElement).outerWidth(true);
  66. tabElement = $(tabElement).prev();
  67. }
  68. scrollVal = calSumWidth($(tabElement).prevAll());
  69. }
  70. }
  71. $('.page-tabs-content').animate({
  72. marginLeft: 0 - scrollVal + 'px'
  73. }, "fast");
  74. }
  75. //查看右侧隐藏的选项卡
  76. function scrollTabRight() {
  77. var marginLeftVal = Math.abs(parseInt($('.page-tabs-content').css('margin-left')));
  78. // 可视区域非tab宽度
  79. var tabOuterWidth = calSumWidth($(".content-tabs").children().not(".J_menuTabs"));
  80. //可视区域tab宽度
  81. var visibleWidth = $(".content-tabs").outerWidth(true) - tabOuterWidth;
  82. //实际滚动宽度
  83. var scrollVal = 0;
  84. if ($(".page-tabs-content").width() < visibleWidth) {
  85. return false;
  86. } else {
  87. var tabElement = $(".J_menuTab:first");
  88. var offsetVal = 0;
  89. while ((offsetVal + $(tabElement).outerWidth(true)) <= marginLeftVal) {//找到离当前tab最近的元素
  90. offsetVal += $(tabElement).outerWidth(true);
  91. tabElement = $(tabElement).next();
  92. }
  93. offsetVal = 0;
  94. while ((offsetVal + $(tabElement).outerWidth(true)) < (visibleWidth) && tabElement.length > 0) {
  95. offsetVal += $(tabElement).outerWidth(true);
  96. tabElement = $(tabElement).next();
  97. }
  98. scrollVal = calSumWidth($(tabElement).prevAll());
  99. if (scrollVal > 0) {
  100. $('.page-tabs-content').animate({
  101. marginLeft: 0 - scrollVal + 'px'
  102. }, "fast");
  103. }
  104. }
  105. }
  106. //通过遍历给菜单项加上data-index属性
  107. $(".J_menuItem").each(function (index) {
  108. if (!$(this).attr('data-index')) {
  109. $(this).attr('data-index', index);
  110. }
  111. });
  112. function menuItem() {
  113. // 获取标识数据
  114. var dataUrl = $(this).attr('href'),
  115. dataIndex = $(this).data('index'),
  116. menuTitle = $.trim($(this).data('title')),
  117. menuName = menuTitle.length > 0 ? menuTitle : $.trim($(this).text()),
  118. flag = true;
  119. if (dataUrl == undefined || $.trim(dataUrl).length == 0) {
  120. return false;
  121. }
  122. if (dataUrl == '#') {
  123. return;
  124. }
  125. // 选项卡菜单已存在
  126. $('.J_menuTab').each(function () {
  127. if ($(this).data('id') == dataUrl) {
  128. if (!$(this).hasClass('active')) {
  129. $(this).addClass('active').siblings('.J_menuTab').removeClass('active');
  130. scrollToTab(this);
  131. // 显示tab对应的内容区
  132. $('.J_mainContent .J_iframe').each(function () {
  133. if ($(this).data('id') == dataUrl) {
  134. $(this).show().siblings('.J_iframe').hide();
  135. return false;
  136. }
  137. });
  138. }
  139. flag = false;
  140. return false;
  141. }
  142. });
  143. // 选项卡菜单不存在
  144. if (flag) {
  145. var str = '<a href="javascript:;" class="active J_menuTab" data-id="' + dataUrl + '">' + menuName + '<i class="iconfont iconguanbi"></i></a>';
  146. $('.J_menuTab').removeClass('active');
  147. // 添加选项卡对应的iframe
  148. var str1 = '<iframe class="J_iframe" name="iframe' + dataIndex + '" width="100%" height="100%" src="' + dataUrl + '" frameborder="0" data-id="' + dataUrl + '" seamless></iframe>';
  149. $('.J_mainContent').find('iframe.J_iframe').hide().parents('.J_mainContent').append(str1);
  150. // 显示loading提示并关闭菜单
  151. $("body").removeClass('sidebar-open');
  152. var loading = layer.load(2, {
  153. time: 6 * 1000, // 最长等待时间
  154. });
  155. $('.J_mainContent iframe:visible').on('load', function () {
  156. //iframe加载完成后隐藏loading提示
  157. layer.close(loading);
  158. });
  159. // 添加选项卡
  160. $('.J_menuTabs .page-tabs-content').append(str);
  161. scrollToTab($('.J_menuTab.active'));
  162. // 判断如果不开启tag标签页就关闭其他标签页
  163. if (config.tag != true || config.isMobile == true){
  164. closeOtherTabs();
  165. }
  166. }
  167. return false;
  168. }
  169. // 关闭当前的标签
  170. window.closeCurrentConTab = function() {
  171. $('.J_menuTabs .active i').click();
  172. }
  173. // 内页打开新标签
  174. window.openConTab = function(that) {
  175. // 获取标识数据
  176. var dataUrl = that.attr('href'),
  177. dataIndex = that.data('index'),
  178. menuTitle = $.trim(that.data('title')),
  179. menuName = menuTitle.length > 0 ? menuTitle : $.trim(that.text()),
  180. flag = true;
  181. if (dataUrl == undefined || $.trim(dataUrl).length == 0)return false;
  182. // 选项卡菜单已存在
  183. $('.J_menuTab').each(function () {
  184. if ($(this).data('id') == dataUrl) {
  185. if (!$(this).hasClass('active')) {
  186. $(this).addClass('active').siblings('.J_menuTab').removeClass('active');
  187. scrollToTab(this);
  188. // 显示tab对应的内容区
  189. $('.J_mainContent .J_iframe').each(function () {
  190. if ($(this).data('id') == dataUrl) {
  191. $(this).show().siblings('.J_iframe').hide();
  192. return false;
  193. }
  194. });
  195. // 重新加载
  196. $(this).trigger('dblclick');
  197. }
  198. flag = false;
  199. return false;
  200. }
  201. });
  202. // 选项卡菜单不存在
  203. if (flag) {
  204. var str = '<a href="javascript:;" class="active J_menuTab" data-id="' + dataUrl + '">' + menuName + '<i class="icon ion-android-close"></i></a>';
  205. $('.J_menuTab').removeClass('active');
  206. // 添加选项卡对应的iframe
  207. var str1 = '<iframe class="J_iframe" name="iframe' + dataIndex + '" width="100%" height="100%" src="' + dataUrl + '" frameborder="0" data-id="' + dataUrl + '" seamless></iframe>';
  208. $('.J_mainContent').find('iframe.J_iframe').hide().parents('.J_mainContent').append(str1);
  209. $("body").removeClass('sidebar-open');
  210. var loading = layer.load(2, {
  211. time: 10 * 1000, // 最长等待时间
  212. });
  213. $('.J_mainContent iframe:visible').on('load', function () {
  214. // iframe加载完成后隐藏loading提示
  215. layer.close(loading);
  216. });
  217. // 添加选项卡
  218. $('.J_menuTabs .page-tabs-content').append(str);
  219. scrollToTab($('.J_menuTab.active'));
  220. // 判断如果不开启tag标签页就关闭其他标签页
  221. if (config.tag != true || config.isMobile == true){
  222. closeOtherTabs();
  223. }
  224. }
  225. return false;
  226. };
  227. $('.J_menuItem').on('click', menuItem);
  228. // 关闭选项卡菜单
  229. function closeTab() {
  230. var closeTabId = $(this).parents('.J_menuTab').data('id');
  231. var currentWidth = $(this).parents('.J_menuTab').width();
  232. // 当前元素处于活动状态
  233. if ($(this).parents('.J_menuTab').hasClass('active')) {
  234. // 当前元素后面有同辈元素,使后面的一个元素处于活动状态
  235. if ($(this).parents('.J_menuTab').next('.J_menuTab').length) {
  236. var activeId = $(this).parents('.J_menuTab').next('.J_menuTab:eq(0)').data('id');
  237. $(this).parents('.J_menuTab').next('.J_menuTab:eq(0)').addClass('active');
  238. $('.J_mainContent .J_iframe').each(function () {
  239. if ($(this).data('id') == activeId) {
  240. $(this).show().siblings('.J_iframe').hide();
  241. return false;
  242. }
  243. });
  244. var marginLeftVal = parseInt($('.page-tabs-content').css('margin-left'));
  245. if (marginLeftVal < 0) {
  246. $('.page-tabs-content').animate({
  247. marginLeft: (marginLeftVal + currentWidth) + 'px'
  248. }, "fast");
  249. }
  250. // 移除当前选项卡
  251. $(this).parents('.J_menuTab').remove();
  252. // 定位到当前选项卡
  253. $('.J_tabShowActive').on('click', scrollToTab($('.J_menuTab.active')));
  254. // 移除tab对应的内容区
  255. $('.J_mainContent .J_iframe').each(function () {
  256. if ($(this).data('id') == closeTabId) {
  257. $(this).remove();
  258. return false;
  259. }
  260. });
  261. }
  262. // 当前元素后面没有同辈元素,使当前元素的上一个元素处于活动状态
  263. if ($(this).parents('.J_menuTab').prev('.J_menuTab').length) {
  264. var activeId = $(this).parents('.J_menuTab').prev('.J_menuTab:last').data('id');
  265. $(this).parents('.J_menuTab').prev('.J_menuTab:last').addClass('active');
  266. $('.J_mainContent .J_iframe').each(function () {
  267. if ($(this).data('id') == activeId) {
  268. $(this).show().siblings('.J_iframe').hide();
  269. return false;
  270. }
  271. });
  272. // 移除当前选项卡
  273. $(this).parents('.J_menuTab').remove();
  274. //滚动到已激活的选项卡
  275. $('.J_tabShowActive').on('click', scrollToTab($('.J_menuTab.active')));
  276. // 移除tab对应的内容区
  277. $('.J_mainContent .J_iframe').each(function () {
  278. if ($(this).data('id') == closeTabId) {
  279. $(this).remove();
  280. return false;
  281. }
  282. });
  283. }
  284. }
  285. // 当前元素不处于活动状态
  286. else {
  287. // 移除当前选项卡
  288. $(this).parents('.J_menuTab').remove();
  289. // 移除相应tab对应的内容区
  290. $('.J_mainContent .J_iframe').each(function () {
  291. if ($(this).data('id') == closeTabId) {
  292. $(this).remove();
  293. return false;
  294. }
  295. });
  296. scrollToTab($('.J_menuTab.active'));
  297. }
  298. return false;
  299. }
  300. $('.J_menuTabs').on('click', '.J_menuTab i', closeTab);
  301. //关闭其他选项卡
  302. function closeOtherTabs(){
  303. $('.page-tabs-content').children("[data-id]").not(":first").not(".active").each(function () {
  304. $('.J_iframe[data-id="' + $(this).data('id') + '"]').remove();
  305. $(this).remove();
  306. });
  307. $('.page-tabs-content').css("margin-left", "0");
  308. }
  309. $('.J_tabCloseOther').on('click', closeOtherTabs);
  310. //滚动到已激活的选项卡
  311. function showActiveTab(){
  312. scrollToTab($('.J_menuTab.active'));
  313. }
  314. $('.J_tabShowActive').on('click', showActiveTab);
  315. // 点击选项卡菜单
  316. function activeTab() {
  317. if (!$(this).hasClass('active')) {
  318. var currentId = $(this).data('id');
  319. // 显示tab对应的内容区
  320. $('.J_mainContent .J_iframe').each(function () {
  321. if ($(this).data('id') == currentId) {
  322. $(this).show().siblings('.J_iframe').hide();
  323. return false;
  324. }
  325. });
  326. $(this).addClass('active').siblings('.J_menuTab').removeClass('active');
  327. scrollToTab(this);
  328. }
  329. }
  330. $('.J_menuTabs').on('click', '.J_menuTab', activeTab);
  331. //刷新iframe
  332. function refreshTab() {
  333. var target = $('.J_iframe[data-id="' + $(this).data('id') + '"]');
  334. var url = target.attr('src');
  335. //显示loading提示
  336. $("body").removeClass('sidebar-open');
  337. var loading = layer.load(2, {
  338. time: 10 * 1000, // 最长等待时间
  339. });
  340. target.attr('src', url).on('load', function () {
  341. //关闭loading提示
  342. layer.close(loading);
  343. });
  344. }
  345. $('.J_menuTabs').on('dblclick', '.J_menuTab', refreshTab);
  346. // 左移按扭
  347. $('.J_tabLeft').on('click', scrollTabLeft);
  348. // 右移按扭
  349. $('.J_tabRight').on('click', scrollTabRight);
  350. // 关闭全部
  351. $('.J_tabCloseAll').on('click', function () {
  352. $('.page-tabs-content').children("[data-id]").not(":first").each(function () {
  353. $('.J_iframe[data-id="' + $(this).data('id') + '"]').remove();
  354. $(this).remove();
  355. });
  356. $('.page-tabs-content').children("[data-id]:first").each(function () {
  357. $('.J_iframe[data-id="' + $(this).data('id') + '"]').show();
  358. $(this).addClass("active");
  359. });
  360. $('.page-tabs-content').css("margin-left", "0");
  361. });
  362. });
粤ICP备19079148号