我现在还是一个大学生,在做课程设计的时候,要使用到tab页。在网上搜到了好多,但大多都是基于某个框架的。本人虽然能力有限,但还是不太习惯使用别人写好的框架,这样太限制思维了,学不到真正的东西。于是我自己参考了网上的标签页源码,自己做了一个。
废话不多说,先上张图

标签页的代码如下:
/*******************************************************************
* NAME : 标签页控制器
*
* AUTHOR : 张琦
* DATE : 2011-1-12
*
* COMMENT :
* 纯JavaScript写的标签页控制器。
* 本标签页控制器要依赖一个数组函数扩展。
* 要依赖一个CSS样式来定义显示效果,不然本脚本基本上
* 没有任何效果。
* 另外,本脚本中用到了“闭包”,所以多数函数都是使用的
* 内部定义方式,而没有使用原型prototype。
*******************************************************************/
/**
@Desc: 标签页
@Param {string} name 标签条面板ID号
@Param {string} title 标签条内容ID号
@Param {string} url 标签条面板ID号
@Param {string} option 标签条内容ID号
*/
function TabPage(name,title,url,option)
{
var own=this;
option=option||{};
option.enable=(option.enable==null?true:option.enable);
option.closable=(option.closable==null?true:option.closable);
option.visible=(option.visible==null?true:option.visible);
own.name=name; //标签页唯一名称
own.title=title; //标签页标题
own.url=url; //标签页内容真实路径
own.enable=option.enable?true:false; //是否启用
own.closable=option.closable?true:false; //是否可关闭
own.visible=option.visible?true:false; //是否可视
}
/**
@Desc: 标签页控制器类定义
@Param {string} barId 标签条面板ID号
@Param {string} contentId 标签条内容ID号
*/
function TabControl(barId,contentId)
{
var own=this;
//#region 事件
/**
@Desc: 关闭标签页时的事件
@Event: funtion(srcTab)
@Args {String} srcTab 将要关闭的标签
@Value {Boolean} 若返回false可阻止关闭
*/
own.onClose=null;
/**
@Desc: 添加标签页时的事件
@Event: function(name,title,url,option)
@Args {String} name 待建立标签页唯一标识符
@Args {Number} title 待建立标签页的标题
@Args {String} url 待建立标签页内容的实际路径
@Args {Object} option 待建立标签页设置选项
@Value {Boolean} 若返回false可阻止新建
*/
own.onAdding=null;
/**
@Desc: 添加标签页后的事件
@Event: function(name,title,url,option)
@Args {String} name 待建立标签页唯一标识符
@Args {Number} title 待建立标签页的标题
@Args {String} url 待建立标签页内容的实际路径
@Args {Object} option 待建立标签页设置选项
@Value {Void} 没有作用
*/
own.onAdded=null;
/**
@Desc: 选择标签页时的事件
@Event: function(tab,index)
@Args {Object} tab 将要被选择的标签
@Args {Number} index 将要被选择的标签页索引
@Value {Boolean} 若返回flase可阻止重新选择标签页
*/
own.onSelecting=null;
/**
@Desc: 选择标签页时的事件
@Event: function(tab,index)
@Args {Object} tab 重新被选择的标签页唯一标识符
@Args {Number} index 重新被选择的标签页索引
@Value {Void} 没有作用
*/
own.onSelected=null;
/**
@Desc: 取消选择标签页时的事件
@Event: function(tab,index)
@Args {Object} tab 将要被取消选择的标签页唯一标识符
@Args {Number} index 将要被取消选择的标签页索引
@Value {Boolean} 若返回flase可阻止重新选择标签页
*/
own.onDeselecting=null;
/**
@Desc: 取消选择标签页时的事件
@Event: function(tab,index)
@Args {Object} tab 重新被取消选择的标签页唯一标识符
@Args {Number} index 重新被取消选择的标签页索引
@Value {Void} 没有作用
*/
own.onDeselected=null;
/**
@Desc: 激活标签页索引改变时的事件
@Event: function(oldIndex,newIndex)
@Args {Number} oldIndex 之前被激活的标签索引
@Args {Number} newIndex 新近被激活的标签索引
@Value {Void} 没有作用
*/
own.onSelectIndexChanged=null;
/**
@Desc: 在标签上点击右键时的事件
@Event: function(tab,index,x,y)
@Args {Object} tab 被点击的标签
@Args {Number} index 被点击的标签索引
@Args {Number} x 点击时鼠标的x坐标
@Args {Number} y 点击时鼠标的x坐标
@Value {Void} 没有作用
*/
own.onContextMenu=null;
//#endregion
//#region 字段
var TabCtrlBar=null; //控制条容器
var TabContent=null; //内容容器
var objTabPages={}; //标签页对象(对象形式)
var arrTabPages=[]; //标签页对象(数组形式)
var captions={}; //标题对象
var contents={}; //内容对象
var selectTab=null; //当前激活的标签
var selectIndex=-1; //当前激活的标签索引
//#endregion
//#region 属性
own.getLength=function()
{return arrTabPages.length;}
own.getSelectIndex=function()
{return selectIndex;}
own.setSelectIndex=function(val)
{own.select(val);}
own.getSelectTab=function()
{return selectTab;}
own.setSelectTab=function(val)
{own.select(val);}
//#endregion
//#region 处理
/**
@Desc: 处理标签上单击事件
*/
function handleCaptionClick(name)
{
var sleTab=getTab(name);
if(sleTab.enable)
this.select(name);
}
function handleCloseClick(name)
{
if(this.getLength()<=1)
{
alert("最后一个标签不允许关闭!");
return;
}
var sleTab=getTab(name);
if(sleTab.enable&&sleTab.closable)
{
var sleIndex=this.getSelectIndex();
this.remove(name);
if(sleIndex<this.getLength())
this.select(sleIndex);
else
this.select(sleIndex-1);
}
}
function handleCaptionDblClick(name)
{
var sleTab=getTab(name);
if(sleTab.enable)
this.refresh(name);
}
//#endregion
//#region 方法
/**
@Desc: 真正的构造初始化函数
@Param {string} barId 标签条面板ID号
@Param {string} contentId 标签条内容ID号
*/
function init(barId,contentId)
{
var TitleTable = document.createElement("table");
TitleTable.cellPadding=0;
TitleTable.cellSpacing=0;
var titleBody = document.createElement("tbody");
var titleRow = document.createElement("tr");
titleBody.appendChild(titleRow);
TitleTable.appendChild(titleBody);
document.getElementById(barId).appendChild(TitleTable);
TabCtrlBar=titleRow;
TabContent=document.getElementById(contentId);
}
/**
@Desc: 创建标签页标题
@Param {String} name 标签条面板ID号
@Param {String} title 标签条标题
*/
function createCaption(name,title)
{
var TabCaption = document.createElement("table");
TabCaption.id="TabCaption_"+name;TabCaption.name="TabCaption_"+name;
TabCaption.className="TabPage_Caption";
TabCaption.cellPadding=0;TabCaption.cellSpacing=0;
var tbCaption = document.createElement("tbody");
var trCaption = document.createElement("tr");
//不显示内容,只显示背景图片,为了使标签显示完整
var tdLeft = document.createElement("td");
tdLeft.className = "tabPage_Left";
//作为标题显示
var tdMid = document.createElement("td");
tdMid.innerText = title;
tdMid.className = "tabPage_Middle";
tdMid.title = "双击刷新该页";
//不显示内容,只显示背景图片,为了使标签显示完整
var tdRight = document.createElement("td");
tdRight.className = "tabPage_Right";
//作为关闭按纽的容器
var tdClose = document.createElement("td");
tdClose.className = "tabPage_Middle";
//建立关闭按纽
var closeBtn = document.createElement("span");
closeBtn.id = "btn"+name;
closeBtn.title = "关闭此标签";
closeBtn.className = "tabPage_CloseBlur";
closeBtn.innerHTML=" ";
tdClose.appendChild(closeBtn);
trCaption.appendChild(tdLeft);
trCaption.appendChild(tdMid);
trCaption.appendChild(tdClose);
trCaption.appendChild(tdRight);
tbCaption.appendChild(trCaption);
TabCaption.appendChild(tbCaption);
closeBtn.onmouseover=function(){this.className="tabPage_CloseFocus";};
closeBtn.onmouseout=function(){this.className="tabPage_CloseBlur";};
closeBtn.onclick=function(){handleCloseClick.call(own,name);};
return TabCaption;
}
/**
@Desc: 创建标签页标题
@Param {String} name 标签条面板ID号
@Param {String} url 标签页实际内容路径
*/
function createContent(name,url)
{
var iFrame=document.createElement("iframe");
iFrame.id="TabContent_"+name;iFrame.name="TabContent_"+name;
iFrame.frameBorder=0;iFrame.className="tabPage_Frame";
if(url!=null)iFrame.src=url;
return iFrame;
}
function getTab(tab)
{
var page=null;
//索引数字
if((typeof tab=="number")||(Object.prototype.toString(tab)=="[object Number]"))
{page=arrTabPages[tab];}
//唯一标识字符串
else if((typeof tab=="string")||(Object.prototype.toString(tab)=="[object String]"))
{page=objTabPages[tab];}
else
{}
return page;
}
/**
@Desc: 添加标签页
@Param {String} name 标签条面板ID号
@Param {String} title 标签条标题
@Param {String} url 标签页实际内容路径
@Param {Object} option 标签页设置选项
enable {Boolean} 是否启用
closable{Boolean} 是否可关闭
visible {Boolean} 是否可视
@Return {Number} 创建标签页结果
-2 已有同名标签页
-1 触发事件禁止创建此标签页
0-n 新建标签页的索引号
*/
function add(name,title,url,option)
{
if(objTabPages[name])
return -2;
if(own.onAdding) //触发onAdding事件
if(!own.onAdding.apply(own,arguments))
return -1;
//创建标题条
var Caption=createCaption(name,title);
var Bar = document.createElement("td");
Bar.className="tabPage_Blur";
Bar.appendChild(Caption);
TabCtrlBar.appendChild(Bar);
//创建内容项
var Content=createContent(name,url);
TabContent.appendChild(Content);
//添加到内部数组中
captions[name]=Bar;
contents[name]=Content;
var tab=new TabPage(name,title,url,option);
objTabPages[name]=tab;
arrTabPages.push(tab);
//绑定标签事件
Caption.onselectstart=function(){return false;};
Caption.onclick=function(){handleCaptionClick.call(own,name);};
Caption.ondblclick=function(){handleCaptionDblClick.call(own,name);};
Caption.oncontextmenu=function(){if(own.onContextMenu)own.onContextMenu.call(own,objTabPages[name],arrTabPages.indexOf(objTabPages[name]),event.x,event.y);return false;};
if(own.onAdded) //触发onAdded事件
own.onAdded.apply(own,arguments);
return arrTabPages.length-1;
}
/**
@Desc: 选择标签页
@Param {Number|String} tab 标签页序号({Number})或标签页名称({String})
*/
function select(tab)
{
var newTab=getTab(tab);
if(newTab==selectTab)return; //如果新选择的标签和原选择的标签相同,则返回
var newIndex=arrTabPages.indexOf(newTab);
if(newTab&&-1!=newIndex)
{
if(own.onDeselecting) //触发onDeselecting事件
if(!own.onDeselecting(selectTab,selectIndex))
return;
if(own.onSelecting) //触发onSelecting事件
if(!own.onDeselecting(newTab,newIndex))
return;
try
{
captions[selectTab.name].className="TabPage_Blur";
contents[selectTab.name].style.display="none";
}
catch(ex){}
finally
{
captions[newTab.name].className="TabPage_Focus";
contents[newTab.name].style.display="block";
}
if(own.onDeselected) //触发onDeselected事件
own.onDeselecting(selectTab,selectIndex);
if(own.onSelected) //触发onSelected事件
own.onSelected(newTab,newIndex);
if(own.onSelectIndexChanged)//触发onSelectIndexChanged事件
own.onSelectIndexChanged(selectIndex,newIndex);
selectTab=newTab; //记录所选择的标签页
selectIndex=newIndex; //记录所选择的标签页序号
}
}
/**
@Desc: 添加标签页,并选择新添加的标签页
@Param {String} name 标签条面板ID号
@Param {String} title 标签条标题
@Param {String} url 标签页实际内容路径
@Param {Object} option 标签页设置选项
enable {Boolean} 是否启用
closable{Boolean} 是否可关闭
visible {Boolean} 是否可视
@Return {Number} 创建标签页结果
-2 已有同名标签页
-1 触发事件禁止创建此标签页
0-n 新建标签页的索引号
*/
function selectAdd(name,title,url,option)
{
own.add(name,title,url,option);
own.select(name);
}
/**
@Desc: 移除标签页
@Param {Number|String} tab 标签页序号({Number})或标签页名称({String})
*/
function remove(tab)
{
var oldTab=getTab(tab);
if(oldTab)
{
TabCtrlBar.removeChild(captions[oldTab.name]);
TabContent.removeChild(contents[oldTab.name]);
arrTabPages.remove(oldTab);
delete objTabPages[oldTab.name];
var newIndex=arrTabPages.indexOf(selectTab);
if(selectIndex!=newIndex)
{
if(own.onSelectIndexChanged)//触发onSelectIndexChanged事件
own.onSelectIndexChanged(selectIndex,newIndex);
this.setSelectIndex(newIndex);
}
}
}
/**
@Desc: 刷新标签页
@Param {Number|String} tab 标签页序号({Number})或标签页名称({String})
*/
function refresh(tab)
{
var sleTab=getTab(tab);
if(sleTab)
{
contents[sleTab.name].src="about:blank";
contents[sleTab.name].src=objTabPages[sleTab.name].url;
}
}
/**
@Desc: 启用标签页
@Param {Number|String} tab 标签页序号({Number})或标签页名称({String})
*/
function enable(tab)
{
var enTab=getTab(tab);
if(enTab)
{
captions[enTab.name].disabled=false;
enTab.enable=true;
}
}
/**
@Desc: 禁用标签页
@Param {Number|String} tab 标签页序号({Number})或标签页名称({String})
*/
function disable(tab)
{
var disTab=getTab(tab);
if(disTab)
{
captions[disTab.name].disabled=true;
disTab.enable=false;
}
}
//#endregion
//#region 导出表
own.add=add;
own.select=select;
own.selectAdd=selectAdd;
own.remove=remove;
own.refresh=refresh;
own.enable=enable;
own.disable=disable;
//#endregion
//调用初始化方法
init(barId,contentId);
}
标签页的样式表如下:
/*
.TabPage_Caption 标签页一个完整标题的表格
.tabPage_Blur 标签页失去焦点时的样式
.tabPage_focus 标签页获得焦点时的样式
.tabPage_Left 标签页的标签左半部分
.tabPage_Middle 标签页的标签中部
.tabPage_Right 标签页的标签右半部分
.tabPage_Frame 标签页实际内容框架
*/
.tabPage_Left, .tabPage_Middle, .tabPage_Right
{
border: 0;
margin: 0;
padding: 0;
height:25px;
}
.tabPage_Middle
{
font-size:12px;
font-weight:bold;
text-indent: 2px;
padding-right:3px;
cursor: default;
}
.tabPage_Blur .tabPage_Left
{
background : url("tabpage/tabblur.gif");
background-position:left bottom;
width:5px;
}
.tabPage_Blur .tabPage_Middle
{
background : url("tabpage/midblur.gif");
color: #2F79C1;
padding-top: 4px;
}
.tabPage_Blur .tabPage_Right
{
background : url("tabpage/tabblur.gif");
background-position:right bottom;
width:5px;
}
.tabPage_Focus .tabPage_Left
{
background : url("tabpage/tabfocus.gif");
background-position:left bottom;
width:5px;
}
.tabPage_Focus .tabPage_Middle
{
background : url("tabpage/midfocus.gif");
color: #000000;
padding-top: 0px;
}
.tabPage_Focus .tabPage_Right
{
background : url("tabpage/tabfocus.gif");
background-position:right bottom;
width:5px;
}
.tabPage_CloseBlur
{
cursor: hand;
background-image: url(tabpage/closeblur.gif);
background-repeat: no-repeat;
background-position: 1px 4px;
width: 14px;
height: 20px;
}
.tabPage_CloseFocus
{
cursor: hand;
background-image: url(tabpage/closefocus.gif);
background-position: 0px 3px;
width: 14px;
height: 20px;
}
.tabPage_Frame
{
width: 100%;
height: 100%;
margin: 0;
padding: 0;
border: 1px solid gray;
overflow: auto;
display: none;
}
调用方法
<html>
<head>
<title>TabPage测试页</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="Page-Exit" content="revealTrans(Duration=1.0,Transition=13)">
<link rel="stylesheet" href="tabpage.css">
</head>
<body>
<table id="mainFrame" cellspacing="0" cellpadding="0" width="100%" height="100%">
<tr>
<td id="tabTT" height="25px"></td>
</tr>
<tr>
<td id="tabCC"></td>
</tr>
</table>
<script language="javascript" src="extend.js"></script>
<script language="javascript" src="tabpage.js"></script>
<script language="javascript">
var tab=new TabControl("tabTT","tabCC");
tab.onContextMenu=function(tab,index,x,y){alert(tab.title+index+","+x+","+y)};
tab.add("google","咸阳师范学院内网论坛","http://127.0.0.1/bbs");
tab.selectAdd("jwc","咸阳师范学院教务处","http://127.0.0.1");
//window.setTimeout(function(){tab.remove("dd23")},4000)
</script>
</body>
</html>
浙公网安备 33010602011771号