| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530 |
-
- //Tab标签
- ;RoadUI.Tab = function (options)
- {
- var defaults = {
- id: "",
- srcElement: null, //源对象,当此为空时则用ID获取
- replace: false, //如果打开相同ID的标签,则替换掉原标签
- dblclickclose: true, //是否双击关闭
- contextmenu: true, //是否有右键菜单
- maxtabs:-1 //最大tab数量
- };
- this.opts = $.extend(defaults, options);
- this.$tabDiv = null;
- if (this.opts.id.isNullOrEmpty() && this.opts.srcElement == null)
- {
- throw "要初始化为tab的对象或对象ID为空!"; return false;
- }
- else
- {
- this.$tabDiv = this.opts.srcElement != null ? $(this.opts.srcElement) : $("#" + this.opts.id);
- if (this.$tabDiv == null || this.$tabDiv.size() == 0)
- {
- throw "要初始化为tab的对象!"; return false;
- }
- }
- var instance = this;
- //是否显示了滚动条, 只有显示了滚动条在关闭按钮时才调整滚动
- this.scrollbar = false;
- this.opts.srcElement = this.$tabDiv;
- if (!this.opts.id)
- {
- this.opts.id = this.$srcObj.attr("id");
- }
- var contextMenu;
- //初始化标签
- this.init = function ()
- {
- var $contents = this.$tabDiv.children("div");
- var $tabTitle = $('<div class="tab_title"></div>');
- var $tabTitleLeft = $('<div class="tab_title_left"></div>');
- var $tabTitleRight = $('<div class="tab_title_right"></div>');
- var $tabTitleUL = $('<ul class="tab_title_ul" id="tab_ul_' + instance.opts.id + '"></ul>');
- var tabDivHeight = parseInt(this.$tabDiv.get(0).style.height) || 0;
- $tabTitleLeft.hide();
- $tabTitleRight.hide();
- var tabSize = instance.opts.maxtabs == -1 || instance.opts.maxtabs > $contents.size() ? $contents.size() : instance.opts.maxtabs;
- for (var i = 0; i < tabSize; i++)
- {
- var $tab = $contents.eq(i);
- var liID = this.getTabID($tab.attr("id"));
- var clickevent = $tab.attr("clickevent");
- var tabtitle = $tab.attr("title");
- var isTitle = tabtitle > 14;
- var fullTitle = tabtitle;
- tabtitle = isTitle ? tabtitle(0, 12) + "…" : tabtitle;
- //是否显示关闭按钮
- var isClose = $tab.attr("close") && ($tab.attr("close").toLowerCase() == "1" || $tab.attr("close").toLowerCase() == "true");
- var $li = $('<li class="tab_title_ul_li" ' + (clickevent ? 'clickevent="' + clickevent + '"' : '') + ' itemid="' + liID + '" close="' + (isClose ? "1" : "0") + '"></li>');
- var $divText = $('<div class="tab_title_ul_li_txt" ' + (isClose ? ' style="padding-right:2px;"' : '') + ' ' + (isTitle ? 'title="' + fullTitle + '"' : '') + '>' + tabtitle + '</div>');
- $li.bind("click", function ()
- {
- instance.setActive($(this).attr("itemid"));
- if ($(this).attr("clickevent"))
- {
- eval($(this).attr("clickevent"));
- }
- });
- if (this.opts.dblclickclose)
- {
- $li.bind("dblclick", function () { instance.closeTab($(this).attr("itemid")); });
- }
- var $divClose = $('<div class="tab_title_ul_li_close"><div class="tab_title_ul_li_close_div"></div></div>');
- if (isClose)
- {
- $divClose.bind("mouseover", function () { $(this).children("div").removeClass().addClass("tab_title_ul_li_close_div_over"); })
- .bind("mouseout", function () { $(this).children("div").removeClass().addClass("tab_title_ul_li_close_div"); })
- .bind("click", function () { instance.closeTab($(this).parent().attr("itemid")); });
- }
- else
- {
- $divClose.hide();
- }
- $li.append($divText, $divClose);
- $tabTitleUL.append($li);
- $tab.attr("title", "");
- $li.contextmenu(function (e)
- {
- instance.setActive($(this).attr("itemid"));
- if (contextMenu)
- {
- contextMenu.setDisabled(0, $(this).attr("close") && $(this).attr("close") == "1");
- }
- });
- //如果规定了高度,则限制溢出后显示滚动条
- if (tabDivHeight > 0 && !$tab.attr("isiframe"))
- {
- $tab.css({ "height": (tabDivHeight - 30) + "px", "overflow": "auto" });
- }
- }
- $tabTitleLeft.bind("mouseover", function ()
- {
- $(this).removeClass().addClass("tab_title_left_over");
- }).bind("mouseout", function ()
- {
- $(this).removeClass().addClass("tab_title_left");
- }).bind("click", function ()
- {
- instance.moveLeft(); ;
- });
- $tabTitleRight.bind("mouseover", function ()
- {
- $(this).removeClass().addClass("tab_title_right_over");
- }).bind("mouseout", function ()
- {
- $(this).removeClass().addClass("tab_title_right");
- }).bind("click", function ()
- {
- instance.moveRight()
- });
- $tabTitle.append($tabTitleLeft, $tabTitleUL, $tabTitleRight);
- $tabTitle.append('<div style="clear:both;"></div>');
- if ($contents.size() > 0)
- {
- $contents.first().before($tabTitle);
- this.setActive($contents.eq(0).attr("id")); //初始化时设置第一个标签为活动
- }
- else
- {
- this.$tabDiv.append($tabTitle);
- }
- if (instance.opts.contextmenu)
- {
- try
- {
- var baseurl = top.rootdir;
- contextMenu = new RoadUI.Menu({ srcElement: $tabTitleUL });
- contextMenu.addItem({ ico: baseurl + "images/ico/cross.png", title: "关闭", onclick: function () { instance.closeCurrent() } });
- contextMenu.addItem({ ico: "", title: "除此之外全部关闭", onclick: function () { instance.closeOther(); } });
- contextMenu.addItem({ ico: "", title: "全部关闭", onclick: function () { instance.closeAll(); } });
- contextMenu.addItem({ type: 1 });
- contextMenu.addItem({ ico: baseurl + "images/ico/Refresh.png", title: "刷新", onclick: function () { instance.refresh(); } });
- }
- catch (e) { }
- }
- this.checkMore(true, false, false, false);
- };
- this.getLength = function ()
- {
- return ($(".tab_title ul li", this.$tabDiv).size() || 0) + 1;
- };
- //设置活动标签
- //tabID 要设置的标签id
- this.setActive = function (tabID)
- {
- var $lis = this.$tabDiv.children(".tab_title").children("ul").children("li");
- var $contents = this.$tabDiv.children("div[id]");
- for (var i = 0; i < $lis.size(); i++)
- {
- var isCurrent = $lis.eq(i).attr("itemid") == tabID;
- $lis.eq(i).removeClass().addClass(isCurrent ? "tab_title_ul_li_over" : "tab_title_ul_li");
- $lis.eq(i).children("div:first").removeClass().addClass(isCurrent ? "tab_title_ul_li_txt_over" : "tab_title_ul_li_txt");
- }
- for (var i = 0; i < $contents.size(); i++)
- {
- var isCurrent = $contents.eq(i).attr("id") == tabID;
- if (isCurrent)
- {
- $contents.eq(i).show();
- }
- else
- {
- $contents.eq(i).hide();
- }
- }
- };
- //添加标签
- //id:"" 标签id如果为空,则自动生成
- //title:标签标题
- //close:是否可以关闭
- //html:标签显示的html
- //domid:标签显示的某个元素的id
- //src:标签显示的url地址,以iframe形式加载
- //callbakc:回调函数
- this.addTab = function (options)
- {
- if (instance.opts.maxtabs && instance.opts.maxtabs!=-1 && this.getLength() > instance.opts.maxtabs)
- {
- alert("您打开的标签太多了,请关闭一些无用的标签再试!");
- return;
- }
- var defaults = {
- id: "",
- title: "新标签", //标签标题
- close: true, //是否显示关闭按钮
- html: "",
- domid: "",
- src: "",
- callback: null //添加后回调函数
- };
-
- var opts = $.extend(defaults, options);
- var $ul = this.$tabDiv.children(".tab_title").children("ul");
- var tabHeight = parseInt(this.$tabDiv.get(0).style.height) || 0;
- if (this.opts.replace && opts.id && $ul.children("li[itemid='" + opts.id + "']").size() > 0)
- {
- this.closeTab(opts.id, false);
- }
- var fulltitle = opts.title;
- var isTitle = opts.title.length > 14;
- opts.title = isTitle ? opts.title.substr(0, 12) + "…" : opts.title;
- var tabID = this.getTabID(opts.id);
- var $li = $('<li class="tab_title_ul_li" itemid="' + tabID + '" close="' + (opts.close ? "1" : "0") + '"></li>');
- var $divText = $('<div class="tab_title_ul_li_txt"' + (opts.close ? ' style="padding-right:2px;"' : '') + ' ' + (isTitle ? 'title="' + fulltitle + '"' : '') + '>' + opts.title + '</div>');
- var $divClose = $('<div class="tab_title_ul_li_close"><div class="tab_title_ul_li_close_div"></div></div>');
- $divClose.bind("mouseover", function () { $(this).children("div").removeClass().addClass("tab_title_ul_li_close_div_over"); })
- .bind("mouseout", function () { $(this).children("div").removeClass().addClass("tab_title_ul_li_close_div"); })
- .bind("click", function () { instance.closeTab(tabID); });
- if (!opts.close)
- {
- $divClose.hide();
- }
- $li.append($divText, $divClose);
- $li.bind("click", function () { instance.setActive(tabID); });
- if (this.opts.dblclickclose)
- {
- $li.bind("dblclick", function () { instance.closeTab(tabID); });
- }
- var $content = $('<div id="' + tabID + '"></div>');
- if (opts.html)
- {
- $content.html(opts.html);
- }
- else if (opts.domid)
- {
- var $dom = $("#" + opts.domid);
- if ($dom != null)
- {
- $content.append($dom);
- }
- }
- else if (opts.src)
- {
- $content.attr("isiframe", "1");
- var iframdHeight = parseInt(this.$tabDiv.height());
- var iframeSrc = opts.src.indexOf('?') >= 0 ? opts.src + "&tabid=" + tabID : opts.src + "?tabid=" + tabID;
- 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>');
- $content.append($iframe);
- }
- $li.contextmenu(function (e)
- {
- instance.setActive($(this).attr("itemid"));
- contextMenu.setDisabled(0, $(this).attr("close") && $(this).attr("close") == "1");
- });
- $ul.append($li);
- this.$tabDiv.append($content);
- this.setActive(tabID);
- this.checkMore(true, false, false, false);
- if ($.isFunction(opts.callback))
- {
- window.setTimeout(opts.callback, 1);
- }
- return tabID;
- };
- //关闭标签
- //id: 要关闭的标签id
- this.closeTab = function (id)
- {
- if (!id)
- {
- id = this.getActiveID();
- }
- var $li = this.$tabDiv.children(".tab_title").children("ul").children("li[itemid='" + id + "']");
- var $content = this.$tabDiv.children("#" + id);
- var isCurrent = $li.attr("class") == "tab_title_ul_li_over";
- if (isCurrent)
- {
- if ($li.prev().size() > 0)
- {
- this.setActive($li.prev().attr("itemid"));
- }
- else if ($li.next().size() > 0)
- {
- this.setActive($li.next().attr("itemid"));
- }
- }
- $li.remove();
- $content.find("iframe").attr("src", "about:blank");
- $content.find("iframe").remove();
- $content.remove();
- try { CollectGarbage(); } catch (e) { }
- if (this.scrollbar)
- {
- this.checkMore(true, true, false, false);
- }
- };
- //关闭全部可关闭的标签
- this.closeAll = function ()
- {
- var $lis = this.$tabDiv.children(".tab_title").children("ul").children("li[itemid]");
- for (var i = 0; i < $lis.size(); i++)
- {
- var close = $lis.eq(i).attr("close");
- if (close && close == "1")
- {
- this.closeTab($lis.eq(i).attr("itemid"));
- }
- }
- if (this.scrollbar)
- {
- this.checkMore(true, true, false, false);
- }
- };
- //关闭当前活动标签
- this.closeCurrent = function ()
- {
- var $li = this.$tabDiv.children(".tab_title").children("ul").children(".tab_title_ul_li_over");
- if ($li.size() > 0)
- {
- if ($li.attr("close") && $li.attr("close") == "1")
- {
- this.closeTab($li.attr("itemid"));
- }
- else
- {
- }
- }
- if (this.scrollbar)
- {
- this.checkMore(true, true, false, false);
- }
- };
- //关闭除当前标签以外的所有标签
- this.closeOther = function ()
- {
- var $lis = this.$tabDiv.children(".tab_title").children("ul").children("li[itemid][class!='tab_title_ul_li_over']");
- for (var i = 0; i < $lis.size(); i++)
- {
- var close = $lis.eq(i).attr("close");
- if (close && close == "1")
- {
- this.closeTab($lis.eq(i).attr("itemid"));
- }
- }
- if (this.scrollbar)
- {
- this.checkMore(true, true, false, false);
- }
- };
- //刷新标签
- this.refresh = function (id)
- {
- if (!id)
- {
- id = this.getActiveID();
- }
- var $content = this.$tabDiv.children("#" + id);
- if ($content.size() > 0 && $content.attr("isiframe") == "1")
- {
- var src = $content.children("iframe").attr("src");
- $content.children("iframe").attr("src", src);
- }
- };
- //得到当前活动标签ID
- this.getActiveID = function ()
- {
- var $li = this.$tabDiv.children(".tab_title").children("ul").children(".tab_title_ul_li_over");
- if ($li.size() > 0)
- {
- return $li.attr("itemid");
- }
- else
- {
- return "";
- }
- };
- //主窗口大小改变时调用
- this.topResize = function (height)
- {
- var $contents = this.$tabDiv.children("div[id][class!='ctxmenu']");
- for (var i = 0; i < $contents.size(); i++)
- {
- if ($contents.eq(i).attr("isiframe"))
- {
- $contents.eq(i).find("iframe").height(height);
- }
- }
- };
- //改变大小
- this.resize = function (options)
- {
- var defaults = {
- width: null,
- height: null
- };
- var opts = $.extend(defaults, options);
- if (opts.width)
- {
- this.$tabDiv.css("width", opts.width);
- }
- if (opts.height)
- {
- this.$tabDiv.css("height", opts.height);
- }
- if (opts.width || opts.height)
- {
- var $contents = this.$tabDiv.children("div[id][class!='ctxmenu']");
- for (var i = 0; i < $contents.size(); i++)
- {
- if (opts.height)
- {
- $contents.eq(i).height(opts.height - 30);
- if ($contents.eq(i).attr("isiframe"))
- {
- $contents.eq(i).find("iframe").height(opts.height - 30);
- }
- }
- if (opts.width)
- {
- $contents.eq(i).width(opts.width);
- if ($contents.eq(i).attr("isiframe"))
- {
- $contents.eq(i).find("iframe").width(opts.width);
- }
- }
- }
- this.checkMore(true, false, false, true);
- }
- };
- //检查移动
- //isMove:是否移动
- //isClose:是否执行的是close操作
- //isInit: 是否是第一次初始化,如果是则初始化应显示第一个标签
- //isResize:是否是调整大小
- this.checkMore = function (isMove, isClose, isInit, isResize)
- {
- var tabWidth = (parseInt(this.$tabDiv.width()) || 36) - 36;
- var ulWidth = 0;
- var $tabTitle = this.$tabDiv.children(".tab_title");
- var $tabUL = $tabTitle.children("ul");
- var $lis = $tabUL.children("li");
- for (var i = 0; i < $lis.size(); i++)
- {
- ulWidth += parseInt($lis.eq(i).width()) || 0;
- ulWidth += 2;
- }
- var $tabLeft = $tabTitle.children(".tab_title_left");
- var $tabRight = $tabTitle.children(".tab_title_right");
- if (ulWidth > tabWidth)
- {
- //是移动 并且 (不是关闭 或者 关闭到tab宽度的1/3时调整显示标签)
- if (isMove && (!isClose || ulWidth - Math.abs(parseInt($tabUL.css("left")) || 0) <= tabWidth / 3))
- {
- //如果是初始化则left应该在起始位置
- var left = isInit ? 19 : tabWidth - ulWidth;
- $tabLeft.show();
- $tabRight.show();
- $tabUL.animate({ left: left });
- this.scrollbar = true;
- }
- return ulWidth;
- }
- else
- {
- this.scrollbar = false;
- $tabLeft.hide();
- $tabRight.hide();
- if (isMove && (isClose || isResize))
- {
- $tabUL.animate({ left: 2 });
- }
- return 0;
- }
- };
- //左移动
- this.moveLeft = function ()
- {
- var ulWidth = this.checkMore(false, false, false, false);
- if (ulWidth == 0)
- {
- return;
- }
- var $tabTitle = this.$tabDiv.children(".tab_title");
- var $tabUL = $tabTitle.children("ul");
- var tabLeft = parseInt($tabUL.css("left")) || 0;
- if (ulWidth - Math.abs(tabLeft) < (parseInt($tabTitle.width()) || 36))
- {
- return;
- }
- var left = tabLeft - 200;
- $tabUL.animate({ left: left });
- };
- //右移动
- this.moveRight = function ()
- {
- var ulWidth = this.checkMore(false, false, false, false);
- if (ulWidth == 0)
- {
- return;
- }
- var $tabUL = this.$tabDiv.children(".tab_title").children("ul");
- var tabLeft = parseInt($tabUL.css("left")) || 0;
- var left = tabLeft + 200;
- if (left > 19)
- {
- left = 19;
- }
- else if (tabLeft == 19)
- {
- return;
- }
- $tabUL.animate({ left: left });
- };
- //得到tab ID
- this.getTabID = function (id)
- {
- return id && this.$tabDiv.children(".tab_title").children("ul").children("li[itemid='" + id + "']").size() == 0 ? id : "tab_" + RoadUI.Core.newid(false);
- };
- this.init();
- }
|