contabs.js 13 KB

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