ligerTab.js 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778
  1. /**
  2. * jQuery ligerUI 1.1.9
  3. *
  4. * http://ligerui.com
  5. *
  6. * Author daomi 2012 [ gd_star@163.com ]
  7. *
  8. */
  9. (function ($)
  10. {
  11. $.fn.ligerTab = function (options)
  12. {
  13. return $.ligerui.run.call(this, "ligerTab", arguments);
  14. };
  15. $.fn.ligerGetTabManager = function ()
  16. {
  17. return $.ligerui.run.call(this, "ligerGetTabManager", arguments);
  18. };
  19. $.ligerDefaults.Tab = {
  20. height: null,
  21. heightDiff: 0, // 高度补差
  22. changeHeightOnResize: false,
  23. contextmenu: true,
  24. dblClickToClose: false, //是否双击时关闭
  25. dragToMove: false, //是否允许拖动时改变tab项的位置
  26. onBeforeOverrideTabItem: null,
  27. onAfterOverrideTabItem: null,
  28. onBeforeRemoveTabItem: null,
  29. onAfterRemoveTabItem: null,
  30. onBeforeAddTabItem: null,
  31. onAfterAddTabItem: null,
  32. onBeforeSelectTabItem: null,
  33. onAfterSelectTabItem: null
  34. };
  35. $.ligerDefaults.TabString = {
  36. closeMessage: "关闭当前页",
  37. closeOtherMessage: "关闭其他",
  38. closeAllMessage: "关闭所有",
  39. reloadMessage: "刷新"
  40. };
  41. $.ligerMethos.Tab = {};
  42. $.ligerui.controls.Tab = function (element, options)
  43. {
  44. $.ligerui.controls.Tab.base.constructor.call(this, element, options);
  45. };
  46. $.ligerui.controls.Tab.ligerExtend($.ligerui.core.UIComponent, {
  47. __getType: function ()
  48. {
  49. return 'Tab';
  50. },
  51. __idPrev: function ()
  52. {
  53. return 'Tab';
  54. },
  55. _extendMethods: function ()
  56. {
  57. return $.ligerMethos.Tab;
  58. },
  59. _render: function ()
  60. {
  61. var g = this, p = this.options;
  62. if (p.height) g.makeFullHeight = true;
  63. g.tab = $(this.element);
  64. g.tab.addClass("l-tab");
  65. if (p.contextmenu && $.ligerMenu)
  66. {
  67. g.tab.menu = $.ligerMenu({ width: 100, items: [
  68. { text: p.closeMessage, id: 'close', click: function ()
  69. {
  70. g._menuItemClick.apply(g, arguments);
  71. }
  72. },
  73. { text: p.closeOtherMessage, id: 'closeother', click: function ()
  74. {
  75. g._menuItemClick.apply(g, arguments);
  76. }
  77. },
  78. { text: p.closeAllMessage, id: 'closeall', click: function ()
  79. {
  80. g._menuItemClick.apply(g, arguments);
  81. }
  82. },
  83. { text: p.reloadMessage, id: 'reload', click: function ()
  84. {
  85. g._menuItemClick.apply(g, arguments);
  86. }
  87. }
  88. ]
  89. });
  90. }
  91. g.tab.content = $('<div class="l-tab-content"></div>');
  92. $("> div", g.tab).appendTo(g.tab.content);
  93. g.tab.content.appendTo(g.tab);
  94. g.tab.links = $('<div class="l-tab-links"><ul style="left: 0px; "></ul></div>');
  95. g.tab.links.prependTo(g.tab);
  96. g.tab.links.ul = $("ul", g.tab.links);
  97. var lselecteds = $("> div[lselected=true]", g.tab.content);
  98. var haslselected = lselecteds.length > 0;
  99. g.selectedTabId = lselecteds.attr("tabid");
  100. $("> div", g.tab.content).each(function (i, box)
  101. {
  102. var li = $('<li class=""><a></a><div class="l-tab-links-item-left"></div><div class="l-tab-links-item-right"></div></li>');
  103. var contentitem = $(this);
  104. if (contentitem.attr("title"))
  105. {
  106. $("> a", li).html(contentitem.attr("title"));
  107. contentitem.attr("title", "");
  108. }
  109. var tabid = contentitem.attr("tabid");
  110. if (tabid == undefined)
  111. {
  112. tabid = g.getNewTabid();
  113. contentitem.attr("tabid", tabid);
  114. if (contentitem.attr("lselected"))
  115. {
  116. g.selectedTabId = tabid;
  117. }
  118. }
  119. li.attr("tabid", tabid);
  120. if (!haslselected && i == 0) g.selectedTabId = tabid;
  121. var showClose = contentitem.attr("showClose");
  122. if (showClose)
  123. {
  124. li.append("<div class='l-tab-links-item-close'></div>");
  125. }
  126. $("> ul", g.tab.links).append(li);
  127. if (!contentitem.hasClass("l-tab-content-item")) contentitem.addClass("l-tab-content-item");
  128. if (contentitem.find("iframe").length > 0)
  129. {
  130. var iframe = $("iframe:first", contentitem);
  131. if (iframe[0].readyState != "complete")
  132. {
  133. if (contentitem.find(".l-tab-loading:first").length == 0)
  134. contentitem.prepend("<div class='l-tab-loading' style='display:block;'></div>");
  135. var iframeloading = $(".l-tab-loading:first", contentitem);
  136. iframe.bind('load.tab', function ()
  137. {
  138. iframeloading.hide();
  139. });
  140. }
  141. }
  142. });
  143. //init
  144. g.selectTabItem(g.selectedTabId);
  145. //set content height
  146. if (p.height)
  147. {
  148. if (typeof (p.height) == 'string' && p.height.indexOf('%') > 0)
  149. {
  150. g.onResize();
  151. if (p.changeHeightOnResize)
  152. {
  153. $(window).resize(function ()
  154. {
  155. g.onResize.call(g);
  156. });
  157. }
  158. } else
  159. {
  160. g.setHeight(p.height);
  161. }
  162. }
  163. if (g.makeFullHeight)
  164. g.setContentHeight();
  165. //add even
  166. $("li", g.tab.links).each(function ()
  167. {
  168. g._addTabItemEvent($(this));
  169. });
  170. g.tab.bind('dblclick.tab', function (e)
  171. {
  172. if (!p.dblClickToClose) return;
  173. g.dblclicking = true;
  174. var obj = (e.target || e.srcElement);
  175. var tagName = obj.tagName.toLowerCase();
  176. if (tagName == "a")
  177. {
  178. var tabid = $(obj).parent().attr("tabid");
  179. var allowClose = $(obj).parent().find("div.l-tab-links-item-close").length ? true : false;
  180. if (allowClose)
  181. {
  182. g.removeTabItem(tabid);
  183. }
  184. }
  185. g.dblclicking = false;
  186. });
  187. g.set(p);
  188. },
  189. _applyDrag: function (tabItemDom)
  190. {
  191. var g = this, p = this.options;
  192. g.droptip = g.droptip || $("<div class='l-tab-drag-droptip' style='display:none'><div class='l-drop-move-up'></div><div class='l-drop-move-down'></div></div>").appendTo('body');
  193. var drag = $(tabItemDom).ligerDrag(
  194. {
  195. revert: true, animate: false,
  196. proxy: function ()
  197. {
  198. var name = $(this).find("a").html();
  199. g.dragproxy = $("<div class='l-tab-drag-proxy' style='display:none'><div class='l-drop-icon l-drop-no'></div></div>").appendTo('body');
  200. g.dragproxy.append(name);
  201. return g.dragproxy;
  202. },
  203. onRendered: function ()
  204. {
  205. this.set('cursor', 'pointer');
  206. },
  207. onStartDrag: function (current, e)
  208. {
  209. if (!$(tabItemDom).hasClass("l-selected")) return false;
  210. if (e.button == 2) return false;
  211. var obj = e.srcElement || e.target;
  212. if ($(obj).hasClass("l-tab-links-item-close")) return false;
  213. },
  214. onDrag: function (current, e)
  215. {
  216. if (g.dropIn == null)
  217. g.dropIn = -1;
  218. var tabItems = g.tab.links.ul.find('>li');
  219. var targetIndex = tabItems.index(current.target);
  220. tabItems.each(function (i, item)
  221. {
  222. if (targetIndex == i)
  223. {
  224. return;
  225. }
  226. var isAfter = i > targetIndex;
  227. if (g.dropIn != -1 && g.dropIn != i) return;
  228. var offset = $(this).offset();
  229. var range = {
  230. top: offset.top,
  231. bottom: offset.top + $(this).height(),
  232. left: offset.left - 10,
  233. right: offset.left + 10
  234. };
  235. if (isAfter)
  236. {
  237. range.left += $(this).width();
  238. range.right += $(this).width();
  239. }
  240. var pageX = e.pageX || e.screenX;
  241. var pageY = e.pageY || e.screenY;
  242. if (pageX > range.left && pageX < range.right && pageY > range.top && pageY < range.bottom)
  243. {
  244. g.droptip.css({
  245. left: range.left + 5,
  246. top: range.top - 9
  247. }).show();
  248. g.dropIn = i;
  249. g.dragproxy.find(".l-drop-icon").removeClass("l-drop-no").addClass("l-drop-yes");
  250. }
  251. else
  252. {
  253. g.dropIn = -1;
  254. g.droptip.hide();
  255. g.dragproxy.find(".l-drop-icon").removeClass("l-drop-yes").addClass("l-drop-no");
  256. }
  257. });
  258. },
  259. onStopDrag: function (current, e)
  260. {
  261. if (g.dropIn > -1)
  262. {
  263. var to = g.tab.links.ul.find('>li:eq(' + g.dropIn + ')').attr("tabid");
  264. var from = $(current.target).attr("tabid");
  265. setTimeout(function ()
  266. {
  267. g.moveTabItem(from, to);
  268. }, 0);
  269. g.dropIn = -1;
  270. g.dragproxy.remove();
  271. }
  272. g.droptip.hide();
  273. this.set('cursor', 'default');
  274. }
  275. });
  276. return drag;
  277. },
  278. _setDragToMove: function (value)
  279. {
  280. if (!$.fn.ligerDrag) return; //需要ligerDrag的支持
  281. var g = this, p = this.options;
  282. if (value)
  283. {
  284. if (g.drags) return;
  285. g.drags = g.drags || [];
  286. g.tab.links.ul.find('>li').each(function ()
  287. {
  288. g.drags.push(g._applyDrag(this));
  289. });
  290. }
  291. },
  292. moveTabItem: function (fromTabItemID, toTabItemID)
  293. {
  294. var g = this;
  295. var from = g.tab.links.ul.find(">li[tabid=" + fromTabItemID + "]");
  296. var to = g.tab.links.ul.find(">li[tabid=" + toTabItemID + "]");
  297. var index1 = g.tab.links.ul.find(">li").index(from);
  298. var index2 = g.tab.links.ul.find(">li").index(to);
  299. if (index1 < index2)
  300. {
  301. to.after(from);
  302. }
  303. else
  304. {
  305. to.before(from);
  306. }
  307. },
  308. //设置tab按钮(左和右),显示返回true,隐藏返回false
  309. setTabButton: function ()
  310. {
  311. var g = this, p = this.options;
  312. var sumwidth = 0;
  313. $("li", g.tab.links.ul).each(function ()
  314. {
  315. sumwidth += $(this).width() + 2;
  316. });
  317. var mainwidth = g.tab.width();
  318. if (sumwidth > mainwidth)
  319. {
  320. g.tab.links.append('<div class="l-tab-links-left"></div><div class="l-tab-links-right"></div>');
  321. g.setTabButtonEven();
  322. return true;
  323. } else
  324. {
  325. g.tab.links.ul.animate({ left: 0 });
  326. $(".l-tab-links-left,.l-tab-links-right", g.tab.links).remove();
  327. return false;
  328. }
  329. },
  330. //设置左右按钮的事件 标签超出最大宽度时,可左右拖动
  331. setTabButtonEven: function ()
  332. {
  333. var g = this, p = this.options;
  334. $(".l-tab-links-left", g.tab.links).hover(function ()
  335. {
  336. $(this).addClass("l-tab-links-left-over");
  337. }, function ()
  338. {
  339. $(this).removeClass("l-tab-links-left-over");
  340. }).click(function ()
  341. {
  342. g.moveToPrevTabItem();
  343. });
  344. $(".l-tab-links-right", g.tab.links).hover(function ()
  345. {
  346. $(this).addClass("l-tab-links-right-over");
  347. }, function ()
  348. {
  349. $(this).removeClass("l-tab-links-right-over");
  350. }).click(function ()
  351. {
  352. g.moveToNextTabItem();
  353. });
  354. },
  355. //切换到上一个tab
  356. moveToPrevTabItem: function ()
  357. {
  358. var g = this, p = this.options;
  359. var btnWitdth = $(".l-tab-links-left", g.tab.links).width();
  360. var leftList = new Array(); //记录每个tab的left,由左到右
  361. $("li", g.tab.links).each(function (i, item)
  362. {
  363. var currentItemLeft = -1 * btnWitdth;
  364. if (i > 0)
  365. {
  366. currentItemLeft = parseInt(leftList[i - 1]) + $(this).prev().width() + 2;
  367. }
  368. leftList.push(currentItemLeft);
  369. });
  370. var currentLeft = -1 * parseInt(g.tab.links.ul.css("left"));
  371. for (var i = 0; i < leftList.length - 1; i++)
  372. {
  373. if (leftList[i] < currentLeft && leftList[i + 1] >= currentLeft)
  374. {
  375. g.tab.links.ul.animate({ left: -1 * parseInt(leftList[i]) });
  376. return;
  377. }
  378. }
  379. },
  380. //切换到下一个tab
  381. moveToNextTabItem: function ()
  382. {
  383. var g = this, p = this.options;
  384. var btnWitdth = $(".l-tab-links-right", g.tab).width();
  385. var sumwidth = 0;
  386. var tabItems = $("li", g.tab.links.ul);
  387. tabItems.each(function ()
  388. {
  389. sumwidth += $(this).width() + 2;
  390. });
  391. var mainwidth = g.tab.width();
  392. var leftList = new Array(); //记录每个tab的left,由右到左
  393. for (var i = tabItems.length - 1; i >= 0; i--)
  394. {
  395. var currentItemLeft = sumwidth - mainwidth + btnWitdth + 2;
  396. if (i != tabItems.length - 1)
  397. {
  398. currentItemLeft = parseInt(leftList[tabItems.length - 2 - i]) - $(tabItems[i + 1]).width() - 2;
  399. }
  400. leftList.push(currentItemLeft);
  401. }
  402. var currentLeft = -1 * parseInt(g.tab.links.ul.css("left"));
  403. for (var j = 1; j < leftList.length; j++)
  404. {
  405. if (leftList[j] <= currentLeft && leftList[j - 1] > currentLeft)
  406. {
  407. g.tab.links.ul.animate({ left: -1 * parseInt(leftList[j - 1]) });
  408. return;
  409. }
  410. }
  411. },
  412. getTabItemCount: function ()
  413. {
  414. var g = this, p = this.options;
  415. return $("li", g.tab.links.ul).length;
  416. },
  417. getSelectedTabItemID: function ()
  418. {
  419. var g = this, p = this.options;
  420. return $("li.l-selected", g.tab.links.ul).attr("tabid");
  421. },
  422. removeSelectedTabItem: function ()
  423. {
  424. var g = this, p = this.options;
  425. g.removeTabItem(g.getSelectedTabItemID());
  426. },
  427. //覆盖选择的tabitem
  428. overrideSelectedTabItem: function (options)
  429. {
  430. var g = this, p = this.options;
  431. g.overrideTabItem(g.getSelectedTabItemID(), options);
  432. },
  433. //覆盖
  434. overrideTabItem: function (targettabid, options)
  435. {
  436. var g = this, p = this.options;
  437. if (g.trigger('beforeOverrideTabItem', [targettabid]) == false)
  438. return false;
  439. var tabid = options.tabid;
  440. if (tabid == undefined) tabid = g.getNewTabid();
  441. var url = options.url;
  442. var content = options.content;
  443. var target = options.target;
  444. var text = options.text;
  445. var showClose = options.showClose;
  446. var height = options.height;
  447. //如果已经存在
  448. if (g.isTabItemExist(tabid))
  449. {
  450. return;
  451. }
  452. var tabitem = $("li[tabid=" + targettabid + "]", g.tab.links.ul);
  453. var contentitem = $(".l-tab-content-item[tabid=" + targettabid + "]", g.tab.content);
  454. if (!tabitem || !contentitem) return;
  455. tabitem.attr("tabid", tabid);
  456. contentitem.attr("tabid", tabid);
  457. if ($("iframe", contentitem).length == 0 && url)
  458. {
  459. contentitem.html("<iframe frameborder='0'></iframe>");
  460. }
  461. else if (content)
  462. {
  463. contentitem.html(content);
  464. }
  465. $("iframe", contentitem).attr("name", tabid);
  466. if (showClose == undefined) showClose = true;
  467. if (showClose == false) $(".l-tab-links-item-close", tabitem).remove();
  468. else
  469. {
  470. if ($(".l-tab-links-item-close", tabitem).length == 0)
  471. tabitem.append("<div class='l-tab-links-item-close'></div>");
  472. }
  473. if (text == undefined) text = tabid;
  474. if (height) contentitem.height(height);
  475. $("a", tabitem).text(text);
  476. $("iframe", contentitem).attr("src", url);
  477. g.trigger('afterOverrideTabItem', [targettabid]);
  478. },
  479. //选中tab项
  480. selectTabItem: function (tabid)
  481. {
  482. var g = this, p = this.options;
  483. if (g.trigger('beforeSelectTabItem', [tabid]) == false)
  484. return false;
  485. g.selectedTabId = tabid;
  486. $("> .l-tab-content-item[tabid=" + tabid + "]", g.tab.content).show().siblings().hide();
  487. $("li[tabid=" + tabid + "]", g.tab.links.ul).addClass("l-selected").siblings().removeClass("l-selected");
  488. g.trigger('afterSelectTabItem', [tabid]);
  489. },
  490. //移动到最后一个tab
  491. moveToLastTabItem: function ()
  492. {
  493. var g = this, p = this.options;
  494. var sumwidth = 0;
  495. $("li", g.tab.links.ul).each(function ()
  496. {
  497. sumwidth += $(this).width() + 2;
  498. });
  499. var mainwidth = g.tab.width();
  500. if (sumwidth > mainwidth)
  501. {
  502. var btnWitdth = $(".l-tab-links-right", g.tab.links).width();
  503. g.tab.links.ul.animate({ left: -1 * (sumwidth - mainwidth + btnWitdth + 2) });
  504. }
  505. },
  506. //判断tab是否存在
  507. isTabItemExist: function (tabid)
  508. {
  509. var g = this, p = this.options;
  510. return $("li[tabid=" + tabid + "]", g.tab.links.ul).length > 0;
  511. },
  512. //增加一个tab
  513. addTabItem: function (options)
  514. {
  515. var g = this, p = this.options;
  516. if (g.trigger('beforeAddTabItem', [tabid]) == false)
  517. return false;
  518. var tabid = options.tabid;
  519. if (tabid == undefined) tabid = g.getNewTabid();
  520. var url = options.url;
  521. var content = options.content;
  522. var text = options.text;
  523. var showClose = options.showClose;
  524. var height = options.height;
  525. //如果已经存在
  526. if (g.isTabItemExist(tabid))
  527. {
  528. g.selectTabItem(tabid);
  529. return;
  530. }
  531. var tabitem = $("<li><a></a><div class='l-tab-links-item-left'></div><div class='l-tab-links-item-right'></div><div class='l-tab-links-item-close'></div></li>");
  532. var contentitem = $("<div class='l-tab-content-item'><div class='l-tab-loading' style='display:block;'></div><iframe frameborder='0'></iframe></div>");
  533. var iframeloading = $("div:first", contentitem);
  534. var iframe = $("iframe:first", contentitem);
  535. if (g.makeFullHeight)
  536. {
  537. var newheight = g.tab.height() - g.tab.links.height();
  538. contentitem.height(newheight);
  539. }
  540. tabitem.attr("tabid", tabid);
  541. contentitem.attr("tabid", tabid);
  542. if (url)
  543. {
  544. iframe.attr("name", tabid)
  545. .attr("id", tabid)
  546. .attr("src", url)
  547. .bind('load.tab', function ()
  548. {
  549. iframeloading.hide();
  550. if (options.callback)
  551. options.callback();
  552. });
  553. }
  554. else
  555. {
  556. iframe.remove();
  557. iframeloading.remove();
  558. }
  559. if (content)
  560. {
  561. contentitem.html(content);
  562. }
  563. else if (options.target)
  564. {
  565. contentitem.append(options.target);
  566. }
  567. if (showClose == undefined) showClose = true;
  568. if (showClose == false) $(".l-tab-links-item-close", tabitem).remove();
  569. if (text == undefined) text = tabid;
  570. if (height) contentitem.height(height);
  571. $("a", tabitem).text(text);
  572. g.tab.links.ul.append(tabitem);
  573. g.tab.content.append(contentitem);
  574. g.selectTabItem(tabid);
  575. if (g.setTabButton())
  576. {
  577. g.moveToLastTabItem();
  578. }
  579. //增加事件
  580. g._addTabItemEvent(tabitem);
  581. if (p.dragToMove && $.fn.ligerDrag)
  582. {
  583. g.drags = g.drags || [];
  584. tabitem.each(function ()
  585. {
  586. g.drags.push(g._applyDrag(this));
  587. });
  588. }
  589. g.trigger('afterAddTabItem', [tabid]);
  590. },
  591. _addTabItemEvent: function (tabitem)
  592. {
  593. var g = this, p = this.options;
  594. tabitem.click(function ()
  595. {
  596. var tabid = $(this).attr("tabid");
  597. g.selectTabItem(tabid);
  598. });
  599. //右键事件支持
  600. g.tab.menu && g._addTabItemContextMenuEven(tabitem);
  601. $(".l-tab-links-item-close", tabitem).hover(function ()
  602. {
  603. $(this).addClass("l-tab-links-item-close-over");
  604. }, function ()
  605. {
  606. $(this).removeClass("l-tab-links-item-close-over");
  607. }).click(function ()
  608. {
  609. var tabid = $(this).parent().attr("tabid");
  610. g.removeTabItem(tabid);
  611. });
  612. },
  613. //移除tab项
  614. removeTabItem: function (tabid)
  615. {
  616. var g = this, p = this.options;
  617. if (g.trigger('beforeRemoveTabItem', [tabid]) == false)
  618. return false;
  619. var currentIsSelected = $("li[tabid=" + tabid + "]", g.tab.links.ul).hasClass("l-selected");
  620. if (currentIsSelected)
  621. {
  622. $(".l-tab-content-item[tabid=" + tabid + "]", g.tab.content).prev().show();
  623. $("li[tabid=" + tabid + "]", g.tab.links.ul).prev().addClass("l-selected").siblings().removeClass("l-selected");
  624. }
  625. $(".l-tab-content-item[tabid=" + tabid + "]", g.tab.content).remove();
  626. $("li[tabid=" + tabid + "]", g.tab.links.ul).remove();
  627. g.setTabButton();
  628. g.trigger('afterRemoveTabItem', [tabid]);
  629. },
  630. addHeight: function (heightDiff)
  631. {
  632. var g = this, p = this.options;
  633. var newHeight = g.tab.height() + heightDiff;
  634. g.setHeight(newHeight);
  635. },
  636. setHeight: function (height)
  637. {
  638. var g = this, p = this.options;
  639. g.tab.height(height);
  640. g.setContentHeight();
  641. },
  642. setContentHeight: function ()
  643. {
  644. var g = this, p = this.options;
  645. var newheight = g.tab.height() - g.tab.links.height();
  646. g.tab.content.height(newheight);
  647. $("> .l-tab-content-item", g.tab.content).height(newheight);
  648. },
  649. getNewTabid: function ()
  650. {
  651. var g = this, p = this.options;
  652. g.getnewidcount = g.getnewidcount || 0;
  653. return 'tabitem' + (++g.getnewidcount);
  654. },
  655. //notabid 过滤掉tabid的
  656. //noclose 过滤掉没有关闭按钮的
  657. getTabidList: function (notabid, noclose)
  658. {
  659. var g = this, p = this.options;
  660. var tabidlist = [];
  661. $("> li", g.tab.links.ul).each(function ()
  662. {
  663. if ($(this).attr("tabid")
  664. && $(this).attr("tabid") != notabid
  665. && (!noclose || $(".l-tab-links-item-close", this).length > 0))
  666. {
  667. tabidlist.push($(this).attr("tabid"));
  668. }
  669. });
  670. return tabidlist;
  671. },
  672. removeOther: function (tabid, compel)
  673. {
  674. var g = this, p = this.options;
  675. var tabidlist = g.getTabidList(tabid, true);
  676. $(tabidlist).each(function ()
  677. {
  678. g.removeTabItem(this);
  679. });
  680. },
  681. reload: function (tabid)
  682. {
  683. var g = this, p = this.options;
  684. var contentitem = $(".l-tab-content-item[tabid=" + tabid + "]");
  685. var iframeloading = $(".l-tab-loading:first", contentitem);
  686. var iframe = $("iframe:first", contentitem);
  687. var url = $(iframe).attr("src");
  688. iframeloading.show();
  689. iframe.attr("src", url).unbind('load.tab').bind('load.tab', function ()
  690. {
  691. iframeloading.hide();
  692. });
  693. },
  694. removeAll: function (compel)
  695. {
  696. var g = this, p = this.options;
  697. var tabidlist = g.getTabidList(null, true);
  698. $(tabidlist).each(function ()
  699. {
  700. g.removeTabItem(this);
  701. });
  702. },
  703. onResize: function ()
  704. {
  705. var g = this, p = this.options;
  706. if (!p.height || typeof (p.height) != 'string' || p.height.indexOf('%') == -1) return false;
  707. //set tab height
  708. if (g.tab.parent()[0].tagName.toLowerCase() == "body")
  709. {
  710. var windowHeight = $(window).height();
  711. windowHeight -= parseInt(g.tab.parent().css('paddingTop'));
  712. windowHeight -= parseInt(g.tab.parent().css('paddingBottom'));
  713. g.height = p.heightDiff + windowHeight * parseFloat(g.height) * 0.01;
  714. }
  715. else
  716. {
  717. g.height = p.heightDiff + (g.tab.parent().height() * parseFloat(p.height) * 0.01);
  718. }
  719. g.tab.height(g.height);
  720. g.setContentHeight();
  721. },
  722. _menuItemClick: function (item)
  723. {
  724. var g = this, p = this.options;
  725. if (!item.id || !g.actionTabid) return;
  726. switch (item.id)
  727. {
  728. case "close":
  729. g.removeTabItem(g.actionTabid);
  730. g.actionTabid = null;
  731. break;
  732. case "closeother":
  733. g.removeOther(g.actionTabid);
  734. break;
  735. case "closeall":
  736. g.removeAll();
  737. g.actionTabid = null;
  738. break;
  739. case "reload":
  740. g.selectTabItem(g.actionTabid);
  741. g.reload(g.actionTabid);
  742. break;
  743. }
  744. },
  745. _addTabItemContextMenuEven: function (tabitem)
  746. {
  747. var g = this, p = this.options;
  748. tabitem.bind("contextmenu", function (e)
  749. {
  750. if (!g.tab.menu) return;
  751. g.actionTabid = tabitem.attr("tabid");
  752. g.tab.menu.show({ top: e.pageY, left: e.pageX });
  753. if ($(".l-tab-links-item-close", this).length == 0)
  754. {
  755. g.tab.menu.setDisabled('close');
  756. }
  757. else
  758. {
  759. g.tab.menu.setEnabled('close');
  760. }
  761. return false;
  762. });
  763. }
  764. });
  765. })(jQuery);