|
//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();
|
}
|