RoadFlow2.1 临时演示

roadui.tab.js 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. 
  2. //Tab标签
  3. ;RoadUI.Tab = function (options)
  4. {
  5. var defaults = {
  6. id: "",
  7. srcElement: null, //源对象,当此为空时则用ID获取
  8. replace: false, //如果打开相同ID的标签,则替换掉原标签
  9. dblclickclose: true, //是否双击关闭
  10. contextmenu: true, //是否有右键菜单
  11. maxtabs:-1 //最大tab数量
  12. };
  13. this.opts = $.extend(defaults, options);
  14. this.$tabDiv = null;
  15. if (this.opts.id.isNullOrEmpty() && this.opts.srcElement == null)
  16. {
  17. throw "要初始化为tab的对象或对象ID为空!"; return false;
  18. }
  19. else
  20. {
  21. this.$tabDiv = this.opts.srcElement != null ? $(this.opts.srcElement) : $("#" + this.opts.id);
  22. if (this.$tabDiv == null || this.$tabDiv.size() == 0)
  23. {
  24. throw "要初始化为tab的对象!"; return false;
  25. }
  26. }
  27. var instance = this;
  28. //是否显示了滚动条, 只有显示了滚动条在关闭按钮时才调整滚动
  29. this.scrollbar = false;
  30. this.opts.srcElement = this.$tabDiv;
  31. if (!this.opts.id)
  32. {
  33. this.opts.id = this.$srcObj.attr("id");
  34. }
  35. var contextMenu;
  36. //初始化标签
  37. this.init = function ()
  38. {
  39. var $contents = this.$tabDiv.children("div");
  40. var $tabTitle = $('<div class="tab_title"></div>');
  41. var $tabTitleLeft = $('<div class="tab_title_left"></div>');
  42. var $tabTitleRight = $('<div class="tab_title_right"></div>');
  43. var $tabTitleUL = $('<ul class="tab_title_ul" id="tab_ul_' + instance.opts.id + '"></ul>');
  44. var tabDivHeight = parseInt(this.$tabDiv.get(0).style.height) || 0;
  45. $tabTitleLeft.hide();
  46. $tabTitleRight.hide();
  47. var tabSize = instance.opts.maxtabs == -1 || instance.opts.maxtabs > $contents.size() ? $contents.size() : instance.opts.maxtabs;
  48. for (var i = 0; i < tabSize; i++)
  49. {
  50. var $tab = $contents.eq(i);
  51. var liID = this.getTabID($tab.attr("id"));
  52. var clickevent = $tab.attr("clickevent");
  53. var tabtitle = $tab.attr("title");
  54. var isTitle = tabtitle > 14;
  55. var fullTitle = tabtitle;
  56. tabtitle = isTitle ? tabtitle(0, 12) + "…" : tabtitle;
  57. //是否显示关闭按钮
  58. var isClose = $tab.attr("close") && ($tab.attr("close").toLowerCase() == "1" || $tab.attr("close").toLowerCase() == "true");
  59. var $li = $('<li class="tab_title_ul_li" ' + (clickevent ? 'clickevent="' + clickevent + '"' : '') + ' itemid="' + liID + '" close="' + (isClose ? "1" : "0") + '"></li>');
  60. var $divText = $('<div class="tab_title_ul_li_txt" ' + (isClose ? ' style="padding-right:2px;"' : '') + ' ' + (isTitle ? 'title="' + fullTitle + '"' : '') + '>' + tabtitle + '</div>');
  61. $li.bind("click", function ()
  62. {
  63. instance.setActive($(this).attr("itemid"));
  64. if ($(this).attr("clickevent"))
  65. {
  66. eval($(this).attr("clickevent"));
  67. }
  68. });
  69. if (this.opts.dblclickclose)
  70. {
  71. $li.bind("dblclick", function () { instance.closeTab($(this).attr("itemid")); });
  72. }
  73. var $divClose = $('<div class="tab_title_ul_li_close"><div class="tab_title_ul_li_close_div"></div></div>');
  74. if (isClose)
  75. {
  76. $divClose.bind("mouseover", function () { $(this).children("div").removeClass().addClass("tab_title_ul_li_close_div_over"); })
  77. .bind("mouseout", function () { $(this).children("div").removeClass().addClass("tab_title_ul_li_close_div"); })
  78. .bind("click", function () { instance.closeTab($(this).parent().attr("itemid")); });
  79. }
  80. else
  81. {
  82. $divClose.hide();
  83. }
  84. $li.append($divText, $divClose);
  85. $tabTitleUL.append($li);
  86. $tab.attr("title", "");
  87. $li.contextmenu(function (e)
  88. {
  89. instance.setActive($(this).attr("itemid"));
  90. if (contextMenu)
  91. {
  92. contextMenu.setDisabled(0, $(this).attr("close") && $(this).attr("close") == "1");
  93. }
  94. });
  95. //如果规定了高度,则限制溢出后显示滚动条
  96. if (tabDivHeight > 0 && !$tab.attr("isiframe"))
  97. {
  98. $tab.css({ "height": (tabDivHeight - 30) + "px", "overflow": "auto" });
  99. }
  100. }
  101. $tabTitleLeft.bind("mouseover", function ()
  102. {
  103. $(this).removeClass().addClass("tab_title_left_over");
  104. }).bind("mouseout", function ()
  105. {
  106. $(this).removeClass().addClass("tab_title_left");
  107. }).bind("click", function ()
  108. {
  109. instance.moveLeft(); ;
  110. });
  111. $tabTitleRight.bind("mouseover", function ()
  112. {
  113. $(this).removeClass().addClass("tab_title_right_over");
  114. }).bind("mouseout", function ()
  115. {
  116. $(this).removeClass().addClass("tab_title_right");
  117. }).bind("click", function ()
  118. {
  119. instance.moveRight()
  120. });
  121. $tabTitle.append($tabTitleLeft, $tabTitleUL, $tabTitleRight);
  122. $tabTitle.append('<div style="clear:both;"></div>');
  123. if ($contents.size() > 0)
  124. {
  125. $contents.first().before($tabTitle);
  126. this.setActive($contents.eq(0).attr("id")); //初始化时设置第一个标签为活动
  127. }
  128. else
  129. {
  130. this.$tabDiv.append($tabTitle);
  131. }
  132. if (instance.opts.contextmenu)
  133. {
  134. try
  135. {
  136. var baseurl = top.rootdir;
  137. contextMenu = new RoadUI.Menu({ srcElement: $tabTitleUL });
  138. contextMenu.addItem({ ico: baseurl + "images/ico/cross.png", title: "关闭", onclick: function () { instance.closeCurrent() } });
  139. contextMenu.addItem({ ico: "", title: "除此之外全部关闭", onclick: function () { instance.closeOther(); } });
  140. contextMenu.addItem({ ico: "", title: "全部关闭", onclick: function () { instance.closeAll(); } });
  141. contextMenu.addItem({ type: 1 });
  142. contextMenu.addItem({ ico: baseurl + "images/ico/Refresh.png", title: "刷新", onclick: function () { instance.refresh(); } });
  143. }
  144. catch (e) { }
  145. }
  146. this.checkMore(true, false, false, false);
  147. };
  148. this.getLength = function ()
  149. {
  150. return ($(".tab_title ul li", this.$tabDiv).size() || 0) + 1;
  151. };
  152. //设置活动标签
  153. //tabID 要设置的标签id
  154. this.setActive = function (tabID)
  155. {
  156. var $lis = this.$tabDiv.children(".tab_title").children("ul").children("li");
  157. var $contents = this.$tabDiv.children("div[id]");
  158. for (var i = 0; i < $lis.size(); i++)
  159. {
  160. var isCurrent = $lis.eq(i).attr("itemid") == tabID;
  161. $lis.eq(i).removeClass().addClass(isCurrent ? "tab_title_ul_li_over" : "tab_title_ul_li");
  162. $lis.eq(i).children("div:first").removeClass().addClass(isCurrent ? "tab_title_ul_li_txt_over" : "tab_title_ul_li_txt");
  163. }
  164. for (var i = 0; i < $contents.size(); i++)
  165. {
  166. var isCurrent = $contents.eq(i).attr("id") == tabID;
  167. if (isCurrent)
  168. {
  169. $contents.eq(i).show();
  170. }
  171. else
  172. {
  173. $contents.eq(i).hide();
  174. }
  175. }
  176. };
  177. //添加标签
  178. //id:"" 标签id如果为空,则自动生成
  179. //title:标签标题
  180. //close:是否可以关闭
  181. //html:标签显示的html
  182. //domid:标签显示的某个元素的id
  183. //src:标签显示的url地址,以iframe形式加载
  184. //callbakc:回调函数
  185. this.addTab = function (options)
  186. {
  187. if (instance.opts.maxtabs && instance.opts.maxtabs!=-1 && this.getLength() > instance.opts.maxtabs)
  188. {
  189. alert("您打开的标签太多了,请关闭一些无用的标签再试!");
  190. return;
  191. }
  192. var defaults = {
  193. id: "",
  194. title: "新标签", //标签标题
  195. close: true, //是否显示关闭按钮
  196. html: "",
  197. domid: "",
  198. src: "",
  199. callback: null //添加后回调函数
  200. };
  201. var opts = $.extend(defaults, options);
  202. var $ul = this.$tabDiv.children(".tab_title").children("ul");
  203. var tabHeight = parseInt(this.$tabDiv.get(0).style.height) || 0;
  204. if (this.opts.replace && opts.id && $ul.children("li[itemid='" + opts.id + "']").size() > 0)
  205. {
  206. this.closeTab(opts.id, false);
  207. }
  208. var fulltitle = opts.title;
  209. var isTitle = opts.title.length > 14;
  210. opts.title = isTitle ? opts.title.substr(0, 12) + "…" : opts.title;
  211. var tabID = this.getTabID(opts.id);
  212. var $li = $('<li class="tab_title_ul_li" itemid="' + tabID + '" close="' + (opts.close ? "1" : "0") + '"></li>');
  213. var $divText = $('<div class="tab_title_ul_li_txt"' + (opts.close ? ' style="padding-right:2px;"' : '') + ' ' + (isTitle ? 'title="' + fulltitle + '"' : '') + '>' + opts.title + '</div>');
  214. var $divClose = $('<div class="tab_title_ul_li_close"><div class="tab_title_ul_li_close_div"></div></div>');
  215. $divClose.bind("mouseover", function () { $(this).children("div").removeClass().addClass("tab_title_ul_li_close_div_over"); })
  216. .bind("mouseout", function () { $(this).children("div").removeClass().addClass("tab_title_ul_li_close_div"); })
  217. .bind("click", function () { instance.closeTab(tabID); });
  218. if (!opts.close)
  219. {
  220. $divClose.hide();
  221. }
  222. $li.append($divText, $divClose);
  223. $li.bind("click", function () { instance.setActive(tabID); });
  224. if (this.opts.dblclickclose)
  225. {
  226. $li.bind("dblclick", function () { instance.closeTab(tabID); });
  227. }
  228. var $content = $('<div id="' + tabID + '"></div>');
  229. if (opts.html)
  230. {
  231. $content.html(opts.html);
  232. }
  233. else if (opts.domid)
  234. {
  235. var $dom = $("#" + opts.domid);
  236. if ($dom != null)
  237. {
  238. $content.append($dom);
  239. }
  240. }
  241. else if (opts.src)
  242. {
  243. $content.attr("isiframe", "1");
  244. var iframdHeight = parseInt(this.$tabDiv.height());
  245. var iframeSrc = opts.src.indexOf('?') >= 0 ? opts.src + "&tabid=" + tabID : opts.src + "?tabid=" + tabID;
  246. var $iframe = $('<iframe id="' + tabID + '_iframe" name="' + tabID + '_iframe" frameborder="0" scrolling="auto" style="width:100%;' + (iframdHeight ? "height:" + (iframdHeight - 30).toString() + "px" : "") + '" src="' + iframeSrc + '"></iframe>');
  247. $content.append($iframe);
  248. }
  249. $li.contextmenu(function (e)
  250. {
  251. instance.setActive($(this).attr("itemid"));
  252. contextMenu.setDisabled(0, $(this).attr("close") && $(this).attr("close") == "1");
  253. });
  254. $ul.append($li);
  255. this.$tabDiv.append($content);
  256. this.setActive(tabID);
  257. this.checkMore(true, false, false, false);
  258. if ($.isFunction(opts.callback))
  259. {
  260. window.setTimeout(opts.callback, 1);
  261. }
  262. return tabID;
  263. };
  264. //关闭标签
  265. //id: 要关闭的标签id
  266. this.closeTab = function (id)
  267. {
  268. if (!id)
  269. {
  270. id = this.getActiveID();
  271. }
  272. var $li = this.$tabDiv.children(".tab_title").children("ul").children("li[itemid='" + id + "']");
  273. var $content = this.$tabDiv.children("#" + id);
  274. var isCurrent = $li.attr("class") == "tab_title_ul_li_over";
  275. if (isCurrent)
  276. {
  277. if ($li.prev().size() > 0)
  278. {
  279. this.setActive($li.prev().attr("itemid"));
  280. }
  281. else if ($li.next().size() > 0)
  282. {
  283. this.setActive($li.next().attr("itemid"));
  284. }
  285. }
  286. $li.remove();
  287. $content.find("iframe").attr("src", "about:blank");
  288. $content.find("iframe").remove();
  289. $content.remove();
  290. try { CollectGarbage(); } catch (e) { }
  291. if (this.scrollbar)
  292. {
  293. this.checkMore(true, true, false, false);
  294. }
  295. };
  296. //关闭全部可关闭的标签
  297. this.closeAll = function ()
  298. {
  299. var $lis = this.$tabDiv.children(".tab_title").children("ul").children("li[itemid]");
  300. for (var i = 0; i < $lis.size(); i++)
  301. {
  302. var close = $lis.eq(i).attr("close");
  303. if (close && close == "1")
  304. {
  305. this.closeTab($lis.eq(i).attr("itemid"));
  306. }
  307. }
  308. if (this.scrollbar)
  309. {
  310. this.checkMore(true, true, false, false);
  311. }
  312. };
  313. //关闭当前活动标签
  314. this.closeCurrent = function ()
  315. {
  316. var $li = this.$tabDiv.children(".tab_title").children("ul").children(".tab_title_ul_li_over");
  317. if ($li.size() > 0)
  318. {
  319. if ($li.attr("close") && $li.attr("close") == "1")
  320. {
  321. this.closeTab($li.attr("itemid"));
  322. }
  323. else
  324. {
  325. }
  326. }
  327. if (this.scrollbar)
  328. {
  329. this.checkMore(true, true, false, false);
  330. }
  331. };
  332. //关闭除当前标签以外的所有标签
  333. this.closeOther = function ()
  334. {
  335. var $lis = this.$tabDiv.children(".tab_title").children("ul").children("li[itemid][class!='tab_title_ul_li_over']");
  336. for (var i = 0; i < $lis.size(); i++)
  337. {
  338. var close = $lis.eq(i).attr("close");
  339. if (close && close == "1")
  340. {
  341. this.closeTab($lis.eq(i).attr("itemid"));
  342. }
  343. }
  344. if (this.scrollbar)
  345. {
  346. this.checkMore(true, true, false, false);
  347. }
  348. };
  349. //刷新标签
  350. this.refresh = function (id)
  351. {
  352. if (!id)
  353. {
  354. id = this.getActiveID();
  355. }
  356. var $content = this.$tabDiv.children("#" + id);
  357. if ($content.size() > 0 && $content.attr("isiframe") == "1")
  358. {
  359. var src = $content.children("iframe").attr("src");
  360. $content.children("iframe").attr("src", src);
  361. }
  362. };
  363. //得到当前活动标签ID
  364. this.getActiveID = function ()
  365. {
  366. var $li = this.$tabDiv.children(".tab_title").children("ul").children(".tab_title_ul_li_over");
  367. if ($li.size() > 0)
  368. {
  369. return $li.attr("itemid");
  370. }
  371. else
  372. {
  373. return "";
  374. }
  375. };
  376. //主窗口大小改变时调用
  377. this.topResize = function (height)
  378. {
  379. var $contents = this.$tabDiv.children("div[id][class!='ctxmenu']");
  380. for (var i = 0; i < $contents.size(); i++)
  381. {
  382. if ($contents.eq(i).attr("isiframe"))
  383. {
  384. $contents.eq(i).find("iframe").height(height);
  385. }
  386. }
  387. };
  388. //改变大小
  389. this.resize = function (options)
  390. {
  391. var defaults = {
  392. width: null,
  393. height: null
  394. };
  395. var opts = $.extend(defaults, options);
  396. if (opts.width)
  397. {
  398. this.$tabDiv.css("width", opts.width);
  399. }
  400. if (opts.height)
  401. {
  402. this.$tabDiv.css("height", opts.height);
  403. }
  404. if (opts.width || opts.height)
  405. {
  406. var $contents = this.$tabDiv.children("div[id][class!='ctxmenu']");
  407. for (var i = 0; i < $contents.size(); i++)
  408. {
  409. if (opts.height)
  410. {
  411. $contents.eq(i).height(opts.height - 30);
  412. if ($contents.eq(i).attr("isiframe"))
  413. {
  414. $contents.eq(i).find("iframe").height(opts.height - 30);
  415. }
  416. }
  417. if (opts.width)
  418. {
  419. $contents.eq(i).width(opts.width);
  420. if ($contents.eq(i).attr("isiframe"))
  421. {
  422. $contents.eq(i).find("iframe").width(opts.width);
  423. }
  424. }
  425. }
  426. this.checkMore(true, false, false, true);
  427. }
  428. };
  429. //检查移动
  430. //isMove:是否移动
  431. //isClose:是否执行的是close操作
  432. //isInit: 是否是第一次初始化,如果是则初始化应显示第一个标签
  433. //isResize:是否是调整大小
  434. this.checkMore = function (isMove, isClose, isInit, isResize)
  435. {
  436. var tabWidth = (parseInt(this.$tabDiv.width()) || 36) - 36;
  437. var ulWidth = 0;
  438. var $tabTitle = this.$tabDiv.children(".tab_title");
  439. var $tabUL = $tabTitle.children("ul");
  440. var $lis = $tabUL.children("li");
  441. for (var i = 0; i < $lis.size(); i++)
  442. {
  443. ulWidth += parseInt($lis.eq(i).width()) || 0;
  444. ulWidth += 2;
  445. }
  446. var $tabLeft = $tabTitle.children(".tab_title_left");
  447. var $tabRight = $tabTitle.children(".tab_title_right");
  448. if (ulWidth > tabWidth)
  449. {
  450. //是移动 并且 (不是关闭 或者 关闭到tab宽度的1/3时调整显示标签)
  451. if (isMove && (!isClose || ulWidth - Math.abs(parseInt($tabUL.css("left")) || 0) <= tabWidth / 3))
  452. {
  453. //如果是初始化则left应该在起始位置
  454. var left = isInit ? 19 : tabWidth - ulWidth;
  455. $tabLeft.show();
  456. $tabRight.show();
  457. $tabUL.animate({ left: left });
  458. this.scrollbar = true;
  459. }
  460. return ulWidth;
  461. }
  462. else
  463. {
  464. this.scrollbar = false;
  465. $tabLeft.hide();
  466. $tabRight.hide();
  467. if (isMove && (isClose || isResize))
  468. {
  469. $tabUL.animate({ left: 2 });
  470. }
  471. return 0;
  472. }
  473. };
  474. //左移动
  475. this.moveLeft = function ()
  476. {
  477. var ulWidth = this.checkMore(false, false, false, false);
  478. if (ulWidth == 0)
  479. {
  480. return;
  481. }
  482. var $tabTitle = this.$tabDiv.children(".tab_title");
  483. var $tabUL = $tabTitle.children("ul");
  484. var tabLeft = parseInt($tabUL.css("left")) || 0;
  485. if (ulWidth - Math.abs(tabLeft) < (parseInt($tabTitle.width()) || 36))
  486. {
  487. return;
  488. }
  489. var left = tabLeft - 200;
  490. $tabUL.animate({ left: left });
  491. };
  492. //右移动
  493. this.moveRight = function ()
  494. {
  495. var ulWidth = this.checkMore(false, false, false, false);
  496. if (ulWidth == 0)
  497. {
  498. return;
  499. }
  500. var $tabUL = this.$tabDiv.children(".tab_title").children("ul");
  501. var tabLeft = parseInt($tabUL.css("left")) || 0;
  502. var left = tabLeft + 200;
  503. if (left > 19)
  504. {
  505. left = 19;
  506. }
  507. else if (tabLeft == 19)
  508. {
  509. return;
  510. }
  511. $tabUL.animate({ left: left });
  512. };
  513. //得到tab ID
  514. this.getTabID = function (id)
  515. {
  516. return id && this.$tabDiv.children(".tab_title").children("ul").children("li[itemid='" + id + "']").size() == 0 ? id : "tab_" + RoadUI.Core.newid(false);
  517. };
  518. this.init();
  519. }